@etherisc/gif-next 0.0.2-e987ccf-894 → 0.0.2-e9c5694-914
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 +1 -1
 - package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.dbg.json +1 -1
 - package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.json +105 -65
 - package/artifacts/contracts/authorization/AccessManagerCloneable.sol/AccessManagerCloneable.dbg.json +1 -1
 - package/artifacts/contracts/authorization/Authorization.sol/Authorization.dbg.json +1 -1
 - package/artifacts/contracts/authorization/Authorization.sol/Authorization.json +67 -11
 - 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 +60 -32
 - package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.dbg.json +1 -1
 - package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.json +40 -3
 - package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.dbg.json +1 -1
 - package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.json +19 -0
 - package/artifacts/contracts/authorization/ReleaseAccessManager.sol/ReleaseAccessManager.dbg.json +4 -0
 - package/artifacts/contracts/authorization/ReleaseAccessManager.sol/ReleaseAccessManager.json +1196 -0
 - package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.dbg.json +1 -1
 - package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.json +68 -5
 - package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.dbg.json +1 -1
 - package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.json +151 -249
 - package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.dbg.json +1 -1
 - package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.json +82 -22
 - package/artifacts/contracts/distribution/Distribution.sol/Distribution.dbg.json +1 -1
 - package/artifacts/contracts/distribution/Distribution.sol/Distribution.json +91 -213
 - package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.dbg.json +1 -1
 - package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.json +141 -198
 - package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.json +107 -107
 - package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
 - package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.json +78 -66
 - package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.dbg.json +1 -1
 - package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.json +29 -0
 - 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 +1538 -0
 - package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.dbg.json +4 -0
 - package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.json +470 -0
 - package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.dbg.json +4 -0
 - package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.json +2072 -0
 - package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.dbg.json +4 -0
 - package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.json +470 -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 +1471 -0
 - package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.dbg.json +4 -0
 - package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.json +1231 -0
 - package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.dbg.json +4 -0
 - package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.json +1592 -0
 - package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.dbg.json +4 -0
 - package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.json +2095 -0
 - package/artifacts/contracts/instance/BundleSet.sol/BundleSet.dbg.json +1 -1
 - package/artifacts/contracts/instance/BundleSet.sol/BundleSet.json +2 -2
 - package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
 - package/artifacts/contracts/instance/IInstance.sol/IInstance.json +53 -31
 - package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
 - package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +29 -84
 - package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
 - package/artifacts/contracts/instance/Instance.sol/Instance.json +56 -123
 - package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.dbg.json +1 -1
 - package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.json +165 -138
 - package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.dbg.json +1 -1
 - package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.json +57 -97
 - package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
 - package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +310 -83
 - package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
 - package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +77 -242
 - package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +75 -87
 - package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.dbg.json +1 -1
 - package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.json +207 -241
 - 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 +46 -5
 - package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.dbg.json +1 -1
 - package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.json +2 -2
 - package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
 - package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
 - package/artifacts/contracts/instance/module/IComponents.sol/IComponents.dbg.json +1 -1
 - package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
 - package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
 - package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
 - package/artifacts/contracts/mock/Dip.sol/Dip.dbg.json +1 -1
 - package/artifacts/contracts/oracle/BasicOracle.sol/BasicOracle.dbg.json +1 -1
 - package/artifacts/contracts/oracle/BasicOracle.sol/BasicOracle.json +132 -230
 - package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.dbg.json +1 -1
 - package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.json +84 -24
 - 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 +73 -61
 - package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.dbg.json +1 -1
 - package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.json +43 -9
 - package/artifacts/contracts/oracle/Oracle.sol/Oracle.dbg.json +1 -1
 - package/artifacts/contracts/oracle/Oracle.sol/Oracle.json +86 -208
 - package/artifacts/contracts/oracle/OracleService.sol/OracleService.dbg.json +1 -1
 - package/artifacts/contracts/oracle/OracleService.sol/OracleService.json +91 -159
 - package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.json +75 -83
 - package/artifacts/contracts/pool/BasicPool.sol/BasicPool.dbg.json +1 -1
 - package/artifacts/contracts/pool/BasicPool.sol/BasicPool.json +109 -216
 - package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.dbg.json +1 -1
 - package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.json +82 -22
 - package/artifacts/contracts/pool/BundleService.sol/BundleService.dbg.json +1 -1
 - package/artifacts/contracts/pool/BundleService.sol/BundleService.json +178 -187
 - package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.json +117 -105
 - package/artifacts/contracts/pool/IBundleService.sol/IBundleService.dbg.json +1 -1
 - package/artifacts/contracts/pool/IBundleService.sol/IBundleService.json +53 -0
 - package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
 - package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.json +98 -58
 - package/artifacts/contracts/pool/IPoolService.sol/IPoolService.dbg.json +1 -1
 - package/artifacts/contracts/pool/IPoolService.sol/IPoolService.json +200 -125
 - package/artifacts/contracts/pool/Pool.sol/Pool.dbg.json +1 -1
 - package/artifacts/contracts/pool/Pool.sol/Pool.json +109 -203
 - package/artifacts/contracts/pool/PoolService.sol/PoolService.dbg.json +1 -1
 - package/artifacts/contracts/pool/PoolService.sol/PoolService.json +308 -274
 - package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.json +108 -88
 - package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.dbg.json +1 -1
 - package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.json +71 -152
 - package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.json +72 -84
 - package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.dbg.json +1 -1
 - package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.json +140 -221
 - package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.dbg.json +1 -1
 - package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.json +82 -22
 - package/artifacts/contracts/product/ClaimService.sol/ClaimService.dbg.json +1 -1
 - package/artifacts/contracts/product/ClaimService.sol/ClaimService.json +288 -188
 - package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.json +119 -103
 - package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.dbg.json +1 -1
 - package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.json +29 -0
 - package/artifacts/contracts/product/IClaimService.sol/IClaimService.dbg.json +1 -1
 - package/artifacts/contracts/product/IClaimService.sol/IClaimService.json +161 -7
 - package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.dbg.json +1 -1
 - package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.json +141 -11
 - package/artifacts/contracts/product/IPricingService.sol/IPricingService.dbg.json +1 -1
 - package/artifacts/contracts/product/IPricingService.sol/IPricingService.json +80 -51
 - package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.dbg.json +1 -1
 - package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.json +131 -78
 - package/artifacts/contracts/product/IRiskService.sol/IRiskService.dbg.json +4 -0
 - package/artifacts/contracts/product/{IProductService.sol/IProductService.json → IRiskService.sol/IRiskService.json} +31 -2
 - package/artifacts/contracts/product/PolicyService.sol/PolicyService.dbg.json +1 -1
 - package/artifacts/contracts/product/PolicyService.sol/PolicyService.json +258 -195
 - package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.json +114 -98
 - package/artifacts/contracts/product/PricingService.sol/PricingService.dbg.json +1 -1
 - package/artifacts/contracts/product/PricingService.sol/PricingService.json +154 -219
 - package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.json +87 -91
 - package/artifacts/contracts/product/Product.sol/Product.dbg.json +1 -1
 - package/artifacts/contracts/product/Product.sol/Product.json +140 -221
 - package/artifacts/contracts/product/RiskService.sol/RiskService.dbg.json +4 -0
 - package/artifacts/contracts/product/RiskService.sol/RiskService.json +622 -0
 - package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.dbg.json +4 -0
 - package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.json +694 -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 +285 -33
 - package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
 - package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +114 -35
 - 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 +491 -94
 - package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.dbg.json +1 -1
 - package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.json +283 -143
 - package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
 - package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +78 -284
 - package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +67 -75
 - 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 +129 -221
 - package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.dbg.json +1 -1
 - package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.json +66 -8
 - package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
 - package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +2 -2
 - package/artifacts/contracts/shared/Component.sol/Component.dbg.json +1 -1
 - package/artifacts/contracts/shared/Component.sol/Component.json +68 -175
 - package/artifacts/contracts/shared/ComponentService.sol/ComponentService.dbg.json +1 -1
 - package/artifacts/contracts/shared/ComponentService.sol/ComponentService.json +351 -263
 - package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.json +120 -110
 - package/artifacts/contracts/shared/ComponentVerifyingService.sol/ComponentVerifyingService.dbg.json +1 -1
 - package/artifacts/contracts/shared/ComponentVerifyingService.sol/ComponentVerifyingService.json +47 -112
 - package/artifacts/contracts/shared/ContractLib.sol/ContractLib.dbg.json +4 -0
 - package/artifacts/contracts/shared/ContractLib.sol/ContractLib.json +92 -0
 - package/artifacts/contracts/shared/IComponent.sol/IComponent.dbg.json +1 -1
 - package/artifacts/contracts/shared/IComponent.sol/IComponent.json +55 -28
 - package/artifacts/contracts/shared/IComponentService.sol/IComponentService.dbg.json +1 -1
 - package/artifacts/contracts/shared/IComponentService.sol/IComponentService.json +321 -19
 - package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.dbg.json +1 -1
 - package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.json +73 -61
 - package/artifacts/contracts/shared/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
 - package/artifacts/contracts/shared/IKeyValueStore.sol/IKeyValueStore.json +36 -0
 - package/artifacts/contracts/shared/ILifecycle.sol/ILifecycle.dbg.json +1 -1
 - package/artifacts/contracts/shared/ILifecycle.sol/ILifecycle.json +36 -0
 - package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
 - package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +16 -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 +29 -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 +29 -0
 - 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 +86 -208
 - package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
 - package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.json +42 -1
 - 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 +22 -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 +58 -89
 - 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 +47 -112
 - package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
 - package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +2 -2
 - package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.dbg.json +1 -1
 - package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.json +2 -2
 - package/artifacts/contracts/staking/IStaking.sol/IStaking.dbg.json +1 -1
 - package/artifacts/contracts/staking/IStaking.sol/IStaking.json +82 -29
 - package/artifacts/contracts/staking/IStakingService.sol/IStakingService.dbg.json +1 -1
 - package/artifacts/contracts/staking/IStakingService.sol/IStakingService.json +29 -21
 - package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.dbg.json +1 -1
 - package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.json +83 -30
 - package/artifacts/contracts/staking/Staking.sol/Staking.dbg.json +1 -1
 - package/artifacts/contracts/staking/Staking.sol/Staking.json +171 -224
 - package/artifacts/contracts/staking/StakingLifecycle.sol/StakingLifecycle.dbg.json +1 -1
 - package/artifacts/contracts/staking/StakingLifecycle.sol/StakingLifecycle.json +46 -5
 - package/artifacts/contracts/staking/StakingManager.sol/StakingManager.dbg.json +1 -1
 - package/artifacts/contracts/staking/StakingManager.sol/StakingManager.json +102 -87
 - package/artifacts/contracts/staking/StakingReader.sol/StakingReader.dbg.json +1 -1
 - package/artifacts/contracts/staking/StakingReader.sol/StakingReader.json +7 -12
 - package/artifacts/contracts/staking/StakingService.sol/StakingService.dbg.json +1 -1
 - package/artifacts/contracts/staking/StakingService.sol/StakingService.json +71 -165
 - package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.dbg.json +1 -1
 - package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.json +71 -79
 - package/artifacts/contracts/staking/StakingStore.sol/StakingStore.dbg.json +1 -1
 - package/artifacts/contracts/staking/StakingStore.sol/StakingStore.json +144 -103
 - package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.dbg.json +1 -1
 - package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.json +54 -23
 - package/artifacts/contracts/type/AddressSet.sol/LibAddressSet.dbg.json +1 -1
 - package/artifacts/contracts/type/Amount.sol/AmountLib.dbg.json +1 -1
 - package/artifacts/contracts/type/Amount.sol/AmountLib.json +32 -8
 - package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
 - package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.dbg.json +1 -1
 - package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.json +28 -4
 - package/artifacts/contracts/type/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
 - package/artifacts/contracts/type/DistributorType.sol/DistributorTypeLib.json +2 -2
 - package/artifacts/contracts/type/Fee.sol/FeeLib.dbg.json +1 -1
 - package/artifacts/contracts/type/Fee.sol/FeeLib.json +2 -2
 - package/artifacts/contracts/type/Key32.sol/Key32Lib.dbg.json +1 -1
 - package/artifacts/contracts/type/Key32.sol/Key32Lib.json +2 -2
 - package/artifacts/contracts/type/NftId.sol/NftIdLib.dbg.json +1 -1
 - package/artifacts/contracts/type/NftId.sol/NftIdLib.json +2 -2
 - package/artifacts/contracts/type/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
 - package/artifacts/contracts/type/NftIdSet.sol/LibNftIdSet.json +2 -2
 - package/artifacts/contracts/type/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
 - package/artifacts/contracts/type/ObjectType.sol/ObjectTypeLib.json +2 -2
 - package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.dbg.json +1 -1
 - package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.json +19 -19
 - package/artifacts/contracts/type/Referral.sol/ReferralLib.dbg.json +1 -1
 - package/artifacts/contracts/type/Referral.sol/ReferralLib.json +2 -2
 - package/artifacts/contracts/type/RequestId.sol/RequestIdLib.dbg.json +1 -1
 - package/artifacts/contracts/type/RequestId.sol/RequestIdLib.json +2 -2
 - package/artifacts/contracts/type/RiskId.sol/RiskIdLib.dbg.json +1 -1
 - package/artifacts/contracts/type/RiskId.sol/RiskIdLib.json +60 -4
 - package/artifacts/contracts/type/RoleId.sol/RoleIdLib.dbg.json +1 -1
 - package/artifacts/contracts/type/RoleId.sol/RoleIdLib.json +2 -2
 - package/artifacts/contracts/type/Seconds.sol/SecondsLib.dbg.json +1 -1
 - package/artifacts/contracts/type/Seconds.sol/SecondsLib.json +26 -2
 - package/artifacts/contracts/type/Selector.sol/SelectorLib.dbg.json +1 -1
 - package/artifacts/contracts/type/Selector.sol/SelectorSetLib.dbg.json +1 -1
 - package/artifacts/contracts/type/StateId.sol/StateIdLib.dbg.json +1 -1
 - package/artifacts/contracts/type/StateId.sol/StateIdLib.json +15 -2
 - package/artifacts/contracts/type/String.sol/StrLib.dbg.json +1 -1
 - package/artifacts/contracts/type/Timestamp.sol/TimestampLib.dbg.json +1 -1
 - package/artifacts/contracts/type/Timestamp.sol/TimestampLib.json +2 -2
 - package/artifacts/contracts/type/UFixed.sol/MathLib.dbg.json +1 -1
 - package/artifacts/contracts/type/UFixed.sol/MathLib.json +2 -2
 - package/artifacts/contracts/type/UFixed.sol/UFixedLib.dbg.json +1 -1
 - package/artifacts/contracts/type/UFixed.sol/UFixedLib.json +15 -2
 - package/artifacts/contracts/type/Version.sol/VersionLib.dbg.json +1 -1
 - package/artifacts/contracts/type/Version.sol/VersionPartLib.dbg.json +1 -1
 - package/artifacts/contracts/upgradeability/IVersionable.sol/IVersionable.dbg.json +1 -1
 - package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.dbg.json +1 -1
 - package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.json +55 -70
 - package/artifacts/contracts/upgradeability/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
 - package/artifacts/contracts/upgradeability/Versionable.sol/Versionable.dbg.json +1 -1
 - package/contracts/authorization/AccessAdmin.sol +64 -59
 - package/contracts/authorization/Authorization.sol +111 -39
 - package/contracts/authorization/IAccess.sol +1 -0
 - package/contracts/authorization/IAccessAdmin.sol +4 -3
 - package/contracts/authorization/IAuthorization.sol +13 -7
 - package/contracts/authorization/IServiceAuthorization.sol +3 -1
 - package/contracts/authorization/ReleaseAccessManager.sol +38 -0
 - package/contracts/authorization/ServiceAuthorization.sol +26 -10
 - package/contracts/distribution/BasicDistribution.sol +2 -1
 - package/contracts/distribution/Distribution.sol +7 -17
 - package/contracts/distribution/DistributionService.sol +63 -44
 - package/contracts/distribution/DistributionServiceManager.sol +6 -6
 - package/contracts/distribution/IDistributionComponent.sol +1 -1
 - package/contracts/examples/fire/DamageLevel.sol +59 -0
 - package/contracts/examples/fire/FirePool.sol +73 -0
 - package/contracts/examples/fire/FirePoolAuthorization.sol +34 -0
 - package/contracts/examples/fire/FireProduct.sol +415 -0
 - package/contracts/examples/fire/FireProductAuthorization.sol +44 -0
 - package/contracts/examples/fire/FireUSD.sol +26 -0
 - package/contracts/examples/unpermissioned/SimpleDistribution.sol +50 -0
 - package/contracts/examples/unpermissioned/SimpleOracle.sol +137 -0
 - package/contracts/examples/unpermissioned/SimplePool.sol +76 -0
 - package/contracts/examples/unpermissioned/SimpleProduct.sol +351 -0
 - package/contracts/instance/IInstance.sol +10 -30
 - package/contracts/instance/IInstanceService.sol +0 -20
 - package/contracts/instance/Instance.sol +29 -51
 - package/contracts/instance/InstanceAdmin.sol +23 -31
 - package/contracts/instance/InstanceAuthorizationV3.sol +10 -19
 - package/contracts/instance/InstanceReader.sol +91 -18
 - package/contracts/instance/InstanceService.sol +23 -77
 - package/contracts/instance/InstanceServiceManager.sol +6 -7
 - package/contracts/instance/InstanceStore.sol +0 -4
 - package/contracts/instance/base/ObjectLifecycle.sol +2 -1
 - package/contracts/instance/module/IComponents.sol +10 -5
 - package/contracts/instance/module/IPolicy.sol +7 -7
 - package/contracts/oracle/BasicOracle.sol +0 -1
 - package/contracts/oracle/IOracleService.sol +2 -1
 - package/contracts/oracle/Oracle.sol +6 -16
 - package/contracts/oracle/OracleService.sol +47 -34
 - package/contracts/oracle/OracleServiceManager.sol +6 -6
 - package/contracts/pool/BasicPool.sol +14 -26
 - package/contracts/pool/BasicPoolAuthorization.sol +0 -1
 - package/contracts/pool/BundleService.sol +83 -28
 - package/contracts/pool/BundleServiceManager.sol +6 -6
 - package/contracts/pool/IBundleService.sol +9 -0
 - package/contracts/pool/IPoolComponent.sol +18 -8
 - package/contracts/pool/IPoolService.sol +21 -14
 - package/contracts/pool/Pool.sol +48 -39
 - package/contracts/pool/PoolService.sol +121 -86
 - package/contracts/pool/PoolServiceManager.sol +4 -4
 - package/contracts/product/ApplicationService.sol +20 -10
 - package/contracts/product/ApplicationServiceManager.sol +4 -4
 - package/contracts/product/BasicProduct.sol +7 -6
 - package/contracts/product/BasicProductAuthorization.sol +0 -1
 - package/contracts/product/ClaimService.sol +310 -114
 - package/contracts/product/ClaimServiceManager.sol +4 -4
 - package/contracts/product/IClaimService.sol +30 -7
 - package/contracts/product/IPolicyService.sol +12 -5
 - package/contracts/product/IPricingService.sol +9 -9
 - package/contracts/product/IProductComponent.sol +23 -3
 - package/contracts/product/{IProductService.sol → IRiskService.sol} +1 -2
 - package/contracts/product/PolicyService.sol +168 -53
 - package/contracts/product/PolicyServiceManager.sol +4 -4
 - package/contracts/product/PricingService.sol +12 -13
 - package/contracts/product/PricingServiceManager.sol +3 -3
 - package/contracts/product/Product.sol +104 -55
 - package/contracts/product/{ProductService.sol → RiskService.sol} +7 -10
 - package/contracts/product/RiskServiceManager.sol +39 -0
 - package/contracts/registry/ChainNft.sol +68 -38
 - package/contracts/registry/IRegistry.sol +54 -17
 - package/contracts/registry/IRegistryService.sol +5 -12
 - package/contracts/registry/ITransferInterceptor.sol +1 -2
 - package/contracts/registry/Registry.sol +341 -200
 - package/contracts/registry/RegistryAdmin.sol +124 -50
 - package/contracts/registry/RegistryService.sol +35 -46
 - package/contracts/registry/RegistryServiceManager.sol +2 -2
 - package/contracts/registry/ReleaseLifecycle.sol +6 -3
 - package/contracts/registry/ReleaseRegistry.sol +203 -187
 - package/contracts/registry/ServiceAuthorizationV3.sol +14 -19
 - package/contracts/shared/Component.sol +29 -32
 - package/contracts/shared/ComponentService.sol +241 -137
 - package/contracts/shared/ComponentServiceManager.sol +8 -5
 - package/contracts/shared/ComponentVerifyingService.sol +22 -13
 - package/contracts/shared/ContractLib.sol +38 -0
 - package/contracts/shared/IComponent.sol +6 -2
 - package/contracts/shared/IComponentService.sol +25 -13
 - package/contracts/shared/IInstanceLinkedComponent.sol +2 -17
 - package/contracts/shared/ILifecycle.sol +3 -1
 - package/contracts/shared/INftOwnable.sol +2 -0
 - package/contracts/shared/IPolicyHolder.sol +12 -22
 - package/contracts/shared/IRegisterable.sol +11 -0
 - package/contracts/shared/InitializableERC165.sol +2 -2
 - package/contracts/shared/InstanceLinkedComponent.sol +71 -30
 - package/contracts/shared/KeyValueStore.sol +1 -1
 - package/contracts/shared/Lifecycle.sol +15 -4
 - package/contracts/shared/NftOwnable.sol +26 -6
 - package/contracts/shared/PolicyHolder.sol +15 -52
 - package/contracts/shared/Registerable.sol +19 -9
 - package/contracts/shared/RegistryLinked.sol +3 -2
 - package/contracts/shared/Service.sol +20 -18
 - package/contracts/staking/IStaking.sol +2 -1
 - package/contracts/staking/IStakingService.sol +0 -3
 - package/contracts/staking/StakeManagerLib.sol +18 -0
 - package/contracts/staking/Staking.sol +8 -8
 - package/contracts/staking/StakingManager.sol +8 -6
 - package/contracts/staking/StakingReader.sol +12 -5
 - package/contracts/staking/StakingService.sol +17 -17
 - package/contracts/staking/StakingServiceManager.sol +2 -2
 - package/contracts/staking/TargetManagerLib.sol +7 -3
 - package/contracts/type/Amount.sol +15 -0
 - package/contracts/type/ClaimId.sol +6 -1
 - package/contracts/type/NftId.sol +1 -0
 - package/contracts/type/ObjectType.sol +1 -0
 - package/contracts/type/PayoutId.sol +10 -10
 - package/contracts/type/RiskId.sol +15 -1
 - package/contracts/type/RoleId.sol +0 -12
 - package/contracts/type/Seconds.sol +8 -0
 - package/contracts/type/StateId.sol +15 -1
 - package/contracts/type/UFixed.sol +4 -0
 - package/contracts/upgradeability/ProxyManager.sol +68 -34
 - package/contracts/upgradeability/Versionable.sol +2 -2
 - package/package.json +2 -1
 - 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/product/IProductService.sol/IProductService.dbg.json +0 -4
 - package/artifacts/contracts/product/ProductService.sol/ProductService.dbg.json +0 -4
 - package/artifacts/contracts/product/ProductService.sol/ProductService.json +0 -708
 - package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.dbg.json +0 -4
 - package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.json +0 -702
 - package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.dbg.json +0 -4
 - package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.json +0 -39
 - package/contracts/authorization/IModuleAuthorization.sol +0 -21
 - package/contracts/authorization/ModuleAuthorization.sol +0 -78
 - package/contracts/product/ProductServiceManager.sol +0 -39
 - package/contracts/shared/InitializableCustom.sol +0 -177
 
| 
         @@ -3,12 +3,12 @@ pragma solidity ^0.8.20; 
     | 
|
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
         
     | 
| 
       5 
5 
     | 
    
         
             
            import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            import { 
     | 
| 
      
 6 
     | 
    
         
            +
            import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";
         
     | 
| 
      
 7 
     | 
    
         
            +
            import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
            import {NftId, NftIdLib} from "../type/NftId.sol";
         
     | 
| 
       10 
     | 
    
         
            -
            import {VersionPart} from "../type/Version.sol";
         
     | 
| 
       11 
     | 
    
         
            -
            import {ObjectType, PROTOCOL, REGISTRY, SERVICE, INSTANCE, STAKE, STAKING, PRODUCT, DISTRIBUTION, DISTRIBUTOR, ORACLE, POOL, POLICY, BUNDLE} from "../type/ObjectType.sol";
         
     | 
| 
      
 10 
     | 
    
         
            +
            import {VersionPart, VersionPartLib} from "../type/Version.sol";
         
     | 
| 
      
 11 
     | 
    
         
            +
            import {ObjectType, ObjectTypeLib, PROTOCOL, REGISTRY, SERVICE, INSTANCE, STAKE, STAKING, PRODUCT, DISTRIBUTION, DISTRIBUTOR, ORACLE, POOL, POLICY, BUNDLE} from "../type/ObjectType.sol";
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
            import {ChainNft} from "./ChainNft.sol";
         
     | 
| 
       14 
14 
     | 
    
         
             
            import {IRegistry} from "./IRegistry.sol";
         
     | 
| 
         @@ -17,30 +17,60 @@ import {ReleaseRegistry} from "./ReleaseRegistry.sol"; 
     | 
|
| 
       17 
17 
     | 
    
         
             
            import {TokenRegistry} from "./TokenRegistry.sol";
         
     | 
| 
       18 
18 
     | 
    
         
             
            import {RegistryAdmin} from "./RegistryAdmin.sol";
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
      
 20 
     | 
    
         
            +
            /// @dev IMPORTANT
         
     | 
| 
       21 
21 
     | 
    
         
             
            // Each NFT minted by registry is accosiated with:
         
     | 
| 
       22 
22 
     | 
    
         
             
            // 1) NFT owner
         
     | 
| 
       23 
23 
     | 
    
         
             
            // 2) registred contract OR object stored in registered (parent) contract
         
     | 
| 
       24 
     | 
    
         
            -
            //  
     | 
| 
       25 
     | 
    
         
            -
            // 1) IService address by  
     | 
| 
       26 
     | 
    
         
            -
            // 2)  
     | 
| 
       27 
     | 
    
         
            -
            // 3)  
     | 
| 
       28 
     | 
    
         
            -
            // 4)  
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
            // Five registration flows:
         
     | 
| 
      
 25 
     | 
    
         
            +
            // 1) registerService() -> registers IService address by ReleaseRegistry (ReleaseRegistry is set at deployment time)
         
     | 
| 
      
 26 
     | 
    
         
            +
            // 2) register() -> registers IRegisterable address by IService (INSTANCE, PRODUCT, POOL, DISTRIBUTION, ORACLE)
         
     | 
| 
      
 27 
     | 
    
         
            +
            // 3)            -> registers object by IService (POLICY, BUNDLE, STAKE)
         
     | 
| 
      
 28 
     | 
    
         
            +
            // 4) registerWithCustomType() -> registers IRegisterable address with custom type by IService
         
     | 
| 
      
 29 
     | 
    
         
            +
            // 5) registerRegistry() -> registers IRegistry address (from different chain) by GifAdmin. Works ONLY on mainnet. 
         
     | 
| 
      
 30 
     | 
    
         
            +
            //                          Note: getters by address MUST not be used with this address (will return 0 or data related to different object or even revert)
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            /// @dev Chain Registry contract implementing IRegistry.
         
     | 
| 
      
 33 
     | 
    
         
            +
            /// IRegistry for method details.
         
     | 
| 
       32 
34 
     | 
    
         
             
            contract Registry is
         
     | 
| 
       33 
     | 
    
         
            -
                 
     | 
| 
      
 35 
     | 
    
         
            +
                Initializable,
         
     | 
| 
      
 36 
     | 
    
         
            +
                AccessManaged,
         
     | 
| 
       34 
37 
     | 
    
         
             
                IRegistry
         
     | 
| 
       35 
38 
     | 
    
         
             
            {
         
     | 
| 
       36 
     | 
    
         
            -
                 
     | 
| 
      
 39 
     | 
    
         
            +
                /// @dev Protocol NFT ID
         
     | 
| 
      
 40 
     | 
    
         
            +
                NftId public immutable PROTOCOL_NFT_ID;
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                /// @dev Gobal registry NFT ID
         
     | 
| 
      
 43 
     | 
    
         
            +
                NftId public immutable GLOBAL_REGISTRY_NFT_ID;
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                /// @dev Gobal registry address on mainnet.
         
     | 
| 
      
 46 
     | 
    
         
            +
                address public immutable GLOBAL_REGISTRY_ADDRESS;
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                /// @dev Registry NFT ID
         
     | 
| 
      
 49 
     | 
    
         
            +
                NftId public immutable REGISTRY_NFT_ID;
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                /// @dev Deployer address that authorizes the initializer of this contract.
         
     | 
| 
      
 52 
     | 
    
         
            +
                address public immutable DEPLOYER;
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                /// @dev Registry admin contract for this registry.
         
     | 
| 
      
 55 
     | 
    
         
            +
                RegistryAdmin public immutable ADMIN;
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                /// @dev Chain NFT contract that keeps track of the ownership of all registered objects.
         
     | 
| 
      
 58 
     | 
    
         
            +
                ChainNft public immutable CHAIN_NFT;
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                address public constant NFT_LOCK_ADDRESS = address(0x1);
         
     | 
| 
       37 
61 
     | 
    
         
             
                uint256 public constant REGISTRY_TOKEN_SEQUENCE_ID = 2;
         
     | 
| 
       38 
62 
     | 
    
         
             
                uint256 public constant STAKING_TOKEN_SEQUENCE_ID = 3;
         
     | 
| 
       39 
63 
     | 
    
         
             
                string public constant EMPTY_URI = "";
         
     | 
| 
       40 
64 
     | 
    
         | 
| 
      
 65 
     | 
    
         
            +
                /// @dev keep track of different registries on different chains
         
     | 
| 
      
 66 
     | 
    
         
            +
                mapping(uint256 chainId => NftId registryNftId) private _registryNftIdByChainId;
         
     | 
| 
      
 67 
     | 
    
         
            +
                uint256[] private _chainId;
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                /// @dev keep track of object info and address reverse lookup
         
     | 
| 
       41 
70 
     | 
    
         
             
                mapping(NftId nftId => ObjectInfo info) private _info;
         
     | 
| 
       42 
71 
     | 
    
         
             
                mapping(address object => NftId nftId) private _nftIdByAddress;
         
     | 
| 
       43 
72 
     | 
    
         | 
| 
      
 73 
     | 
    
         
            +
                /// @dev keep track of service addresses by version and domain
         
     | 
| 
       44 
74 
     | 
    
         
             
                mapping(VersionPart version => mapping(ObjectType serviceDomain => address)) private _service;
         
     | 
| 
       45 
75 
     | 
    
         | 
| 
       46 
76 
     | 
    
         
             
                mapping(ObjectType objectType => bool) private _coreTypes;
         
     | 
| 
         @@ -51,57 +81,46 @@ contract Registry is 
     | 
|
| 
       51 
81 
     | 
    
         
             
                mapping(ObjectType objectType => mapping(
         
     | 
| 
       52 
82 
     | 
    
         
             
                        ObjectType parentType => bool)) private _coreObjectCombinations;
         
     | 
| 
       53 
83 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
                 
     | 
| 
       55 
     | 
    
         
            -
                ChainNft public immutable _chainNft;
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
                NftId public immutable _protocolNftId;
         
     | 
| 
       58 
     | 
    
         
            -
                NftId public immutable _registryNftId;
         
     | 
| 
       59 
     | 
    
         
            -
                NftId public _stakingNftId;
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                address public _tokenRegistryAddress;
         
     | 
| 
       62 
     | 
    
         
            -
                address public _stakingAddress;
         
     | 
| 
       63 
     | 
    
         
            -
                ReleaseRegistry public _releaseRegistry;
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
                // TODO 
         
     | 
| 
       66 
     | 
    
         
            -
                // 1). Registry and ReleaseRegistry must be treated as whole single entity. 
         
     | 
| 
       67 
     | 
    
         
            -
                //     But current limitations of EVM does not allow it -> require it to be splitted
         
     | 
| 
       68 
     | 
    
         
            -
                // 2). Keep onlyReleaseRegistry modifier
         
     | 
| 
       69 
     | 
    
         
            -
                // 3). Delete onlyRegistryService in favor of restricted
         
     | 
| 
       70 
     | 
    
         
            -
                // 4). (For GlobalRegistry ONLY) make registerChainRegistry() restricted to GIF_ADMIN_ROLE
         
     | 
| 
       71 
     | 
    
         
            -
                modifier onlyRegistryService() {
         
     | 
| 
       72 
     | 
    
         
            -
                    if(!_releaseRegistry.isActiveRegistryService(msg.sender)) {
         
     | 
| 
       73 
     | 
    
         
            -
                        revert ErrorRegistryCallerNotRegistryService();
         
     | 
| 
       74 
     | 
    
         
            -
                    }
         
     | 
| 
       75 
     | 
    
         
            -
                    _;
         
     | 
| 
       76 
     | 
    
         
            -
                }
         
     | 
| 
      
 84 
     | 
    
         
            +
                NftId private _stakingNftId;
         
     | 
| 
       77 
85 
     | 
    
         | 
| 
      
 86 
     | 
    
         
            +
                ReleaseRegistry private _releaseRegistry;
         
     | 
| 
      
 87 
     | 
    
         
            +
                address private _tokenRegistryAddress;
         
     | 
| 
      
 88 
     | 
    
         
            +
                address private _stakingAddress;
         
     | 
| 
       78 
89 
     | 
    
         | 
| 
       79 
     | 
    
         
            -
                modifier  
     | 
| 
       80 
     | 
    
         
            -
                    if(msg.sender !=  
     | 
| 
       81 
     | 
    
         
            -
                        revert  
     | 
| 
      
 90 
     | 
    
         
            +
                modifier onlyDeployer() {
         
     | 
| 
      
 91 
     | 
    
         
            +
                    if (msg.sender != DEPLOYER) {
         
     | 
| 
      
 92 
     | 
    
         
            +
                        revert ErrorRegistryCallerNotDeployer();
         
     | 
| 
       82 
93 
     | 
    
         
             
                    }
         
     | 
| 
       83 
94 
     | 
    
         
             
                    _;
         
     | 
| 
       84 
95 
     | 
    
         
             
                }
         
     | 
| 
       85 
96 
     | 
    
         | 
| 
      
 97 
     | 
    
         
            +
                // TODO when create2 strategy is added to ignition:
         
     | 
| 
      
 98 
     | 
    
         
            +
                // 1. move globalRegistry arg out from constructor into initialize()
         
     | 
| 
      
 99 
     | 
    
         
            +
                // 2. add testRegistry_deployChainRegistryAtGlobalRegistryAddress
         
     | 
| 
       86 
100 
     | 
    
         
             
                /// @dev Creates the registry contract and populates it with the protocol and registry objects.
         
     | 
| 
       87 
101 
     | 
    
         
             
                /// Internally deploys the ChainNft contract.
         
     | 
| 
       88 
     | 
    
         
            -
                constructor(RegistryAdmin admin) 
     | 
| 
       89 
     | 
    
         
            -
                     
     | 
| 
      
 102 
     | 
    
         
            +
                constructor(RegistryAdmin admin, address globalRegistry)
         
     | 
| 
      
 103 
     | 
    
         
            +
                    AccessManaged(admin.authority())
         
     | 
| 
       90 
104 
     | 
    
         
             
                {
         
     | 
| 
       91 
     | 
    
         
            -
                     
     | 
| 
      
 105 
     | 
    
         
            +
                    DEPLOYER = msg.sender;
         
     | 
| 
      
 106 
     | 
    
         
            +
                    ADMIN = admin;
         
     | 
| 
      
 107 
     | 
    
         
            +
                    GLOBAL_REGISTRY_ADDRESS = _getGlobalRegistryAddress(globalRegistry);
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
       92 
109 
     | 
    
         
             
                    // deploy NFT 
         
     | 
| 
       93 
     | 
    
         
            -
                     
     | 
| 
      
 110 
     | 
    
         
            +
                    CHAIN_NFT = new ChainNft(address(this));
         
     | 
| 
      
 111 
     | 
    
         
            +
                    GLOBAL_REGISTRY_NFT_ID = NftIdLib.toNftId(
         
     | 
| 
      
 112 
     | 
    
         
            +
                        CHAIN_NFT.GLOBAL_REGISTRY_ID());
         
     | 
| 
       94 
113 
     | 
    
         | 
| 
       95 
114 
     | 
    
         
             
                    // initial registry setup
         
     | 
| 
       96 
     | 
    
         
            -
                     
     | 
| 
       97 
     | 
    
         
            -
                     
     | 
| 
      
 115 
     | 
    
         
            +
                    PROTOCOL_NFT_ID = _registerProtocol();
         
     | 
| 
      
 116 
     | 
    
         
            +
                    REGISTRY_NFT_ID = _registerRegistry();
         
     | 
| 
       98 
117 
     | 
    
         | 
| 
       99 
118 
     | 
    
         
             
                    // set object types and object parent relations
         
     | 
| 
       100 
119 
     | 
    
         
             
                    _setupValidCoreTypesAndCombinations();
         
     | 
| 
       101 
120 
     | 
    
         
             
                }
         
     | 
| 
       102 
121 
     | 
    
         | 
| 
       103 
122 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
                /// @dev Wires release registry and  
     | 
| 
      
 123 
     | 
    
         
            +
                /// @dev Wires release registry, token registry and staking contract to this registry.
         
     | 
| 
       105 
124 
     | 
    
         
             
                /// MUST be called by release registry.
         
     | 
| 
       106 
125 
     | 
    
         
             
                function initialize(
         
     | 
| 
       107 
126 
     | 
    
         
             
                    address releaseRegistry,
         
     | 
| 
         @@ -110,40 +129,64 @@ contract Registry is 
     | 
|
| 
       110 
129 
     | 
    
         
             
                )
         
     | 
| 
       111 
130 
     | 
    
         
             
                    external
         
     | 
| 
       112 
131 
     | 
    
         
             
                    initializer()
         
     | 
| 
      
 132 
     | 
    
         
            +
                    onlyDeployer()
         
     | 
| 
       113 
133 
     | 
    
         
             
                {
         
     | 
| 
      
 134 
     | 
    
         
            +
                    // store links to supporting contracts
         
     | 
| 
       114 
135 
     | 
    
         
             
                    _releaseRegistry = ReleaseRegistry(releaseRegistry);
         
     | 
| 
       115 
136 
     | 
    
         
             
                    _tokenRegistryAddress = tokenRegistry;
         
     | 
| 
       116 
137 
     | 
    
         
             
                    _stakingAddress = staking;
         
     | 
| 
       117 
138 
     | 
    
         | 
| 
      
 139 
     | 
    
         
            +
                    // register staking contract
         
     | 
| 
       118 
140 
     | 
    
         
             
                    _stakingNftId = _registerStaking();
         
     | 
| 
       119 
141 
     | 
    
         
             
                }
         
     | 
| 
       120 
142 
     | 
    
         | 
| 
       121 
143 
     | 
    
         
             
                /// @inheritdoc IRegistry
         
     | 
| 
       122 
     | 
    
         
            -
                function  
     | 
| 
      
 144 
     | 
    
         
            +
                function registerRegistry(
         
     | 
| 
      
 145 
     | 
    
         
            +
                    NftId nftId,
         
     | 
| 
      
 146 
     | 
    
         
            +
                    uint256 chainId, 
         
     | 
| 
      
 147 
     | 
    
         
            +
                    address registryAddress
         
     | 
| 
      
 148 
     | 
    
         
            +
                )
         
     | 
| 
       123 
149 
     | 
    
         
             
                    external
         
     | 
| 
       124 
     | 
    
         
            -
                     
     | 
| 
       125 
     | 
    
         
            -
                    returns(NftId nftId)
         
     | 
| 
      
 150 
     | 
    
         
            +
                    restricted()
         
     | 
| 
       126 
151 
     | 
    
         
             
                {
         
     | 
| 
       127 
     | 
    
         
            -
                     
     | 
| 
       128 
     | 
    
         
            -
                     
     | 
| 
      
 152 
     | 
    
         
            +
                    // registration of chain registries only allowed on mainnet
         
     | 
| 
      
 153 
     | 
    
         
            +
                    if (block.chainid != 1) {
         
     | 
| 
      
 154 
     | 
    
         
            +
                        revert ErrorRegistryNotOnMainnet(block.chainid);
         
     | 
| 
      
 155 
     | 
    
         
            +
                    }
         
     | 
| 
       129 
156 
     | 
    
         | 
| 
       130 
     | 
    
         
            -
                    //  
     | 
| 
       131 
     | 
    
         
            -
                    if( 
     | 
| 
       132 
     | 
    
         
            -
                         
     | 
| 
       133 
     | 
    
         
            -
                            revert ErrorRegistryTypesCombinationInvalid(objectType, parentType);
         
     | 
| 
       134 
     | 
    
         
            -
                        }
         
     | 
| 
      
 157 
     | 
    
         
            +
                    // registry chain id is not zero
         
     | 
| 
      
 158 
     | 
    
         
            +
                    if(chainId == 0) {
         
     | 
| 
      
 159 
     | 
    
         
            +
                        revert ErrorRegistryChainRegistryChainIdZero(nftId);
         
     | 
| 
       135 
160 
     | 
    
         
             
                    }
         
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
     | 
    
         
            -
                     
     | 
| 
       138 
     | 
    
         
            -
             
     | 
| 
       139 
     | 
    
         
            -
             
     | 
| 
       140 
     | 
    
         
            -
                        }
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
                    // registry address is not zero
         
     | 
| 
      
 163 
     | 
    
         
            +
                    if (registryAddress == address(0)) {
         
     | 
| 
      
 164 
     | 
    
         
            +
                        revert ErrorRegistryChainRegistryAddressZero(nftId, chainId);
         
     | 
| 
       141 
165 
     | 
    
         
             
                    }
         
     | 
| 
       142 
166 
     | 
    
         | 
| 
       143 
     | 
    
         
            -
                     
     | 
| 
       144 
     | 
    
         
            -
             
     | 
| 
      
 167 
     | 
    
         
            +
                    // registry nft id matches registry chain id
         
     | 
| 
      
 168 
     | 
    
         
            +
                    uint256 expectedRegistryId = CHAIN_NFT.calculateTokenId(REGISTRY_TOKEN_SEQUENCE_ID, chainId);
         
     | 
| 
      
 169 
     | 
    
         
            +
                    if (nftId != NftIdLib.toNftId(expectedRegistryId)) {
         
     | 
| 
      
 170 
     | 
    
         
            +
                        revert ErrorRegistryChainRegistryNftIdInvalid(nftId, chainId);
         
     | 
| 
      
 171 
     | 
    
         
            +
                    }
         
     | 
| 
       145 
172 
     | 
    
         | 
| 
      
 173 
     | 
    
         
            +
                    emit LogChainRegistryRegistration(nftId, chainId, registryAddress);
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
      
 175 
     | 
    
         
            +
                    _registerRegistryForNft(
         
     | 
| 
      
 176 
     | 
    
         
            +
                        chainId,
         
     | 
| 
      
 177 
     | 
    
         
            +
                        ObjectInfo({
         
     | 
| 
      
 178 
     | 
    
         
            +
                            nftId: nftId,
         
     | 
| 
      
 179 
     | 
    
         
            +
                            parentNftId: REGISTRY_NFT_ID,
         
     | 
| 
      
 180 
     | 
    
         
            +
                            objectType: REGISTRY(),
         
     | 
| 
      
 181 
     | 
    
         
            +
                            isInterceptor: false,
         
     | 
| 
      
 182 
     | 
    
         
            +
                            objectAddress: registryAddress,
         
     | 
| 
      
 183 
     | 
    
         
            +
                            initialOwner: NFT_LOCK_ADDRESS,
         
     | 
| 
      
 184 
     | 
    
         
            +
                            data: ""  
         
     | 
| 
      
 185 
     | 
    
         
            +
                        }),
         
     | 
| 
      
 186 
     | 
    
         
            +
                        false); // do not update address lookup for objects on a different chain
         
     | 
| 
      
 187 
     | 
    
         
            +
                }
         
     | 
| 
       146 
188 
     | 
    
         | 
| 
      
 189 
     | 
    
         
            +
                // TODO limit service owner to registry admin?
         
     | 
| 
       147 
190 
     | 
    
         
             
                /// @inheritdoc IRegistry
         
     | 
| 
       148 
191 
     | 
    
         
             
                function registerService(
         
     | 
| 
       149 
192 
     | 
    
         
             
                    ObjectInfo memory info, 
         
     | 
| 
         @@ -151,51 +194,81 @@ contract Registry is 
     | 
|
| 
       151 
194 
     | 
    
         
             
                    ObjectType domain
         
     | 
| 
       152 
195 
     | 
    
         
             
                )
         
     | 
| 
       153 
196 
     | 
    
         
             
                    external
         
     | 
| 
       154 
     | 
    
         
            -
                     
     | 
| 
      
 197 
     | 
    
         
            +
                    restricted()
         
     | 
| 
       155 
198 
     | 
    
         
             
                    returns(NftId nftId)
         
     | 
| 
       156 
199 
     | 
    
         
             
                {
         
     | 
| 
       157 
     | 
    
         
            -
                    //  
     | 
| 
      
 200 
     | 
    
         
            +
                    // service address is defined
         
     | 
| 
       158 
201 
     | 
    
         
             
                    address service = info.objectAddress;
         
     | 
| 
       159 
202 
     | 
    
         
             
                    if(service == address(0)) {
         
     | 
| 
       160 
203 
     | 
    
         
             
                        revert ErrorRegistryServiceAddressZero();
         
     | 
| 
       161 
204 
     | 
    
         
             
                    }
         
     | 
| 
       162 
205 
     | 
    
         | 
| 
       163 
     | 
    
         
            -
                    //  
     | 
| 
      
 206 
     | 
    
         
            +
                    // version is defined
         
     | 
| 
       164 
207 
     | 
    
         
             
                    if(version.eqz()) {
         
     | 
| 
       165 
     | 
    
         
            -
                        revert ErrorRegistryServiceVersionZero();
         
     | 
| 
      
 208 
     | 
    
         
            +
                        revert ErrorRegistryServiceVersionZero(service);
         
     | 
| 
       166 
209 
     | 
    
         
             
                    }
         
     | 
| 
       167 
     | 
    
         
            -
             
     | 
| 
       168 
     | 
    
         
            -
                    // check domain is defined
         
     | 
| 
      
 210 
     | 
    
         
            +
                    // service domain is defined
         
     | 
| 
       169 
211 
     | 
    
         
             
                    if(domain.eqz()) {
         
     | 
| 
       170 
     | 
    
         
            -
                        revert  
     | 
| 
       171 
     | 
    
         
            -
                    }
         
     | 
| 
       172 
     | 
    
         
            -
             
     | 
| 
       173 
     | 
    
         
            -
                    // check contract has not already been registered
         
     | 
| 
       174 
     | 
    
         
            -
                    if(_service[version][domain] != address(0)) {
         
     | 
| 
       175 
     | 
    
         
            -
                        revert ErrorRegistryDomainAlreadyRegistered(service, version, domain);
         
     | 
| 
      
 212 
     | 
    
         
            +
                        revert ErrorRegistryServiceDomainZero(service, version);
         
     | 
| 
       176 
213 
     | 
    
         
             
                    }
         
     | 
| 
       177 
214 
     | 
    
         | 
| 
       178 
     | 
    
         
            -
                    //  
     | 
| 
      
 215 
     | 
    
         
            +
                    // service has proper type
         
     | 
| 
       179 
216 
     | 
    
         
             
                    if(info.objectType != SERVICE()) {
         
     | 
| 
       180 
217 
     | 
    
         
             
                        revert ErrorRegistryNotService(service, info.objectType);
         
     | 
| 
       181 
218 
     | 
    
         
             
                    }
         
     | 
| 
       182 
219 
     | 
    
         | 
| 
       183 
     | 
    
         
            -
                    //  
     | 
| 
       184 
     | 
    
         
            -
                    if(info.parentNftId !=  
     | 
| 
       185 
     | 
    
         
            -
                        revert ErrorRegistryServiceParentNotRegistry(info.parentNftId);
         
     | 
| 
       186 
     | 
    
         
            -
                    } 
     | 
| 
      
 220 
     | 
    
         
            +
                    // service parent has registry type
         
     | 
| 
      
 221 
     | 
    
         
            +
                    if(info.parentNftId != REGISTRY_NFT_ID) {
         
     | 
| 
      
 222 
     | 
    
         
            +
                        revert ErrorRegistryServiceParentNotRegistry(service, version, info.parentNftId);
         
     | 
| 
      
 223 
     | 
    
         
            +
                    }
         
     | 
| 
      
 224 
     | 
    
         
            +
             
     | 
| 
      
 225 
     | 
    
         
            +
                    // service has not already been registered
         
     | 
| 
      
 226 
     | 
    
         
            +
                    if(_service[version][domain] != address(0)) {
         
     | 
| 
      
 227 
     | 
    
         
            +
                        revert ErrorRegistryServiceDomainAlreadyRegistered(service, version, domain);
         
     | 
| 
      
 228 
     | 
    
         
            +
                    }
         
     | 
| 
       187 
229 
     | 
    
         | 
| 
       188 
230 
     | 
    
         
             
                    _service[version][domain] = service;
         
     | 
| 
       189 
     | 
    
         
            -
                    nftId = _register(info);
         
     | 
| 
       190 
231 
     | 
    
         | 
| 
       191 
232 
     | 
    
         
             
                    emit LogServiceRegistration(version, domain);
         
     | 
| 
      
 233 
     | 
    
         
            +
             
     | 
| 
      
 234 
     | 
    
         
            +
                    nftId = _register(info);
         
     | 
| 
      
 235 
     | 
    
         
            +
                }
         
     | 
| 
      
 236 
     | 
    
         
            +
             
     | 
| 
      
 237 
     | 
    
         
            +
             
     | 
| 
      
 238 
     | 
    
         
            +
                /// @inheritdoc IRegistry
         
     | 
| 
      
 239 
     | 
    
         
            +
                function register(ObjectInfo memory info)
         
     | 
| 
      
 240 
     | 
    
         
            +
                    external
         
     | 
| 
      
 241 
     | 
    
         
            +
                    restricted()
         
     | 
| 
      
 242 
     | 
    
         
            +
                    returns(NftId nftId)
         
     | 
| 
      
 243 
     | 
    
         
            +
                {
         
     | 
| 
      
 244 
     | 
    
         
            +
                    address objectAddress = info.objectAddress;
         
     | 
| 
      
 245 
     | 
    
         
            +
                    ObjectType objectType = info.objectType;
         
     | 
| 
      
 246 
     | 
    
         
            +
             
     | 
| 
      
 247 
     | 
    
         
            +
                    // this indidirectly enforces that the parent is registered
         
     | 
| 
      
 248 
     | 
    
         
            +
                    // parentType would be zero for a non-registered parent which is never a valid type combination
         
     | 
| 
      
 249 
     | 
    
         
            +
                    ObjectType parentType = _info[info.parentNftId].objectType;
         
     | 
| 
      
 250 
     | 
    
         
            +
             
     | 
| 
      
 251 
     | 
    
         
            +
                    // check type combinations for core objects
         
     | 
| 
      
 252 
     | 
    
         
            +
                    if(objectAddress == address(0)) {
         
     | 
| 
      
 253 
     | 
    
         
            +
                        if(_coreObjectCombinations[objectType][parentType] == false) {
         
     | 
| 
      
 254 
     | 
    
         
            +
                            revert ErrorRegistryTypesCombinationInvalid(objectAddress, objectType, parentType);
         
     | 
| 
      
 255 
     | 
    
         
            +
                        }
         
     | 
| 
      
 256 
     | 
    
         
            +
                    }
         
     | 
| 
      
 257 
     | 
    
         
            +
                    // check type combinations for contract objects
         
     | 
| 
      
 258 
     | 
    
         
            +
                    else {
         
     | 
| 
      
 259 
     | 
    
         
            +
                        if(_coreContractCombinations[objectType][parentType] == false) {
         
     | 
| 
      
 260 
     | 
    
         
            +
                            revert ErrorRegistryTypesCombinationInvalid(objectAddress, objectType, parentType);
         
     | 
| 
      
 261 
     | 
    
         
            +
                        }
         
     | 
| 
      
 262 
     | 
    
         
            +
                    }
         
     | 
| 
      
 263 
     | 
    
         
            +
             
     | 
| 
      
 264 
     | 
    
         
            +
                    nftId = _register(info);
         
     | 
| 
       192 
265 
     | 
    
         
             
                }
         
     | 
| 
       193 
266 
     | 
    
         | 
| 
       194 
267 
     | 
    
         | 
| 
       195 
268 
     | 
    
         
             
                /// @inheritdoc IRegistry
         
     | 
| 
       196 
269 
     | 
    
         
             
                function registerWithCustomType(ObjectInfo memory info)
         
     | 
| 
       197 
270 
     | 
    
         
             
                    external
         
     | 
| 
       198 
     | 
    
         
            -
                     
     | 
| 
      
 271 
     | 
    
         
            +
                    restricted()
         
     | 
| 
       199 
272 
     | 
    
         
             
                    returns(NftId nftId)
         
     | 
| 
       200 
273 
     | 
    
         
             
                {
         
     | 
| 
       201 
274 
     | 
    
         
             
                    ObjectType objectType = info.objectType;
         
     | 
| 
         @@ -206,19 +279,21 @@ contract Registry is 
     | 
|
| 
       206 
279 
     | 
    
         
             
                    }
         
     | 
| 
       207 
280 
     | 
    
         | 
| 
       208 
281 
     | 
    
         
             
                    if(
         
     | 
| 
      
 282 
     | 
    
         
            +
                        objectType == ObjectTypeLib.zero() ||
         
     | 
| 
      
 283 
     | 
    
         
            +
                        parentType == ObjectTypeLib.zero() ||
         
     | 
| 
       209 
284 
     | 
    
         
             
                        parentType == PROTOCOL() ||
         
     | 
| 
       210 
285 
     | 
    
         
             
                        parentType == SERVICE()
         
     | 
| 
       211 
286 
     | 
    
         
             
                    ) {
         
     | 
| 
       212 
     | 
    
         
            -
                        revert ErrorRegistryTypesCombinationInvalid(objectType, parentType);
         
     | 
| 
      
 287 
     | 
    
         
            +
                        revert ErrorRegistryTypesCombinationInvalid(info.objectAddress, objectType, parentType);
         
     | 
| 
       213 
288 
     | 
    
         
             
                    }
         
     | 
| 
       214 
289 
     | 
    
         | 
| 
       215 
     | 
    
         
            -
                    _register(info);
         
     | 
| 
      
 290 
     | 
    
         
            +
                    nftId = _register(info);
         
     | 
| 
       216 
291 
     | 
    
         
             
                }
         
     | 
| 
       217 
292 
     | 
    
         | 
| 
       218 
293 
     | 
    
         | 
| 
       219 
294 
     | 
    
         
             
                /// @dev earliest GIF major version 
         
     | 
| 
       220 
295 
     | 
    
         
             
                function getInitialVersion() external view returns (VersionPart) {
         
     | 
| 
       221 
     | 
    
         
            -
                    return _releaseRegistry. 
     | 
| 
      
 296 
     | 
    
         
            +
                    return VersionPartLib.toVersionPart(_releaseRegistry.INITIAL_GIF_VERSION());
         
     | 
| 
       222 
297 
     | 
    
         
             
                }
         
     | 
| 
       223 
298 
     | 
    
         | 
| 
       224 
299 
     | 
    
         
             
                /// @dev next GIF release version to be released
         
     | 
| 
         @@ -235,16 +310,28 @@ contract Registry is 
     | 
|
| 
       235 
310 
     | 
    
         
             
                    return _releaseRegistry.getReleaseInfo(version);
         
     | 
| 
       236 
311 
     | 
    
         
             
                }
         
     | 
| 
       237 
312 
     | 
    
         | 
| 
      
 313 
     | 
    
         
            +
                function chainIds() public view returns (uint256) {
         
     | 
| 
      
 314 
     | 
    
         
            +
                    return _chainId.length;
         
     | 
| 
      
 315 
     | 
    
         
            +
                }
         
     | 
| 
      
 316 
     | 
    
         
            +
             
     | 
| 
      
 317 
     | 
    
         
            +
                function getChainId(uint256 idx) public view returns (uint256) {
         
     | 
| 
      
 318 
     | 
    
         
            +
                    return _chainId[idx];
         
     | 
| 
      
 319 
     | 
    
         
            +
                }
         
     | 
| 
      
 320 
     | 
    
         
            +
             
     | 
| 
      
 321 
     | 
    
         
            +
                function getRegistryNftId(uint256 chainId) public view returns (NftId nftId) {
         
     | 
| 
      
 322 
     | 
    
         
            +
                    return _registryNftIdByChainId[chainId];
         
     | 
| 
      
 323 
     | 
    
         
            +
                }
         
     | 
| 
      
 324 
     | 
    
         
            +
             
     | 
| 
       238 
325 
     | 
    
         
             
                function getObjectCount() external view returns (uint256) {
         
     | 
| 
       239 
     | 
    
         
            -
                    return  
     | 
| 
      
 326 
     | 
    
         
            +
                    return CHAIN_NFT.totalSupply();
         
     | 
| 
       240 
327 
     | 
    
         
             
                }
         
     | 
| 
       241 
328 
     | 
    
         | 
| 
       242 
329 
     | 
    
         
             
                function getNftId() external view returns (NftId nftId) {
         
     | 
| 
       243 
     | 
    
         
            -
                    return  
     | 
| 
      
 330 
     | 
    
         
            +
                    return REGISTRY_NFT_ID;
         
     | 
| 
       244 
331 
     | 
    
         
             
                }
         
     | 
| 
       245 
332 
     | 
    
         | 
| 
       246 
333 
     | 
    
         
             
                function getProtocolNftId() external view returns (NftId nftId) {
         
     | 
| 
       247 
     | 
    
         
            -
                    return  
     | 
| 
      
 334 
     | 
    
         
            +
                    return PROTOCOL_NFT_ID;
         
     | 
| 
       248 
335 
     | 
    
         
             
                }
         
     | 
| 
       249 
336 
     | 
    
         | 
| 
       250 
337 
     | 
    
         
             
                function getNftIdForAddress(address object) external view returns (NftId id) {
         
     | 
| 
         @@ -252,17 +339,29 @@ contract Registry is 
     | 
|
| 
       252 
339 
     | 
    
         
             
                }
         
     | 
| 
       253 
340 
     | 
    
         | 
| 
       254 
341 
     | 
    
         
             
                function ownerOf(NftId nftId) public view returns (address) {
         
     | 
| 
       255 
     | 
    
         
            -
                    return  
     | 
| 
      
 342 
     | 
    
         
            +
                    return CHAIN_NFT.ownerOf(nftId.toInt());
         
     | 
| 
      
 343 
     | 
    
         
            +
                }
         
     | 
| 
      
 344 
     | 
    
         
            +
             
     | 
| 
      
 345 
     | 
    
         
            +
                function isOwnerOf(NftId nftId, address expectedOwner) public view returns (bool) {
         
     | 
| 
      
 346 
     | 
    
         
            +
                    return CHAIN_NFT.ownerOf(nftId.toInt()) == expectedOwner;
         
     | 
| 
       256 
347 
     | 
    
         
             
                }
         
     | 
| 
       257 
348 
     | 
    
         | 
| 
       258 
349 
     | 
    
         
             
                function ownerOf(address contractAddress) public view returns (address) {
         
     | 
| 
       259 
     | 
    
         
            -
                    return  
     | 
| 
      
 350 
     | 
    
         
            +
                    return CHAIN_NFT.ownerOf(_nftIdByAddress[contractAddress].toInt());
         
     | 
| 
       260 
351 
     | 
    
         
             
                }
         
     | 
| 
       261 
352 
     | 
    
         | 
| 
       262 
353 
     | 
    
         
             
                function getObjectInfo(NftId nftId) external view returns (ObjectInfo memory) {
         
     | 
| 
       263 
354 
     | 
    
         
             
                    return _info[nftId];
         
     | 
| 
       264 
355 
     | 
    
         
             
                }
         
     | 
| 
       265 
356 
     | 
    
         | 
| 
      
 357 
     | 
    
         
            +
                function isObjectType(NftId nftId, ObjectType expectedObjectType) external view returns (bool) {
         
     | 
| 
      
 358 
     | 
    
         
            +
                    return _info[nftId].objectType == expectedObjectType;
         
     | 
| 
      
 359 
     | 
    
         
            +
                }
         
     | 
| 
      
 360 
     | 
    
         
            +
             
     | 
| 
      
 361 
     | 
    
         
            +
                function getObjectAddress(NftId nftId) external view returns (address) {
         
     | 
| 
      
 362 
     | 
    
         
            +
                    return _info[nftId].objectAddress;
         
     | 
| 
      
 363 
     | 
    
         
            +
                }
         
     | 
| 
      
 364 
     | 
    
         
            +
             
     | 
| 
       266 
365 
     | 
    
         
             
                function getObjectInfo(address object) external view returns (ObjectInfo memory) {
         
     | 
| 
       267 
366 
     | 
    
         
             
                    return _info[_nftIdByAddress[object]];
         
     | 
| 
       268 
367 
     | 
    
         
             
                }
         
     | 
| 
         @@ -290,8 +389,6 @@ contract Registry is 
     | 
|
| 
       290 
389 
     | 
    
         
             
                }
         
     | 
| 
       291 
390 
     | 
    
         | 
| 
       292 
391 
     | 
    
         
             
                function getStakingAddress() external view returns (address staking) {
         
     | 
| 
       293 
     | 
    
         
            -
                    //return getObjectInfo(_stakingNftId).objectAddress;
         
     | 
| 
       294 
     | 
    
         
            -
                    //return _info[_stakingNftId].objectAddress;
         
     | 
| 
       295 
392 
     | 
    
         
             
                    return _stakingAddress;
         
     | 
| 
       296 
393 
     | 
    
         
             
                }
         
     | 
| 
       297 
394 
     | 
    
         | 
| 
         @@ -312,15 +409,15 @@ contract Registry is 
     | 
|
| 
       312 
409 
     | 
    
         
             
                }
         
     | 
| 
       313 
410 
     | 
    
         | 
| 
       314 
411 
     | 
    
         
             
                function getChainNftAddress() external view override returns (address) {
         
     | 
| 
       315 
     | 
    
         
            -
                    return address( 
     | 
| 
      
 412 
     | 
    
         
            +
                    return address(CHAIN_NFT);
         
     | 
| 
       316 
413 
     | 
    
         
             
                }
         
     | 
| 
       317 
414 
     | 
    
         | 
| 
       318 
415 
     | 
    
         
             
                function getRegistryAdminAddress() external view returns (address) {
         
     | 
| 
       319 
     | 
    
         
            -
                    return address( 
     | 
| 
      
 416 
     | 
    
         
            +
                    return address(ADMIN);
         
     | 
| 
       320 
417 
     | 
    
         
             
                }
         
     | 
| 
       321 
418 
     | 
    
         | 
| 
       322 
419 
     | 
    
         
             
                function getAuthority() external view returns (address) {
         
     | 
| 
       323 
     | 
    
         
            -
                    return  
     | 
| 
      
 420 
     | 
    
         
            +
                    return ADMIN.authority();
         
     | 
| 
       324 
421 
     | 
    
         
             
                }
         
     | 
| 
       325 
422 
     | 
    
         | 
| 
       326 
423 
     | 
    
         
             
                function getOwner() public view returns (address owner) {
         
     | 
| 
         @@ -344,25 +441,33 @@ contract Registry is 
     | 
|
| 
       344 
441 
     | 
    
         
             
                    internal
         
     | 
| 
       345 
442 
     | 
    
         
             
                    returns(NftId nftId)
         
     | 
| 
       346 
443 
     | 
    
         
             
                {
         
     | 
| 
       347 
     | 
    
         
            -
                    ObjectType objectType = info.objectType;
         
     | 
| 
      
 444 
     | 
    
         
            +
                    ObjectType objectType = info.objectType; // do not care here, never PROTOCOL(), REGISTRY()
         
     | 
| 
       348 
445 
     | 
    
         
             
                    bool isInterceptor = info.isInterceptor;
         
     | 
| 
       349 
     | 
    
         
            -
                    address objectAddress = info.objectAddress;
         
     | 
| 
       350 
     | 
    
         
            -
                    address owner = info.initialOwner;
         
     | 
| 
      
 446 
     | 
    
         
            +
                    address objectAddress = info.objectAddress; // do not care here, can be 0
         
     | 
| 
      
 447 
     | 
    
         
            +
                    address owner = info.initialOwner; // do not care here, can be 0, can be equal info.objectAddress
         
     | 
| 
       351 
448 
     | 
    
         | 
| 
       352 
     | 
    
         
            -
                    NftId parentNftId = info.parentNftId;
         
     | 
| 
      
 449 
     | 
    
         
            +
                    NftId parentNftId = info.parentNftId; // do not care here, can not be 0
         
     | 
| 
       353 
450 
     | 
    
         
             
                    ObjectInfo memory parentInfo = _info[parentNftId];
         
     | 
| 
       354 
     | 
    
         
            -
                     
     | 
| 
       355 
     | 
    
         
            -
                    address parentAddress = parentInfo.objectAddress;
         
     | 
| 
      
 451 
     | 
    
         
            +
                    address parentAddress = parentInfo.objectAddress; // can be 0
         
     | 
| 
       356 
452 
     | 
    
         | 
| 
       357 
453 
     | 
    
         
             
                    // parent is contract -> need to check? -> check before minting
         
     | 
| 
       358 
454 
     | 
    
         
             
                    // special case: staking: to protocol possible as well
         
     | 
| 
       359 
     | 
    
         
            -
                    // special case: global registry nft as parent when not on mainnet -> global registry address is 0
         
     | 
| 
       360 
     | 
    
         
            -
                    // special case: when parentNftId ==  
     | 
| 
       361 
     | 
    
         
            -
                    // special case: when parentNftId ==  
     | 
| 
       362 
     | 
    
         
            -
                     
     | 
| 
      
 455 
     | 
    
         
            +
                    // NO LONGER TRUE: special case: global registry nft as parent when not on mainnet -> global registry address is 0
         
     | 
| 
      
 456 
     | 
    
         
            +
                    // special case: when parentNftId == CHAIN_NFT.mint(), check for zero parent address before mint
         
     | 
| 
      
 457 
     | 
    
         
            +
                    // special case: when parentNftId == CHAIN_NFT.mint() && objectAddress == initialOwner
         
     | 
| 
      
 458 
     | 
    
         
            +
                    // Parent can have 0 address in case of STAKE for PROTOCOL / CUSTOM_TYPE for POLICY
         
     | 
| 
      
 459 
     | 
    
         
            +
                    // But it MUST be registered -> parentType != 0 && parentNftId != 0
         
     | 
| 
      
 460 
     | 
    
         
            +
                    /*if(objectType != STAKE()) {
         
     | 
| 
       363 
461 
     | 
    
         
             
                        if(parentAddress == address(0)) {
         
     | 
| 
       364 
462 
     | 
    
         
             
                            revert ErrorRegistryParentAddressZero();
         
     | 
| 
       365 
463 
     | 
    
         
             
                        }
         
     | 
| 
      
 464 
     | 
    
         
            +
                    }*/
         
     | 
| 
      
 465 
     | 
    
         
            +
                
         
     | 
| 
      
 466 
     | 
    
         
            +
                    // global registry is never parent when not on mainnet
         
     | 
| 
      
 467 
     | 
    
         
            +
                    if(block.chainid != 1) {
         
     | 
| 
      
 468 
     | 
    
         
            +
                        if(parentNftId == GLOBAL_REGISTRY_NFT_ID) {
         
     | 
| 
      
 469 
     | 
    
         
            +
                            revert ErrorRegistryGlobalRegistryAsParent(objectAddress, objectType);
         
     | 
| 
      
 470 
     | 
    
         
            +
                        }
         
     | 
| 
       366 
471 
     | 
    
         
             
                    }
         
     | 
| 
       367 
472 
     | 
    
         | 
| 
       368 
473 
     | 
    
         
             
                    address interceptorAddress = _getInterceptor(
         
     | 
| 
         @@ -372,23 +477,17 @@ contract Registry is 
     | 
|
| 
       372 
477 
     | 
    
         
             
                        parentInfo.isInterceptor, 
         
     | 
| 
       373 
478 
     | 
    
         
             
                        parentAddress);
         
     | 
| 
       374 
479 
     | 
    
         | 
| 
       375 
     | 
    
         
            -
                    uint256 tokenId =  
     | 
| 
      
 480 
     | 
    
         
            +
                    uint256 tokenId = CHAIN_NFT.getNextTokenId();
         
     | 
| 
       376 
481 
     | 
    
         
             
                    nftId = NftIdLib.toNftId(tokenId);
         
     | 
| 
       377 
482 
     | 
    
         
             
                    info.nftId = nftId;
         
     | 
| 
       378 
     | 
    
         
            -
                    _info[nftId] = info;
         
     | 
| 
       379 
     | 
    
         
            -
             
     | 
| 
       380 
     | 
    
         
            -
                    if(objectAddress > address(0)) {
         
     | 
| 
       381 
     | 
    
         
            -
                        if(_nftIdByAddress[objectAddress].gtz()) { 
         
     | 
| 
       382 
     | 
    
         
            -
                            revert ErrorRegistryContractAlreadyRegistered(objectAddress);
         
     | 
| 
       383 
     | 
    
         
            -
                        }
         
     | 
| 
       384 
483 
     | 
    
         | 
| 
       385 
     | 
    
         
            -
             
     | 
| 
       386 
     | 
    
         
            -
                     
     | 
| 
      
 484 
     | 
    
         
            +
                    _info[nftId] = info;
         
     | 
| 
      
 485 
     | 
    
         
            +
                    _setAddressForNftId(nftId, objectAddress);
         
     | 
| 
       387 
486 
     | 
    
         | 
| 
       388 
487 
     | 
    
         
             
                    emit LogRegistration(nftId, parentNftId, objectType, isInterceptor, objectAddress, owner);
         
     | 
| 
       389 
488 
     | 
    
         | 
| 
       390 
489 
     | 
    
         
             
                    // calls nft receiver(1) and interceptor(2)
         
     | 
| 
       391 
     | 
    
         
            -
                    uint256 mintedTokenId =  
     | 
| 
      
 490 
     | 
    
         
            +
                    uint256 mintedTokenId = CHAIN_NFT.mint(
         
     | 
| 
       392 
491 
     | 
    
         
             
                        owner,
         
     | 
| 
       393 
492 
     | 
    
         
             
                        interceptorAddress,
         
     | 
| 
       394 
493 
     | 
    
         
             
                        EMPTY_URI);
         
     | 
| 
         @@ -437,105 +536,151 @@ contract Registry is 
     | 
|
| 
       437 
536 
     | 
    
         
             
                    private
         
     | 
| 
       438 
537 
     | 
    
         
             
                    returns (NftId protocolNftId)
         
     | 
| 
       439 
538 
     | 
    
         
             
                {
         
     | 
| 
       440 
     | 
    
         
            -
                    uint256 protocolId =  
     | 
| 
      
 539 
     | 
    
         
            +
                    uint256 protocolId = CHAIN_NFT.PROTOCOL_NFT_ID();
         
     | 
| 
       441 
540 
     | 
    
         
             
                    protocolNftId = NftIdLib.toNftId(protocolId);
         
     | 
| 
       442 
541 
     | 
    
         | 
| 
       443 
     | 
    
         
            -
                     
     | 
| 
       444 
     | 
    
         
            -
                         
     | 
| 
       445 
     | 
    
         
            -
             
     | 
| 
       446 
     | 
    
         
            -
             
     | 
| 
       447 
     | 
    
         
            -
             
     | 
| 
       448 
     | 
    
         
            -
             
     | 
| 
       449 
     | 
    
         
            -
             
     | 
| 
       450 
     | 
    
         
            -
             
     | 
| 
       451 
     | 
    
         
            -
             
     | 
| 
       452 
     | 
    
         
            -
             
     | 
| 
       453 
     | 
    
         
            -
                    _chainNft.mint(NFT_LOCK_ADDRESS, protocolId);
         
     | 
| 
      
 542 
     | 
    
         
            +
                    _registerForNft(
         
     | 
| 
      
 543 
     | 
    
         
            +
                        ObjectInfo({
         
     | 
| 
      
 544 
     | 
    
         
            +
                            nftId: protocolNftId,
         
     | 
| 
      
 545 
     | 
    
         
            +
                            parentNftId: NftIdLib.zero(),
         
     | 
| 
      
 546 
     | 
    
         
            +
                            objectType: PROTOCOL(),
         
     | 
| 
      
 547 
     | 
    
         
            +
                            isInterceptor: false, 
         
     | 
| 
      
 548 
     | 
    
         
            +
                            objectAddress: address(0),
         
     | 
| 
      
 549 
     | 
    
         
            +
                            initialOwner: NFT_LOCK_ADDRESS,
         
     | 
| 
      
 550 
     | 
    
         
            +
                            data: ""}),
         
     | 
| 
      
 551 
     | 
    
         
            +
                        true);
         
     | 
| 
       454 
552 
     | 
    
         
             
                }
         
     | 
| 
       455 
553 
     | 
    
         | 
| 
       456 
     | 
    
         
            -
                /// @dev registry 
     | 
| 
       457 
     | 
    
         
            -
                /// might also register the global registry when not on mainnet
         
     | 
| 
      
 554 
     | 
    
         
            +
                /// @dev register this registry
         
     | 
| 
       458 
555 
     | 
    
         
             
                function _registerRegistry() 
         
     | 
| 
       459 
     | 
    
         
            -
                     
     | 
| 
      
 556 
     | 
    
         
            +
                    internal 
         
     | 
| 
      
 557 
     | 
    
         
            +
                    virtual
         
     | 
| 
       460 
558 
     | 
    
         
             
                    returns (NftId registryNftId)
         
     | 
| 
       461 
559 
     | 
    
         
             
                {
         
     | 
| 
       462 
     | 
    
         
            -
                     
     | 
| 
       463 
     | 
    
         
            -
                    registryNftId =  
     | 
| 
       464 
     | 
    
         
            -
             
     | 
| 
       465 
     | 
    
         
            -
             
     | 
| 
       466 
     | 
    
         
            -
                     
     | 
| 
       467 
     | 
    
         
            -
             
     | 
| 
       468 
     | 
    
         
            -
                         
     | 
| 
       469 
     | 
    
         
            -
             
     | 
| 
      
 560 
     | 
    
         
            +
                    // initial assignment
         
     | 
| 
      
 561 
     | 
    
         
            +
                    registryNftId = GLOBAL_REGISTRY_NFT_ID;
         
     | 
| 
      
 562 
     | 
    
         
            +
             
     | 
| 
      
 563 
     | 
    
         
            +
                    // register global registry
         
     | 
| 
      
 564 
     | 
    
         
            +
                    _registerRegistryForNft(
         
     | 
| 
      
 565 
     | 
    
         
            +
                        1, // mainnet chain id
         
     | 
| 
      
 566 
     | 
    
         
            +
                        ObjectInfo({
         
     | 
| 
      
 567 
     | 
    
         
            +
                            nftId: GLOBAL_REGISTRY_NFT_ID,
         
     | 
| 
      
 568 
     | 
    
         
            +
                            parentNftId: PROTOCOL_NFT_ID,
         
     | 
| 
      
 569 
     | 
    
         
            +
                            objectType: REGISTRY(),
         
     | 
| 
      
 570 
     | 
    
         
            +
                            isInterceptor: false,
         
     | 
| 
      
 571 
     | 
    
         
            +
                            objectAddress: GLOBAL_REGISTRY_ADDRESS, 
         
     | 
| 
      
 572 
     | 
    
         
            +
                            initialOwner: NFT_LOCK_ADDRESS,
         
     | 
| 
      
 573 
     | 
    
         
            +
                            data: ""}),
         
     | 
| 
      
 574 
     | 
    
         
            +
                        block.chainid == 1);// update address lookup for global registry only on mainnet
         
     | 
| 
      
 575 
     | 
    
         
            +
             
     | 
| 
      
 576 
     | 
    
         
            +
                    // if not on mainnet: register this registry with global registry as parent
         
     | 
| 
      
 577 
     | 
    
         
            +
                    if (block.chainid != 1) {
         
     | 
| 
      
 578 
     | 
    
         
            +
             
     | 
| 
      
 579 
     | 
    
         
            +
                        // modify registry nft id to local registry when not on mainnet
         
     | 
| 
      
 580 
     | 
    
         
            +
                        registryNftId = NftIdLib.toNftId(
         
     | 
| 
      
 581 
     | 
    
         
            +
                            CHAIN_NFT.calculateTokenId(REGISTRY_TOKEN_SEQUENCE_ID));
         
     | 
| 
      
 582 
     | 
    
         
            +
             
     | 
| 
      
 583 
     | 
    
         
            +
                        _registerRegistryForNft(
         
     | 
| 
      
 584 
     | 
    
         
            +
                            block.chainid, 
         
     | 
| 
      
 585 
     | 
    
         
            +
                            ObjectInfo({
         
     | 
| 
      
 586 
     | 
    
         
            +
                                nftId: registryNftId,
         
     | 
| 
      
 587 
     | 
    
         
            +
                                parentNftId: GLOBAL_REGISTRY_NFT_ID,
         
     | 
| 
      
 588 
     | 
    
         
            +
                                objectType: REGISTRY(),
         
     | 
| 
      
 589 
     | 
    
         
            +
                                isInterceptor: false,
         
     | 
| 
      
 590 
     | 
    
         
            +
                                objectAddress: address(this),
         
     | 
| 
      
 591 
     | 
    
         
            +
                                initialOwner: NFT_LOCK_ADDRESS,
         
     | 
| 
      
 592 
     | 
    
         
            +
                                data: ""}),
         
     | 
| 
      
 593 
     | 
    
         
            +
                            true);
         
     | 
| 
       470 
594 
     | 
    
         
             
                    }
         
     | 
| 
       471 
     | 
    
         
            -
             
     | 
| 
       472 
     | 
    
         
            -
             
     | 
| 
       473 
     | 
    
         
            -
             
     | 
| 
      
 595 
     | 
    
         
            +
                }
         
     | 
| 
      
 596 
     | 
    
         
            +
             
     | 
| 
      
 597 
     | 
    
         
            +
                /// @dev staking registration
         
     | 
| 
      
 598 
     | 
    
         
            +
                function _registerRegistryForNft(
         
     | 
| 
      
 599 
     | 
    
         
            +
                    uint256 chainId,
         
     | 
| 
      
 600 
     | 
    
         
            +
                    ObjectInfo memory info,
         
     | 
| 
      
 601 
     | 
    
         
            +
                    bool updateAddressLookup
         
     | 
| 
      
 602 
     | 
    
         
            +
                )
         
     | 
| 
      
 603 
     | 
    
         
            +
                    private
         
     | 
| 
      
 604 
     | 
    
         
            +
                {
         
     | 
| 
      
 605 
     | 
    
         
            +
                    if (!_registryNftIdByChainId[chainId].eqz()) {
         
     | 
| 
      
 606 
     | 
    
         
            +
                        revert ErrorRegistryChainRegistryAlreadyRegistered(info.nftId, chainId);
         
     | 
| 
       474 
607 
     | 
    
         
             
                    }
         
     | 
| 
       475 
608 
     | 
    
         | 
| 
       476 
     | 
    
         
            -
                     
     | 
| 
       477 
     | 
    
         
            -
             
     | 
| 
       478 
     | 
    
         
            -
             
     | 
| 
       479 
     | 
    
         
            -
                        objectType: REGISTRY(),
         
     | 
| 
       480 
     | 
    
         
            -
                        isInterceptor: false,
         
     | 
| 
       481 
     | 
    
         
            -
                        objectAddress: address(this), 
         
     | 
| 
       482 
     | 
    
         
            -
                        initialOwner: NFT_LOCK_ADDRESS,
         
     | 
| 
       483 
     | 
    
         
            -
                        data: "" 
         
     | 
| 
       484 
     | 
    
         
            -
                    });
         
     | 
| 
      
 609 
     | 
    
         
            +
                    // update registry lookup variables
         
     | 
| 
      
 610 
     | 
    
         
            +
                    _registryNftIdByChainId[chainId] = info.nftId;
         
     | 
| 
      
 611 
     | 
    
         
            +
                    _chainId.push(chainId);
         
     | 
| 
       485 
612 
     | 
    
         | 
| 
       486 
     | 
    
         
            -
                     
     | 
| 
       487 
     | 
    
         
            -
                     
     | 
| 
      
 613 
     | 
    
         
            +
                    // register the registry info
         
     | 
| 
      
 614 
     | 
    
         
            +
                    _registerForNft(
         
     | 
| 
      
 615 
     | 
    
         
            +
                        info,
         
     | 
| 
      
 616 
     | 
    
         
            +
                        updateAddressLookup); 
         
     | 
| 
       488 
617 
     | 
    
         
             
                }
         
     | 
| 
       489 
618 
     | 
    
         | 
| 
       490 
     | 
    
         
            -
                /// @dev  
     | 
| 
       491 
     | 
    
         
            -
                function _registerGlobalRegistry() 
         
     | 
| 
       492 
     | 
    
         
            -
                    private
         
     | 
| 
       493 
     | 
    
         
            -
                {
         
     | 
| 
       494 
     | 
    
         
            -
                    uint256 globalRegistryId = _chainNft.GLOBAL_REGISTRY_ID();
         
     | 
| 
       495 
     | 
    
         
            -
                    NftId globalRegistryNftId = NftIdLib.toNftId(globalRegistryId);
         
     | 
| 
       496 
     | 
    
         
            -
             
     | 
| 
       497 
     | 
    
         
            -
                    _info[globalRegistryNftId] = ObjectInfo({
         
     | 
| 
       498 
     | 
    
         
            -
                        nftId: globalRegistryNftId,
         
     | 
| 
       499 
     | 
    
         
            -
                        parentNftId: NftIdLib.toNftId(_chainNft.PROTOCOL_NFT_ID()),
         
     | 
| 
       500 
     | 
    
         
            -
                        objectType: REGISTRY(),
         
     | 
| 
       501 
     | 
    
         
            -
                        isInterceptor: false,
         
     | 
| 
       502 
     | 
    
         
            -
                        objectAddress: address(0),
         
     | 
| 
       503 
     | 
    
         
            -
                        initialOwner: NFT_LOCK_ADDRESS,
         
     | 
| 
       504 
     | 
    
         
            -
                        data: ""
         
     | 
| 
       505 
     | 
    
         
            -
                    });
         
     | 
| 
       506 
     | 
    
         
            -
             
     | 
| 
       507 
     | 
    
         
            -
                    _chainNft.mint(NFT_LOCK_ADDRESS, globalRegistryId);
         
     | 
| 
       508 
     | 
    
         
            -
                }
         
     | 
| 
       509 
     | 
    
         
            -
                // depends on _registryNftId and _stakingAddress
         
     | 
| 
      
 619 
     | 
    
         
            +
                /// @dev staking registration
         
     | 
| 
       510 
620 
     | 
    
         
             
                function _registerStaking()
         
     | 
| 
       511 
621 
     | 
    
         
             
                    private
         
     | 
| 
       512 
622 
     | 
    
         
             
                    returns (NftId stakingNftId)
         
     | 
| 
       513 
623 
     | 
    
         
             
                {
         
     | 
| 
       514 
624 
     | 
    
         
             
                    address stakingOwner = IRegisterable(_stakingAddress).getOwner();
         
     | 
| 
       515 
     | 
    
         
            -
                    uint256 stakingId =  
     | 
| 
      
 625 
     | 
    
         
            +
                    uint256 stakingId = CHAIN_NFT.calculateTokenId(STAKING_TOKEN_SEQUENCE_ID);
         
     | 
| 
       516 
626 
     | 
    
         
             
                    stakingNftId = NftIdLib.toNftId(stakingId);
         
     | 
| 
       517 
627 
     | 
    
         | 
| 
       518 
     | 
    
         
            -
                     
     | 
| 
       519 
     | 
    
         
            -
                         
     | 
| 
       520 
     | 
    
         
            -
             
     | 
| 
       521 
     | 
    
         
            -
             
     | 
| 
       522 
     | 
    
         
            -
             
     | 
| 
       523 
     | 
    
         
            -
             
     | 
| 
       524 
     | 
    
         
            -
             
     | 
| 
       525 
     | 
    
         
            -
             
     | 
| 
       526 
     | 
    
         
            -
             
     | 
| 
      
 628 
     | 
    
         
            +
                    _registerForNft( 
         
     | 
| 
      
 629 
     | 
    
         
            +
                        ObjectInfo({
         
     | 
| 
      
 630 
     | 
    
         
            +
                            nftId: stakingNftId,
         
     | 
| 
      
 631 
     | 
    
         
            +
                            parentNftId: REGISTRY_NFT_ID,
         
     | 
| 
      
 632 
     | 
    
         
            +
                            objectType: STAKING(),
         
     | 
| 
      
 633 
     | 
    
         
            +
                            isInterceptor: false,
         
     | 
| 
      
 634 
     | 
    
         
            +
                            objectAddress: _stakingAddress, 
         
     | 
| 
      
 635 
     | 
    
         
            +
                            initialOwner: stakingOwner,
         
     | 
| 
      
 636 
     | 
    
         
            +
                            data: ""}),
         
     | 
| 
      
 637 
     | 
    
         
            +
                        true); 
         
     | 
| 
      
 638 
     | 
    
         
            +
                }
         
     | 
| 
      
 639 
     | 
    
         
            +
             
     | 
| 
      
 640 
     | 
    
         
            +
                /// @dev Register the provided object info for the specified NFT ID.
         
     | 
| 
      
 641 
     | 
    
         
            +
                function _registerForNft(
         
     | 
| 
      
 642 
     | 
    
         
            +
                    ObjectInfo memory info, 
         
     | 
| 
      
 643 
     | 
    
         
            +
                    bool updateAddressLookup
         
     | 
| 
      
 644 
     | 
    
         
            +
                )
         
     | 
| 
      
 645 
     | 
    
         
            +
                    internal
         
     | 
| 
      
 646 
     | 
    
         
            +
                {
         
     | 
| 
      
 647 
     | 
    
         
            +
                    _info[info.nftId] = info;
         
     | 
| 
       527 
648 
     | 
    
         | 
| 
       528 
     | 
    
         
            -
                     
     | 
| 
      
 649 
     | 
    
         
            +
                    if (updateAddressLookup) {
         
     | 
| 
      
 650 
     | 
    
         
            +
                        _setAddressForNftId(info.nftId, info.objectAddress);
         
     | 
| 
      
 651 
     | 
    
         
            +
                    }
         
     | 
| 
       529 
652 
     | 
    
         | 
| 
       530 
     | 
    
         
            -
                    //  
     | 
| 
       531 
     | 
    
         
            -
                     
     | 
| 
      
 653 
     | 
    
         
            +
                    // calls nft receiver
         
     | 
| 
      
 654 
     | 
    
         
            +
                    CHAIN_NFT.mint(info.initialOwner, info.nftId.toInt());
         
     | 
| 
      
 655 
     | 
    
         
            +
                }
         
     | 
| 
      
 656 
     | 
    
         
            +
             
     | 
| 
      
 657 
     | 
    
         
            +
                function _setAddressForNftId(NftId nftId, address objectAddress)
         
     | 
| 
      
 658 
     | 
    
         
            +
                    internal
         
     | 
| 
      
 659 
     | 
    
         
            +
                {
         
     | 
| 
      
 660 
     | 
    
         
            +
                    if (objectAddress != address(0)) {
         
     | 
| 
      
 661 
     | 
    
         
            +
                        if (_nftIdByAddress[objectAddress].gtz()) { 
         
     | 
| 
      
 662 
     | 
    
         
            +
                            revert ErrorRegistryContractAlreadyRegistered(objectAddress);
         
     | 
| 
      
 663 
     | 
    
         
            +
                        }
         
     | 
| 
      
 664 
     | 
    
         
            +
             
     | 
| 
      
 665 
     | 
    
         
            +
                        _nftIdByAddress[objectAddress] = nftId;
         
     | 
| 
      
 666 
     | 
    
         
            +
                    }
         
     | 
| 
      
 667 
     | 
    
         
            +
                }
         
     | 
| 
      
 668 
     | 
    
         
            +
             
     | 
| 
      
 669 
     | 
    
         
            +
                function _getGlobalRegistryAddress(address globalRegistry) internal view returns (address) {
         
     | 
| 
      
 670 
     | 
    
         
            +
                    if (block.chainid == 1) {
         
     | 
| 
      
 671 
     | 
    
         
            +
                        return address(this);
         
     | 
| 
      
 672 
     | 
    
         
            +
                    } else {
         
     | 
| 
      
 673 
     | 
    
         
            +
                        return globalRegistry;
         
     | 
| 
      
 674 
     | 
    
         
            +
                    }
         
     | 
| 
       532 
675 
     | 
    
         
             
                }
         
     | 
| 
       533 
676 
     | 
    
         | 
| 
       534 
677 
     | 
    
         
             
                /// @dev defines which object - parent types relations are allowed to register
         
     | 
| 
       535 
678 
     | 
    
         
             
                /// EACH object type MUST have only one parent type across ALL mappings
         
     | 
| 
      
 679 
     | 
    
         
            +
                // the only EXCEPTION is STAKE, can have any number of parent types
         
     | 
| 
       536 
680 
     | 
    
         
             
                function _setupValidCoreTypesAndCombinations() 
         
     | 
| 
       537 
     | 
    
         
            -
                    private 
     | 
| 
      
 681 
     | 
    
         
            +
                    private
         
     | 
| 
       538 
682 
     | 
    
         
             
                {
         
     | 
| 
      
 683 
     | 
    
         
            +
                    _coreTypes[PROTOCOL()] = true;
         
     | 
| 
       539 
684 
     | 
    
         
             
                    _coreTypes[REGISTRY()] = true;
         
     | 
| 
       540 
685 
     | 
    
         
             
                    _coreTypes[SERVICE()] = true;
         
     | 
| 
       541 
686 
     | 
    
         
             
                    _coreTypes[INSTANCE()] = true;
         
     | 
| 
         @@ -549,24 +694,20 @@ contract Registry is 
     | 
|
| 
       549 
694 
     | 
    
         
             
                    _coreTypes[STAKING()] = true;
         
     | 
| 
       550 
695 
     | 
    
         
             
                    _coreTypes[STAKE()] = true;
         
     | 
| 
       551 
696 
     | 
    
         | 
| 
       552 
     | 
    
         
            -
                    //  
     | 
| 
       553 
     | 
    
         
            -
                    if(block.chainid == 1) {
         
     | 
| 
       554 
     | 
    
         
            -
                        _coreContractCombinations[REGISTRY()][REGISTRY()] = true;
         
     | 
| 
       555 
     | 
    
         
            -
                    }
         
     | 
| 
       556 
     | 
    
         
            -
             
     | 
| 
       557 
     | 
    
         
            -
                    // contracts with registry parent
         
     | 
| 
       558 
     | 
    
         
            -
                    _coreContractCombinations[STAKING()][REGISTRY()] = true; // only for chain staking contract
         
     | 
| 
      
 697 
     | 
    
         
            +
                    // types combinations allowed to use with register() function ONLY
         
     | 
| 
       559 
698 
     | 
    
         
             
                    _coreContractCombinations[INSTANCE()][REGISTRY()] = true;
         
     | 
| 
       560 
699 
     | 
    
         | 
| 
       561 
700 
     | 
    
         
             
                    // components with instance parent
         
     | 
| 
       562 
701 
     | 
    
         
             
                    _coreContractCombinations[PRODUCT()][INSTANCE()] = true;
         
     | 
| 
       563 
     | 
    
         
            -
                    _coreContractCombinations[DISTRIBUTION()][INSTANCE()] = true;
         
     | 
| 
       564 
     | 
    
         
            -
                    _coreContractCombinations[ORACLE()][INSTANCE()] = true;
         
     | 
| 
       565 
     | 
    
         
            -
                    _coreContractCombinations[POOL()][INSTANCE()] = true;
         
     | 
| 
       566 
702 
     | 
    
         | 
| 
       567 
     | 
    
         
            -
                    //  
     | 
| 
       568 
     | 
    
         
            -
                     
     | 
| 
      
 703 
     | 
    
         
            +
                    // components with product parent
         
     | 
| 
      
 704 
     | 
    
         
            +
                    _coreContractCombinations[DISTRIBUTION()][PRODUCT()] = true;
         
     | 
| 
      
 705 
     | 
    
         
            +
                    _coreContractCombinations[ORACLE()][PRODUCT()] = true;
         
     | 
| 
      
 706 
     | 
    
         
            +
                    _coreContractCombinations[POOL()][PRODUCT()] = true;
         
     | 
| 
      
 707 
     | 
    
         
            +
             
     | 
| 
      
 708 
     | 
    
         
            +
                    // objects with component parents
         
     | 
| 
       569 
709 
     | 
    
         
             
                    _coreObjectCombinations[POLICY()][PRODUCT()] = true;
         
     | 
| 
      
 710 
     | 
    
         
            +
                    _coreObjectCombinations[DISTRIBUTOR()][DISTRIBUTION()] = true;
         
     | 
| 
       570 
711 
     | 
    
         
             
                    _coreObjectCombinations[BUNDLE()][POOL()] = true;
         
     | 
| 
       571 
712 
     | 
    
         | 
| 
       572 
713 
     | 
    
         
             
                    // staking
         
     |