@etherisc/gif-next 0.0.2-e1e92ab-754 → 0.0.2-e2a57af-971
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 +160 -2
- package/artifacts/contracts/components/Component.sol/Component.dbg.json +4 -0
- package/artifacts/contracts/components/Component.sol/Component.json +656 -0
- package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/components/Distribution.sol/Distribution.json +396 -104
- package/artifacts/contracts/components/IComponent.sol/IComponent.dbg.json +4 -0
- package/artifacts/contracts/{instance/base/ServiceBase.sol/ServiceBase.json → components/IComponent.sol/IComponent.json} +152 -165
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +480 -9
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +526 -65
- package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +571 -30
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.json +455 -201
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +474 -139
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +4 -0
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.json +66 -0
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +4 -0
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.json +24 -0
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +4 -0
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.json +42 -0
- package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
- package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +2 -2
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +2 -2
- package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
- package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
- package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +4 -0
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +764 -0
- package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +4 -0
- package/artifacts/contracts/instance/Cloneable.sol/Cloneable.json +185 -0
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1035 -995
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +4 -0
- package/artifacts/contracts/instance/{service/IComponentOwnerService.sol/IComponentOwnerService.json → IInstanceService.sol/IInstanceService.json} +176 -56
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +1821 -1096
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +4 -0
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +1034 -0
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +4 -0
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +1381 -0
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +4 -0
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +1024 -0
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +473 -0
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +4 -0
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +261 -0
- package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.dbg.json +4 -0
- package/artifacts/contracts/instance/base/{InstanceBase.sol/InstanceBase.json → ComponentService.sol/ComponentService.json} +134 -75
- package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.json +27 -158
- package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +37 -245
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +4 -0
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +254 -0
- package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +4 -0
- package/artifacts/contracts/instance/module/{bundle/IBundle.sol → IBundle.sol}/IBundle.json +1 -1
- package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +4 -0
- package/artifacts/contracts/instance/module/{distribution/IDistribution.sol → IDistribution.sol}/IDistribution.json +1 -1
- package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +4 -0
- package/artifacts/contracts/instance/module/{policy/IPolicy.sol → IPolicy.sol}/IPolicy.json +1 -1
- package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +4 -0
- package/artifacts/contracts/instance/module/{risk/IRisk.sol → IRisk.sol}/IRisk.json +1 -1
- package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +4 -0
- package/artifacts/contracts/instance/{base/ModuleBase.sol/ModuleBase.json → module/ISetup.sol/ISetup.json} +2 -2
- package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +4 -0
- package/artifacts/contracts/instance/module/{treasury/ITreasury.sol → ITreasury.sol}/ITreasury.json +1 -1
- package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +1102 -0
- package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +449 -0
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +194 -52
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +437 -0
- package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +715 -0
- package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +13 -18
- package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +766 -0
- package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +15 -82
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +25 -245
- package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +1227 -0
- package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +505 -0
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +181 -128
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +437 -0
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +174 -386
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +437 -0
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +47 -2
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +340 -60
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +220 -111
- package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.json +301 -188
- package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.dbg.json +4 -0
- package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.json +285 -0
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +83 -128
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +59 -85
- package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +4 -0
- package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +547 -0
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +394 -0
- package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
- package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
- package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
- package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
- package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +0 -5
- package/artifacts/contracts/shared/IService.sol/IService.dbg.json +4 -0
- package/artifacts/contracts/{instance/base → shared}/IService.sol/IService.json +14 -19
- package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +19 -6
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +19 -6
- package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/shared/Registerable.sol/Registerable.json +19 -11
- package/artifacts/contracts/shared/Service.sol/Service.dbg.json +4 -0
- package/artifacts/contracts/{instance/base/ComponentServiceBase.sol/ComponentServiceBase.json → shared/Service.sol/Service.json} +28 -33
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +4 -0
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +96 -0
- package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
- package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
- package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
- package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
- package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
- package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +19 -11
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +14 -14
- package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
- package/artifacts/contracts/test/TestService.sol/TestService.json +58 -34
- package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
- package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +18 -2
- package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
- package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
- package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
- package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +4 -0
- package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.json +104 -0
- package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
- package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
- package/artifacts/contracts/types/Key32.sol/Key32Lib.json +31 -17
- package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/NftId.sol/NftIdLib.json +2 -2
- package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
- package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +26 -3
- package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +4 -0
- package/artifacts/contracts/types/NumberId.sol/NumberIdLib.json +100 -0
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
- package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +4 -0
- package/artifacts/contracts/types/Referral.sol/ReferralLib.json +123 -0
- package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +2 -2
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +134 -8
- package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +15 -2
- package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
- package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
- package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionPartLib.json +22 -3
- package/contracts/components/Component.sol +216 -0
- package/contracts/components/Distribution.sol +49 -53
- package/contracts/components/IComponent.sol +43 -0
- package/contracts/components/IDistributionComponent.sol +6 -5
- package/contracts/components/IPoolComponent.sol +11 -15
- package/contracts/components/IProductComponent.sol +9 -7
- package/contracts/components/Pool.sol +77 -96
- package/contracts/components/Product.sol +82 -116
- package/contracts/experiment/cloning/Cloner.sol +47 -0
- package/contracts/instance/BundleManager.sol +125 -0
- package/contracts/instance/Cloneable.sol +46 -0
- package/contracts/instance/IInstance.sol +64 -44
- package/contracts/instance/IInstanceService.sol +41 -0
- package/contracts/instance/Instance.sol +251 -65
- package/contracts/instance/InstanceAccessManager.sol +298 -0
- package/contracts/instance/InstanceReader.sol +293 -0
- package/contracts/instance/InstanceService.sol +442 -0
- package/contracts/instance/InstanceServiceManager.sol +54 -0
- package/contracts/instance/ObjectManager.sol +84 -0
- package/contracts/instance/base/ComponentService.sol +134 -0
- package/contracts/instance/base/IKeyValueStore.sol +13 -14
- package/contracts/instance/base/ILifecycle.sol +3 -3
- package/contracts/instance/base/KeyValueStore.sol +49 -38
- package/contracts/instance/base/Lifecycle.sol +1 -1
- package/contracts/instance/module/IAccess.sol +48 -0
- package/contracts/instance/module/IBundle.sol +20 -0
- package/contracts/instance/module/IDistribution.sol +39 -0
- package/contracts/instance/module/IPolicy.sol +45 -0
- package/contracts/instance/module/IRisk.sol +11 -0
- package/contracts/instance/module/ISetup.sol +46 -0
- package/contracts/instance/module/ITreasury.sol +23 -0
- package/contracts/instance/service/BundleService.sol +293 -0
- package/contracts/instance/service/BundleServiceManager.sol +51 -0
- package/contracts/instance/service/DistributionService.sol +72 -20
- package/contracts/instance/service/DistributionServiceManager.sol +51 -0
- package/contracts/instance/service/IBundleService.sol +44 -0
- package/contracts/instance/service/IDistributionService.sol +1 -1
- package/contracts/instance/service/IPolicyService.sol +94 -0
- package/contracts/instance/service/IPoolService.sol +7 -24
- package/contracts/instance/service/IProductService.sol +9 -76
- package/contracts/instance/service/PolicyService.sol +538 -0
- package/contracts/instance/service/PolicyServiceManager.sol +54 -0
- package/contracts/instance/service/PoolService.sol +77 -116
- package/contracts/instance/service/PoolServiceManager.sol +51 -0
- package/contracts/instance/service/ProductService.sol +156 -432
- package/contracts/instance/service/ProductServiceManager.sol +54 -0
- package/contracts/registry/ChainNft.sol +39 -24
- package/contracts/registry/IRegistry.sol +49 -8
- package/contracts/registry/IRegistryService.sol +50 -20
- package/contracts/registry/Registry.sol +251 -225
- package/contracts/registry/RegistryAccessManager.sol +216 -0
- package/contracts/registry/RegistryService.sol +84 -263
- package/contracts/registry/RegistryServiceManager.sol +20 -21
- package/contracts/registry/ReleaseManager.sol +332 -0
- package/contracts/registry/TokenRegistry.sol +112 -0
- package/contracts/shared/ERC165.sol +6 -2
- package/contracts/shared/IRegisterable.sol +1 -3
- package/contracts/shared/IService.sol +16 -0
- package/contracts/shared/NftOwnable.sol +7 -4
- package/contracts/shared/ProxyManager.sol +1 -1
- package/contracts/shared/Registerable.sol +11 -14
- package/contracts/shared/Service.sol +60 -0
- package/contracts/shared/TokenHandler.sol +27 -0
- package/contracts/shared/Versionable.sol +2 -2
- package/contracts/test/TestRoleId.sol +1 -1
- package/contracts/test/TestService.sol +6 -7
- package/contracts/types/DistributorType.sol +55 -0
- package/contracts/types/Key32.sol +8 -3
- package/contracts/types/NftIdSet.sol +26 -24
- package/contracts/types/NumberId.sol +52 -0
- package/contracts/types/ObjectType.sol +35 -14
- package/contracts/types/Referral.sol +85 -0
- package/contracts/types/RoleId.sol +60 -15
- package/contracts/types/StateId.sol +5 -1
- package/contracts/types/Timestamp.sol +7 -3
- package/contracts/types/Version.sol +4 -1
- package/package.json +1 -1
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +0 -4
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +0 -301
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +0 -4
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +0 -254
- package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +0 -4
- package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.json +0 -24
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +0 -4
- package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +0 -4
- package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +0 -113
- package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +0 -4
- package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +0 -4
- package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +0 -4
- package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +0 -4
- package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.json +0 -297
- package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +0 -4
- package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.json +0 -297
- package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.json +0 -117
- package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +0 -4
- package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.json +0 -10
- package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.json +0 -117
- package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.json +0 -10
- package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +0 -4
- package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.json +0 -10
- package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +0 -4
- package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.json +0 -271
- package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.json +0 -271
- package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +0 -4
- package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.json +0 -10
- package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.json +0 -164
- package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.json +0 -164
- package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +0 -4
- package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.json +0 -113
- package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +0 -131
- package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +0 -4
- package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.json +0 -638
- package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +0 -4
- package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +0 -76
- package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +0 -4
- package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.json +0 -638
- package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +0 -4
- package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +0 -827
- package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +0 -4
- package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +0 -4
- package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +0 -457
- package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +0 -4
- package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +0 -557
- package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +0 -4
- package/artifacts/contracts/test/TestPool.sol/TestPool.json +0 -716
- package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +0 -4
- package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +0 -744
- package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +0 -4
- package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.json +0 -99
- package/contracts/components/BaseComponent.sol +0 -79
- package/contracts/components/IBaseComponent.sol +0 -19
- package/contracts/instance/IInstanceLinked.sol +0 -8
- package/contracts/instance/base/ComponentServiceBase.sol +0 -49
- package/contracts/instance/base/IInstanceBase.sol +0 -23
- package/contracts/instance/base/IService.sol +0 -15
- package/contracts/instance/base/InstanceBase.sol +0 -89
- package/contracts/instance/base/ModuleBase.sol +0 -57
- package/contracts/instance/base/ServiceBase.sol +0 -44
- package/contracts/instance/module/bundle/BundleModule.sol +0 -134
- package/contracts/instance/module/bundle/IBundle.sol +0 -53
- package/contracts/instance/module/component/ComponentModule.sol +0 -71
- package/contracts/instance/module/component/IComponent.sol +0 -28
- package/contracts/instance/module/distribution/DistributionModule.sol +0 -17
- package/contracts/instance/module/distribution/IDistribution.sol +0 -10
- package/contracts/instance/module/policy/IPolicy.sol +0 -63
- package/contracts/instance/module/policy/PolicyModule.sol +0 -91
- package/contracts/instance/module/pool/IPoolModule.sol +0 -41
- package/contracts/instance/module/pool/PoolModule.sol +0 -95
- package/contracts/instance/module/risk/IRisk.sol +0 -26
- package/contracts/instance/module/risk/RiskModule.sol +0 -62
- package/contracts/instance/module/treasury/ITreasury.sol +0 -84
- package/contracts/instance/module/treasury/TokenHandler.sol +0 -48
- package/contracts/instance/module/treasury/TreasuryModule.sol +0 -131
- package/contracts/instance/service/ComponentOwnerService.sol +0 -315
- package/contracts/instance/service/IComponentOwnerService.sol +0 -20
- package/contracts/registry/IChainNft.sol +0 -22
- package/contracts/test/TestDistribution.sol +0 -22
- package/contracts/test/TestPool.sol +0 -27
- package/contracts/test/TestProduct.sol +0 -74
- package/contracts/types/ReferralId.sol +0 -48
@@ -0,0 +1,332 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.20;
|
3
|
+
|
4
|
+
import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";
|
5
|
+
|
6
|
+
import {NftId} from "../types/NftId.sol";
|
7
|
+
import {RoleId} from "../types/RoleId.sol";
|
8
|
+
import {ObjectType, ObjectTypeLib, zeroObjectType, REGISTRY, SERVICE} from "../types/ObjectType.sol";
|
9
|
+
import {VersionPart, VersionPartLib} from "../types/Version.sol";
|
10
|
+
import {Timestamp, TimestampLib} from "../types/Timestamp.sol";
|
11
|
+
|
12
|
+
import {IService} from "../shared/IService.sol";
|
13
|
+
|
14
|
+
import {IRegistry} from "./IRegistry.sol";
|
15
|
+
import {Registry} from "./Registry.sol";
|
16
|
+
import {IRegistryService} from "./IRegistryService.sol";
|
17
|
+
import {RegistryAccessManager} from "./RegistryAccessManager.sol";
|
18
|
+
|
19
|
+
|
20
|
+
contract ReleaseManager is AccessManaged
|
21
|
+
{
|
22
|
+
using ObjectTypeLib for ObjectType;
|
23
|
+
|
24
|
+
event LogReleaseCreation(VersionPart version);
|
25
|
+
event LogReleaseActivation(VersionPart version);
|
26
|
+
|
27
|
+
// createNextRelease
|
28
|
+
error NotRegistryService();
|
29
|
+
error UnexpectedServiceAuthority(address expected, address found);
|
30
|
+
|
31
|
+
// registerService
|
32
|
+
error NotService();
|
33
|
+
|
34
|
+
// activateNextRelease
|
35
|
+
error ReleaseNotCreated();
|
36
|
+
error ReleaseRegistrationNotFinished();
|
37
|
+
|
38
|
+
// _getAndVerifyContractInfo
|
39
|
+
error UnexpectedRegisterableType(ObjectType expected, ObjectType found);
|
40
|
+
error NotRegisterableOwner(address notOwner);
|
41
|
+
error SelfRegistration();
|
42
|
+
error RegisterableOwnerIsRegistered();
|
43
|
+
|
44
|
+
// _verifyServiceInfo
|
45
|
+
error UnexpectedServiceVersion(VersionPart expected, VersionPart found);
|
46
|
+
error UnexpectedServiceDomain(ObjectType expected, ObjectType found);
|
47
|
+
|
48
|
+
// _verifyAndStoreConfig
|
49
|
+
error ConfigMissing();
|
50
|
+
error ConfigServiceDomainInvalid(uint configArrayIndex, ObjectType domain);
|
51
|
+
error ConfigSelectorZero(uint configArrayIndex);
|
52
|
+
error SelectorAlreadyExists(VersionPart releaseVersion, ObjectType serviceDomain);
|
53
|
+
|
54
|
+
|
55
|
+
RegistryAccessManager private immutable _accessManager;
|
56
|
+
IRegistry private immutable _registry;
|
57
|
+
|
58
|
+
VersionPart immutable _initial;// first active version
|
59
|
+
VersionPart _latest;// latest active version
|
60
|
+
VersionPart _next;// version to create and activate
|
61
|
+
|
62
|
+
mapping(VersionPart version => IRegistry.ReleaseInfo info) _release;
|
63
|
+
|
64
|
+
mapping(VersionPart version => mapping(ObjectType serviceDomain => bytes4)) _selector; // registry service function selector assigned to domain
|
65
|
+
|
66
|
+
uint _awaitingRegistration; // "services left to register" counter
|
67
|
+
|
68
|
+
mapping(address registryService => bool isActive) _active;
|
69
|
+
|
70
|
+
mapping(VersionPart version => bool isValid) _valid; // TODO refactor to use _active only
|
71
|
+
|
72
|
+
constructor(
|
73
|
+
RegistryAccessManager accessManager,
|
74
|
+
VersionPart initialVersion)
|
75
|
+
AccessManaged(accessManager.authority())
|
76
|
+
{
|
77
|
+
require(initialVersion.toInt() > 0, "ReleaseManager: initial version is 0");
|
78
|
+
|
79
|
+
_accessManager = accessManager;
|
80
|
+
|
81
|
+
_initial = initialVersion;
|
82
|
+
_next = initialVersion;
|
83
|
+
|
84
|
+
_registry = new Registry();
|
85
|
+
}
|
86
|
+
|
87
|
+
/// @dev skips previous release if was not activated
|
88
|
+
function createNextRelease()
|
89
|
+
external
|
90
|
+
restricted // GIF_ADMIN_ROLE
|
91
|
+
{
|
92
|
+
// allow to register new registry service for next version
|
93
|
+
VersionPartLib.toVersionPart(_next.toInt() + 1);
|
94
|
+
// disallow registration of regular services for next version while registry service is not registered
|
95
|
+
_awaitingRegistration = 0;
|
96
|
+
|
97
|
+
emit LogReleaseCreation(_next);
|
98
|
+
}
|
99
|
+
|
100
|
+
function activateNextRelease()
|
101
|
+
external
|
102
|
+
restricted // GIF_ADMIN_ROLE
|
103
|
+
{
|
104
|
+
VersionPart version = _next;
|
105
|
+
address service = _registry.getServiceAddress(REGISTRY(), version);
|
106
|
+
|
107
|
+
// release was created
|
108
|
+
if(service == address(0)) {
|
109
|
+
revert ReleaseNotCreated();
|
110
|
+
}
|
111
|
+
|
112
|
+
// release fully deployed
|
113
|
+
if(_awaitingRegistration > 0) {
|
114
|
+
revert ReleaseRegistrationNotFinished();
|
115
|
+
}
|
116
|
+
|
117
|
+
//setTargetClosed(service, false);
|
118
|
+
|
119
|
+
_latest = version;
|
120
|
+
|
121
|
+
_active[service] = true;
|
122
|
+
_valid[version] = true;
|
123
|
+
|
124
|
+
emit LogReleaseActivation(version);
|
125
|
+
}
|
126
|
+
|
127
|
+
// TODO deploy proxy and initialize with given implementation instead of using given proxy?
|
128
|
+
// IMPORTANT: MUST never be possible to create with access/release manager, token registry
|
129
|
+
// callable once per release after release creation, can not register regular services while registry service is not registered
|
130
|
+
function registerRegistryService(IRegistryService service)
|
131
|
+
external
|
132
|
+
restricted // GIF_MANAGER_ROLE
|
133
|
+
returns(NftId nftId)
|
134
|
+
{
|
135
|
+
if(!service.supportsInterface(type(IRegistryService).interfaceId)) {
|
136
|
+
revert NotRegistryService();
|
137
|
+
}
|
138
|
+
|
139
|
+
// TODO unreliable! MUST guarantee the same authority -> how?
|
140
|
+
address serviceAuthority = service.authority();
|
141
|
+
if(serviceAuthority != authority()) {
|
142
|
+
revert UnexpectedServiceAuthority(
|
143
|
+
authority(),
|
144
|
+
serviceAuthority);
|
145
|
+
}
|
146
|
+
|
147
|
+
IRegistry.ObjectInfo memory info = _getAndVerifyContractInfo(service, SERVICE(), msg.sender);
|
148
|
+
|
149
|
+
VersionPart version = _next;
|
150
|
+
ObjectType domain = REGISTRY();
|
151
|
+
_verifyServiceInfo(info, version, domain);
|
152
|
+
|
153
|
+
// data: config bytes
|
154
|
+
_createRelease(service.getFunctionConfigs());
|
155
|
+
|
156
|
+
//setTargetClosed(service, true);
|
157
|
+
|
158
|
+
nftId = _registry.registerService(info, version, domain);
|
159
|
+
|
160
|
+
// external call
|
161
|
+
service.linkToRegisteredNftId();
|
162
|
+
}
|
163
|
+
|
164
|
+
// TODO adding service to release -> synchronized with proxy upgrades or simple addServiceToRelease(service, version, selector)?
|
165
|
+
// TODO removing service from release? -> set _active to false forever, but keep all other records?
|
166
|
+
function registerService(IService service)
|
167
|
+
external
|
168
|
+
restricted // GIF_MANAGER_ROLE
|
169
|
+
returns(NftId nftId)
|
170
|
+
{
|
171
|
+
if(!service.supportsInterface(type(IService).interfaceId)) {
|
172
|
+
revert NotService();
|
173
|
+
}
|
174
|
+
|
175
|
+
IRegistry.ObjectInfo memory info = _getAndVerifyContractInfo(service, SERVICE(), msg.sender);
|
176
|
+
VersionPart version = getNextVersion();
|
177
|
+
ObjectType domain = _release[version].domains[_awaitingRegistration];// reversed registration order of services specified in RegistryService config
|
178
|
+
_verifyServiceInfo(info, version, domain);
|
179
|
+
|
180
|
+
// setup and grant unique role if service does registrations
|
181
|
+
bytes4[] memory selector = new bytes4[](1);
|
182
|
+
selector[0] = _selector[version][domain];
|
183
|
+
address registryService = _registry.getServiceAddress(REGISTRY(), version);
|
184
|
+
if(selector[0] != 0) {
|
185
|
+
_accessManager.setAndGrantUniqueRole(
|
186
|
+
address(service),
|
187
|
+
registryService,
|
188
|
+
selector);
|
189
|
+
}
|
190
|
+
|
191
|
+
_awaitingRegistration--;
|
192
|
+
|
193
|
+
nftId = _registry.registerService(info, version, domain);
|
194
|
+
|
195
|
+
// external call
|
196
|
+
service.linkToRegisteredNftId();
|
197
|
+
}
|
198
|
+
|
199
|
+
//--- view functions ----------------------------------------------------//
|
200
|
+
|
201
|
+
function isActiveRegistryService(address service) external view returns(bool)
|
202
|
+
{
|
203
|
+
return _active[service];
|
204
|
+
}
|
205
|
+
|
206
|
+
function isValidRelease(VersionPart version) external view returns(bool)
|
207
|
+
{
|
208
|
+
return _valid[version];
|
209
|
+
}
|
210
|
+
|
211
|
+
function getRegistry() external view returns(address)
|
212
|
+
{
|
213
|
+
return (address(_registry));
|
214
|
+
}
|
215
|
+
|
216
|
+
function getReleaseInfo(VersionPart version) external view returns(IRegistry.ReleaseInfo memory)
|
217
|
+
{
|
218
|
+
return _release[version];
|
219
|
+
}
|
220
|
+
|
221
|
+
function getNextVersion() public view returns(VersionPart)
|
222
|
+
{
|
223
|
+
return _next;
|
224
|
+
}
|
225
|
+
|
226
|
+
function getLatestVersion() external view returns(VersionPart) {
|
227
|
+
return _latest;
|
228
|
+
}
|
229
|
+
|
230
|
+
function getInitialVersion() external view returns(VersionPart) {
|
231
|
+
return _initial;
|
232
|
+
}
|
233
|
+
|
234
|
+
//--- private functions ----------------------------------------------------//
|
235
|
+
|
236
|
+
function _getAndVerifyContractInfo(
|
237
|
+
IService service,
|
238
|
+
ObjectType expectedType,
|
239
|
+
address expectedOwner // assume always valid, can not be 0
|
240
|
+
)
|
241
|
+
internal
|
242
|
+
// view
|
243
|
+
returns(
|
244
|
+
IRegistry.ObjectInfo memory info
|
245
|
+
)
|
246
|
+
{
|
247
|
+
info = service.getInitialInfo();
|
248
|
+
info.objectAddress = address(service);
|
249
|
+
info.isInterceptor = false; // service is never interceptor, at least now
|
250
|
+
|
251
|
+
if(info.objectType != expectedType) {// type is checked in registry anyway...but service logic may depend on expected value
|
252
|
+
revert UnexpectedRegisterableType(expectedType, info.objectType);
|
253
|
+
}
|
254
|
+
|
255
|
+
address owner = info.initialOwner;
|
256
|
+
|
257
|
+
if(owner != expectedOwner) { // registerable owner protection
|
258
|
+
revert NotRegisterableOwner(expectedOwner);
|
259
|
+
}
|
260
|
+
|
261
|
+
if(owner == address(service)) {
|
262
|
+
revert SelfRegistration();
|
263
|
+
}
|
264
|
+
|
265
|
+
if(_registry.isRegistered(owner)) {
|
266
|
+
revert RegisterableOwnerIsRegistered();
|
267
|
+
}
|
268
|
+
}
|
269
|
+
|
270
|
+
function _verifyServiceInfo(
|
271
|
+
IRegistry.ObjectInfo memory info,
|
272
|
+
VersionPart expectedVersion,
|
273
|
+
ObjectType expectedDomain
|
274
|
+
)
|
275
|
+
internal
|
276
|
+
view
|
277
|
+
returns(ObjectType)
|
278
|
+
{
|
279
|
+
(
|
280
|
+
ObjectType domain,
|
281
|
+
VersionPart version
|
282
|
+
) = abi.decode(info.data, (ObjectType, VersionPart));
|
283
|
+
|
284
|
+
if(version != expectedVersion) {
|
285
|
+
revert UnexpectedServiceVersion(expectedVersion, version);
|
286
|
+
}
|
287
|
+
|
288
|
+
if(domain != expectedDomain) {
|
289
|
+
revert UnexpectedServiceDomain(expectedDomain, domain);
|
290
|
+
}
|
291
|
+
|
292
|
+
return domain;
|
293
|
+
}
|
294
|
+
|
295
|
+
// TODO check if registry supports types specified in the config array
|
296
|
+
function _createRelease(IRegistryService.FunctionConfig[] memory config)
|
297
|
+
internal
|
298
|
+
{
|
299
|
+
VersionPart version = getNextVersion();
|
300
|
+
|
301
|
+
if(config.length == 0) {
|
302
|
+
revert ConfigMissing();
|
303
|
+
}
|
304
|
+
// always in release
|
305
|
+
_release[version].domains.push(REGISTRY());
|
306
|
+
for(uint idx = 0; idx < config.length; idx++)
|
307
|
+
{
|
308
|
+
ObjectType domain = config[idx].serviceDomain;
|
309
|
+
bytes4 selector = config[idx].selector;
|
310
|
+
|
311
|
+
// not "registry service" / zero domain
|
312
|
+
if(
|
313
|
+
domain == REGISTRY() ||
|
314
|
+
domain.eqz()
|
315
|
+
) { revert ConfigServiceDomainInvalid(idx, domain); }
|
316
|
+
|
317
|
+
// TODO can be zero -> e.g. duplicate domain, first with zero selector, second with non zero selector -> need to check _release[version].domains.contains(domain) instead
|
318
|
+
// no overwrite
|
319
|
+
if(_selector[version][domain] > 0) {
|
320
|
+
revert SelectorAlreadyExists(version, domain);
|
321
|
+
}
|
322
|
+
|
323
|
+
_selector[version][domain] = selector;
|
324
|
+
_release[version].domains.push(domain);
|
325
|
+
}
|
326
|
+
// TODO set when activated?
|
327
|
+
_release[version].createdAt = TimestampLib.blockTimestamp();
|
328
|
+
//_release[version].updatedAt = TimestampLib.blockTimestamp();
|
329
|
+
|
330
|
+
_awaitingRegistration = config.length;
|
331
|
+
}
|
332
|
+
}
|
@@ -0,0 +1,112 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.20;
|
3
|
+
|
4
|
+
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
|
5
|
+
import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
|
6
|
+
|
7
|
+
import {IRegisterable} from "../shared/IRegisterable.sol";
|
8
|
+
import {IRegistry} from "./IRegistry.sol";
|
9
|
+
import {VersionPart} from "../types/Version.sol";
|
10
|
+
import {REGISTRY} from "../types/ObjectType.sol";
|
11
|
+
import {NftOwnable} from "../shared/NftOwnable.sol";
|
12
|
+
|
13
|
+
/// @title contract to register token per GIF major release.
|
14
|
+
contract TokenRegistry is
|
15
|
+
NftOwnable
|
16
|
+
{
|
17
|
+
event LogRegistered(address token, string symbol, uint256 decimals);
|
18
|
+
event LogTokenStateSet(address token, VersionPart majorVersion, bool active);
|
19
|
+
|
20
|
+
error NotContract(address account);
|
21
|
+
error NotToken(address account);
|
22
|
+
error TokenDecimalsZero();
|
23
|
+
error TokenMajorVersionInvalid(VersionPart majorVersion);
|
24
|
+
|
25
|
+
address [] internal _token;
|
26
|
+
mapping(address token => bool registered) internal _registered;
|
27
|
+
mapping(address token => mapping(VersionPart majorVersion => bool isActive)) internal _active;
|
28
|
+
|
29
|
+
constructor()
|
30
|
+
NftOwnable()
|
31
|
+
{ }
|
32
|
+
|
33
|
+
|
34
|
+
/// @dev link ownership of token registry to nft owner of registry service
|
35
|
+
// TODO latter registry service will get new release, new address, new nft, TokenRegistry will not catch that -> use AccessManaged only for services
|
36
|
+
function linkToNftOwnable(address registryAddress)
|
37
|
+
external
|
38
|
+
onlyOwner
|
39
|
+
{
|
40
|
+
IRegistry registry = IRegistry(registryAddress);
|
41
|
+
// TODO use _latest instead of _initial -> but _latest is 0 before first release activation
|
42
|
+
address registryServiceAddress = registry.getServiceAddress(REGISTRY(), registry.getNextVersion());
|
43
|
+
//address registryServiceAddress = registry.getServiceAddress(REGISTRY(), registry.getInitialVersion());
|
44
|
+
|
45
|
+
_linkToNftOwnable(registryAddress, registryServiceAddress);
|
46
|
+
}
|
47
|
+
|
48
|
+
/// @dev token state is informative, registry have no clue about used tokens
|
49
|
+
// component owner is responsible for token selection and operations
|
50
|
+
// service MUST deny registration of component with inactive token
|
51
|
+
function setActive(address token, VersionPart majorVersion, bool active)
|
52
|
+
external
|
53
|
+
onlyOwner
|
54
|
+
{
|
55
|
+
// verify that token is registered
|
56
|
+
if (!_registered[token]) {
|
57
|
+
_registerToken(token);
|
58
|
+
}
|
59
|
+
|
60
|
+
// verify valid major version
|
61
|
+
// ensure major version increments is one
|
62
|
+
uint256 version = majorVersion.toInt();
|
63
|
+
if (!_registry.isValidRelease(majorVersion)) {
|
64
|
+
revert TokenMajorVersionInvalid(majorVersion);
|
65
|
+
}
|
66
|
+
|
67
|
+
_active[token][majorVersion] = active;
|
68
|
+
|
69
|
+
emit LogTokenStateSet(token, majorVersion, active);
|
70
|
+
}
|
71
|
+
|
72
|
+
function tokens() external view returns (uint256) {
|
73
|
+
return _token.length;
|
74
|
+
}
|
75
|
+
|
76
|
+
function getToken(uint256 idx) external view returns (IERC20Metadata token) {
|
77
|
+
return IERC20Metadata(_token[idx]);
|
78
|
+
}
|
79
|
+
|
80
|
+
function isRegistered(address token) external view returns (bool) {
|
81
|
+
return _registered[token];
|
82
|
+
}
|
83
|
+
|
84
|
+
function isActive(address token, VersionPart majorVersion) external view returns (bool) {
|
85
|
+
return _active[token][majorVersion];
|
86
|
+
}
|
87
|
+
|
88
|
+
/// @dev some sanity checks to prevent unintended registration
|
89
|
+
function _registerToken(address token) internal {
|
90
|
+
|
91
|
+
// MUST be contract
|
92
|
+
if(token.code.length == 0) {
|
93
|
+
revert NotContract(token);
|
94
|
+
}
|
95
|
+
|
96
|
+
// MUST not be GIF registerable
|
97
|
+
if(ERC165Checker.supportsInterface(token, type(IRegisterable).interfaceId)) {
|
98
|
+
revert NotToken(token);
|
99
|
+
}
|
100
|
+
|
101
|
+
// MUST have decimals > 0
|
102
|
+
IERC20Metadata erc20 = IERC20Metadata(token);
|
103
|
+
if(erc20.decimals() == 0) {
|
104
|
+
revert TokenDecimalsZero();
|
105
|
+
}
|
106
|
+
|
107
|
+
_registered[token] = true;
|
108
|
+
_token.push(token);
|
109
|
+
|
110
|
+
emit LogRegistered(token, erc20.symbol(), erc20.decimals());
|
111
|
+
}
|
112
|
+
}
|
@@ -7,14 +7,18 @@ contract ERC165 is IERC165 {
|
|
7
7
|
mapping(bytes4 => bool) private _isSupported;
|
8
8
|
|
9
9
|
constructor() {
|
10
|
-
|
11
|
-
_registerInterface(type(IERC165).interfaceId);
|
10
|
+
_initializeERC165();
|
12
11
|
}
|
13
12
|
|
14
13
|
function supportsInterface(bytes4 interfaceId) external view override returns (bool) {
|
15
14
|
return _isSupported[interfaceId];
|
16
15
|
}
|
17
16
|
|
17
|
+
// @dev register support for ERC165 itself
|
18
|
+
function _initializeERC165() internal {
|
19
|
+
_isSupported[type(IERC165).interfaceId] = true;
|
20
|
+
}
|
21
|
+
|
18
22
|
function _registerInterface(bytes4 interfaceId) internal {
|
19
23
|
_isSupported[interfaceId] = true;
|
20
24
|
}
|
@@ -5,13 +5,11 @@ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
|
|
5
5
|
|
6
6
|
import {INftOwnable} from "./INftOwnable.sol";
|
7
7
|
import {IRegistry} from "../registry/IRegistry.sol";
|
8
|
-
import {NftId} from "../types/NftId.sol";
|
9
|
-
import {ObjectType} from "../types/ObjectType.sol";
|
10
8
|
|
11
9
|
interface IRegisterable is IERC165, INftOwnable {
|
12
10
|
|
13
11
|
function getInitialInfo()
|
14
12
|
external
|
15
13
|
view
|
16
|
-
returns (IRegistry.ObjectInfo memory
|
14
|
+
returns (IRegistry.ObjectInfo memory);
|
17
15
|
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.19;
|
3
|
+
|
4
|
+
import {VersionPart} from "../types/Version.sol";
|
5
|
+
import {ObjectType} from "../types/ObjectType.sol";
|
6
|
+
|
7
|
+
import {IRegisterable} from "./IRegisterable.sol";
|
8
|
+
import {IVersionable} from "./IVersionable.sol";
|
9
|
+
|
10
|
+
interface IService is
|
11
|
+
IRegisterable,
|
12
|
+
IVersionable
|
13
|
+
{
|
14
|
+
function getDomain() external pure returns(ObjectType serviceDomain);
|
15
|
+
function getMajorVersion() external view returns(VersionPart majorVersion);
|
16
|
+
}
|
@@ -5,18 +5,17 @@ import {INftOwnable} from "./INftOwnable.sol";
|
|
5
5
|
import {IRegistry} from "../registry/IRegistry.sol";
|
6
6
|
import {NftId, zeroNftId} from "../types/NftId.sol";
|
7
7
|
|
8
|
+
// TODO make contract upgradeable
|
8
9
|
contract NftOwnable is INftOwnable {
|
9
10
|
|
11
|
+
// TODO move vars to struct and add _getNftOwnableStorage
|
10
12
|
IRegistry internal _registry;
|
11
13
|
NftId private _nftId;
|
12
14
|
address private _initialOwner;
|
13
15
|
|
14
16
|
/// @dev enforces msg.sender is owner of nft (or initial owner of nft ownable)
|
15
17
|
modifier onlyOwner() {
|
16
|
-
|
17
|
-
|
18
|
-
// owner == address(0) is eg uninitialized upgradable contract
|
19
|
-
if (owner != address(0) && msg.sender != owner) {
|
18
|
+
if (msg.sender != getOwner()) {
|
20
19
|
revert ErrorNotOwner(msg.sender);
|
21
20
|
}
|
22
21
|
_;
|
@@ -58,6 +57,9 @@ contract NftOwnable is INftOwnable {
|
|
58
57
|
return _nftId;
|
59
58
|
}
|
60
59
|
|
60
|
+
function getInitialOwner() public view returns (address) {
|
61
|
+
return _initialOwner;
|
62
|
+
}
|
61
63
|
|
62
64
|
function getOwner() public view virtual override returns (address) {
|
63
65
|
if (_nftId.gtz()) {
|
@@ -77,6 +79,7 @@ contract NftOwnable is INftOwnable {
|
|
77
79
|
internal
|
78
80
|
virtual
|
79
81
|
{
|
82
|
+
require(initialOwner > address(0), "NftOwnable: initial owner is 0");
|
80
83
|
_initialOwner = initialOwner;
|
81
84
|
_setRegistry(registryAddress);
|
82
85
|
}
|
@@ -38,6 +38,7 @@ contract ProxyManager is
|
|
38
38
|
returns (IVersionable versionable)
|
39
39
|
{
|
40
40
|
if (_isDeployed) { revert ErrorAlreadyDeployed(); }
|
41
|
+
_isDeployed = true;
|
41
42
|
|
42
43
|
address currentProxyOwner = getOwner(); // used by implementation
|
43
44
|
address initialProxyAdminOwner = address(this); // used by proxy
|
@@ -49,7 +50,6 @@ contract ProxyManager is
|
|
49
50
|
data
|
50
51
|
);
|
51
52
|
|
52
|
-
_isDeployed = true;
|
53
53
|
versionable = IVersionable(address(_proxy));
|
54
54
|
|
55
55
|
emit LogProxyDeployed(address(_proxy), initialImplementation);
|
@@ -49,6 +49,7 @@ contract Registerable is
|
|
49
49
|
//onlyInitializing//TODO uncomment when "fully" upgradeable
|
50
50
|
virtual
|
51
51
|
{
|
52
|
+
_initializeERC165();
|
52
53
|
_initializeNftOwnable(
|
53
54
|
initialOwner,
|
54
55
|
registryAddress);
|
@@ -70,20 +71,16 @@ contract Registerable is
|
|
70
71
|
public
|
71
72
|
view
|
72
73
|
virtual
|
73
|
-
returns (IRegistry.ObjectInfo memory
|
74
|
+
returns (IRegistry.ObjectInfo memory info)
|
74
75
|
{
|
75
|
-
RegisterableStorage
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
$._data
|
85
|
-
),
|
86
|
-
bytes("")
|
87
|
-
);
|
76
|
+
RegisterableStorage memory $ = _getRegisterableStorage();
|
77
|
+
info = IRegistry.ObjectInfo(
|
78
|
+
zeroNftId(),
|
79
|
+
$._parentNftId,
|
80
|
+
$._objectType,
|
81
|
+
$._isInterceptor,
|
82
|
+
address(this),
|
83
|
+
getInitialOwner(),
|
84
|
+
$._data);
|
88
85
|
}
|
89
86
|
}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.19;
|
3
|
+
|
4
|
+
import {ObjectType, SERVICE} from "../types/ObjectType.sol";
|
5
|
+
import {NftId, zeroNftId} from "../types/NftId.sol";
|
6
|
+
import {Version, VersionPart, VersionLib} from "../types/Version.sol";
|
7
|
+
|
8
|
+
import {Versionable} from "./Versionable.sol";
|
9
|
+
import {IService} from "./IService.sol";
|
10
|
+
import {IVersionable} from "./IVersionable.sol";
|
11
|
+
import {Versionable} from "./Versionable.sol";
|
12
|
+
import {Registerable} from "./Registerable.sol";
|
13
|
+
|
14
|
+
import {IRegistry} from "../registry/IRegistry.sol";
|
15
|
+
|
16
|
+
|
17
|
+
/// @dev service base contract
|
18
|
+
abstract contract Service is
|
19
|
+
Registerable,
|
20
|
+
Versionable,
|
21
|
+
IService
|
22
|
+
{
|
23
|
+
function getDomain() public pure virtual override returns(ObjectType);
|
24
|
+
|
25
|
+
function getMajorVersion() public view virtual override returns(VersionPart majorVersion) {
|
26
|
+
return getVersion().toMajorPart();
|
27
|
+
}
|
28
|
+
|
29
|
+
// from Versionable
|
30
|
+
function getVersion()
|
31
|
+
public
|
32
|
+
pure
|
33
|
+
virtual override (IVersionable, Versionable)
|
34
|
+
returns(Version)
|
35
|
+
{
|
36
|
+
return VersionLib.toVersion(3,0,0);
|
37
|
+
}
|
38
|
+
|
39
|
+
function _initializeService(
|
40
|
+
address registry,
|
41
|
+
address initialOwner
|
42
|
+
)
|
43
|
+
internal
|
44
|
+
virtual
|
45
|
+
//onlyInitializing //TODO uncomment when "fully" upgradeable
|
46
|
+
{
|
47
|
+
// service must provide its name and version upon registration
|
48
|
+
bytes memory data = abi.encode(getDomain(), getMajorVersion());
|
49
|
+
NftId registryNftId = _getRegistryNftId(registry);
|
50
|
+
bool isInterceptor = false;
|
51
|
+
|
52
|
+
_initializeRegisterable(registry, registryNftId, SERVICE(), isInterceptor, initialOwner, data);
|
53
|
+
_registerInterface(type(IService).interfaceId);
|
54
|
+
}
|
55
|
+
|
56
|
+
// this is just a conveniene function, actual validation will be done upon registration
|
57
|
+
function _getRegistryNftId(address registryAddress) internal view returns (NftId) {
|
58
|
+
return IRegistry(registryAddress).getNftId(registryAddress);
|
59
|
+
}
|
60
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.20;
|
3
|
+
|
4
|
+
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
|
5
|
+
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
|
6
|
+
|
7
|
+
contract TokenHandler {
|
8
|
+
IERC20Metadata private _token;
|
9
|
+
|
10
|
+
constructor(address token) {
|
11
|
+
_token = IERC20Metadata(token);
|
12
|
+
}
|
13
|
+
|
14
|
+
// TODO add logging
|
15
|
+
function transfer(
|
16
|
+
address from,
|
17
|
+
address to,
|
18
|
+
uint256 amount // TODO add authz (only treasury/instance/product/pool/ service)
|
19
|
+
) external {
|
20
|
+
SafeERC20.safeTransferFrom(_token, from, to, amount);
|
21
|
+
// _token.transferFrom(from, to, amount);
|
22
|
+
}
|
23
|
+
|
24
|
+
function getToken() external view returns (IERC20Metadata) {
|
25
|
+
return _token;
|
26
|
+
}
|
27
|
+
}
|