@etherisc/gif-next 0.0.2-b9e9dc3-713 → 0.0.2-bc11089-132
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 +67 -1
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +155 -0
- package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/components/Distribution.sol/Distribution.json +177 -15
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +117 -0
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +28 -2
- package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.json +209 -16
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +179 -50
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
- 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/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +4 -0
- package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +1206 -0
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +4 -0
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +788 -0
- package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +4 -0
- package/artifacts/contracts/instance/{AccessManagedSimple.sol/AccessManagedSimple.json → Cloneable.sol/Cloneable.json} +86 -2
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1408 -22
- package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
- package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.json +448 -0
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +120 -0
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +200 -624
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +283 -143
- package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.dbg.json +4 -0
- package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.json +763 -0
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +202 -37
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +344 -56
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +97 -13
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +4 -0
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +285 -0
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +40 -0
- package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
- 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 +2 -2
- 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 +1 -1
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +54 -22
- package/artifacts/contracts/instance/module/IBundle.sol/IBundle.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/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
- package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
- package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +923 -0
- package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +440 -0
- package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +18 -18
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +684 -0
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +428 -0
- package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +669 -0
- package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +664 -0
- package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +9 -71
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +17 -232
- package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +984 -0
- package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +464 -0
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +718 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +428 -0
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +768 -0
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +420 -0
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +201 -0
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +94 -19
- 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 +172 -49
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +61 -29
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +47 -34
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +410 -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/IService.sol/IService.dbg.json +4 -0
- package/artifacts/contracts/{instance/base → shared}/IService.sol/IService.json +1 -1
- 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 +2 -2
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
- package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/shared/Registerable.sol/Registerable.json +4 -4
- package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +4 -0
- package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.json +442 -0
- package/artifacts/contracts/shared/Service.sol/Service.dbg.json +4 -0
- package/artifacts/contracts/{instance/base/ServiceBase.sol/ServiceBase.json → shared/Service.sol/Service.json} +2 -2
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
- 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 +4 -4
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
- package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
- package/artifacts/contracts/test/TestService.sol/TestService.json +11 -11
- 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 +2 -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 +1 -1
- 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/NftId.sol/NftIdLib.dbg.json +1 -1
- 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 +1 -1
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
- package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
- package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
- 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/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/BaseComponent.sol +73 -11
- package/contracts/components/Distribution.sol +15 -18
- package/contracts/components/IBaseComponent.sol +8 -0
- package/contracts/components/IDistributionComponent.sol +1 -0
- package/contracts/components/IPoolComponent.sol +5 -1
- package/contracts/components/Pool.sol +43 -31
- package/contracts/components/Product.sol +42 -47
- package/contracts/instance/AccessManagerUpgradeableInitializeable.sol +23 -0
- package/contracts/instance/BundleManager.sol +129 -0
- package/contracts/instance/Cloneable.sol +46 -0
- package/contracts/instance/IInstance.sol +41 -7
- package/contracts/instance/IInstanceBase.sol +26 -0
- package/contracts/instance/IInstanceService.sol +29 -8
- package/contracts/instance/Instance.sol +66 -226
- package/contracts/instance/InstanceAccessManager.sol +94 -78
- package/contracts/instance/InstanceBase.sol +41 -0
- package/contracts/instance/InstanceReader.sol +36 -1
- package/contracts/instance/InstanceService.sol +245 -47
- package/contracts/instance/InstanceServiceManager.sol +6 -5
- package/contracts/instance/ObjectManager.sol +101 -0
- package/contracts/instance/base/ComponentServiceBase.sol +44 -21
- package/contracts/instance/module/IAccess.sol +27 -17
- package/contracts/instance/module/IBundle.sol +1 -0
- package/contracts/instance/module/ISetup.sol +3 -0
- package/contracts/instance/service/BundleService.sol +260 -0
- package/contracts/instance/service/BundleServiceManager.sol +54 -0
- package/contracts/instance/service/ComponentOwnerService.sol +5 -5
- package/contracts/instance/service/DistributionService.sol +118 -0
- package/contracts/instance/service/DistributionServiceManager.sol +54 -0
- package/contracts/instance/service/IBundleService.sol +45 -0
- package/contracts/instance/service/IComponentOwnerService.sol +1 -1
- package/contracts/instance/service/IDistributionService.sol +1 -1
- package/contracts/instance/service/IPolicyService.sol +87 -0
- package/contracts/instance/service/IPoolService.sol +7 -24
- package/contracts/instance/service/IProductService.sol +7 -74
- package/contracts/instance/service/PolicyService.sol +508 -0
- package/contracts/instance/service/PolicyServiceManager.sol +54 -0
- package/contracts/instance/service/PoolService.sol +124 -0
- package/contracts/instance/service/PoolServiceManager.sol +54 -0
- package/contracts/instance/service/ProductService.sol +173 -0
- package/contracts/instance/service/ProductServiceManager.sol +54 -0
- package/contracts/registry/IRegistry.sol +26 -2
- package/contracts/registry/IRegistryService.sol +34 -19
- package/contracts/registry/Registry.sol +61 -36
- package/contracts/registry/RegistryService.sol +42 -124
- package/contracts/registry/RegistryServiceManager.sol +21 -5
- package/contracts/registry/TokenRegistry.sol +111 -0
- package/contracts/shared/ERC165.sol +6 -2
- package/contracts/{instance/base → shared}/IService.sol +3 -3
- package/contracts/shared/NftOwnable.sol +2 -4
- package/contracts/shared/Registerable.sol +1 -0
- package/contracts/shared/RegisterableUpgradable.sol +16 -0
- package/contracts/shared/Service.sol +55 -0
- package/contracts/test/TestService.sol +3 -5
- package/contracts/types/NftIdSet.sol +26 -24
- package/contracts/types/RoleId.sol +10 -1
- package/contracts/types/StateId.sol +4 -0
- package/contracts/types/Version.sol +4 -1
- package/package.json +1 -1
- package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +0 -4
- package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +0 -4
- package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.json +0 -1119
- package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +0 -4
- package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.json +0 -1082
- package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +0 -4
- package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +0 -4
- package/contracts/instance/AccessManagedSimple.sol +0 -114
- package/contracts/instance/AccessManagerSimple.sol +0 -682
- package/contracts/instance/IAccessManagerSimple.sol +0 -391
- package/contracts/instance/base/ServiceBase.sol +0 -44
@@ -2,12 +2,12 @@
|
|
2
2
|
pragma solidity ^0.8.20;
|
3
3
|
|
4
4
|
import {IRegisterable} from "../shared/IRegisterable.sol";
|
5
|
-
import {IService} from "../
|
5
|
+
import {IService} from "../shared/IService.sol";
|
6
6
|
|
7
7
|
import {ChainNft} from "./ChainNft.sol";
|
8
8
|
import {IRegistry} from "./IRegistry.sol";
|
9
9
|
import {NftId, toNftId, zeroNftId, NftIdLib} from "../types/NftId.sol";
|
10
|
-
import {Version, VersionPart, VersionLib} from "../types/Version.sol";
|
10
|
+
import {Version, VersionPart, VersionLib, VersionPartLib} from "../types/Version.sol";
|
11
11
|
import {ObjectType, PROTOCOL, REGISTRY, TOKEN, SERVICE, INSTANCE, STAKE, PRODUCT, DISTRIBUTION, ORACLE, POOL, POLICY, BUNDLE} from "../types/ObjectType.sol";
|
12
12
|
import {ITransferInterceptor} from "./ITransferInterceptor.sol";
|
13
13
|
|
@@ -28,30 +28,17 @@ contract Registry is
|
|
28
28
|
ERC165,
|
29
29
|
IRegistry
|
30
30
|
{
|
31
|
-
|
32
|
-
error NotRegistryService();
|
33
|
-
error ZeroParentAddress();
|
34
|
-
error ContractAlreadyRegistered(address objectAddress);
|
35
|
-
error InvalidServiceVersion(VersionPart majorVersion);
|
36
|
-
error ServiceNameAlreadyRegistered(string name, VersionPart majorVersion);
|
37
|
-
|
38
|
-
// approve
|
39
|
-
error NotOwner();
|
40
|
-
error NotRegisteredContract(NftId registrarNftId);
|
41
|
-
error NotService(NftId registrarNftId);
|
42
|
-
error InvalidTypesCombination(ObjectType objectType, ObjectType parentType);
|
43
|
-
|
44
|
-
uint256 public constant MAJOR_VERSION_MIN = 3;
|
31
|
+
uint256 public constant GIF_MAJOR_VERSION_AT_DEPLOYMENT = 3;
|
45
32
|
address public constant NFT_LOCK_ADDRESS = address(0x1);
|
33
|
+
uint256 public constant REGISTRY_TOKEN_SEQUENCE_ID = 2;
|
46
34
|
uint256 public constant REGISTRY_SERVICE_TOKEN_SEQUENCE_ID = 3;
|
47
35
|
string public constant EMPTY_URI = "";
|
48
36
|
|
37
|
+
VersionPart internal _majorVersion;
|
38
|
+
|
49
39
|
mapping(NftId nftId => ObjectInfo info) internal _info;
|
50
40
|
mapping(address object => NftId nftId) internal _nftIdByAddress;
|
51
41
|
|
52
|
-
mapping(NftId registrator => mapping(
|
53
|
-
ObjectType objectType => bool)) internal _isApproved;
|
54
|
-
|
55
42
|
mapping(ObjectType objectType => mapping(
|
56
43
|
ObjectType parentType => bool)) internal _isValidContractCombination;
|
57
44
|
|
@@ -69,13 +56,12 @@ contract Registry is
|
|
69
56
|
|
70
57
|
modifier onlyOwner() {
|
71
58
|
if(msg.sender != getOwner()) {
|
72
|
-
revert NotOwner();
|
59
|
+
revert NotOwner(msg.sender);
|
73
60
|
}
|
74
61
|
_;
|
75
62
|
}
|
76
63
|
|
77
64
|
modifier onlyRegistryService() {
|
78
|
-
|
79
65
|
if(msg.sender != _info[_serviceNftId].objectAddress) {
|
80
66
|
revert NotRegistryService();
|
81
67
|
}
|
@@ -85,7 +71,10 @@ contract Registry is
|
|
85
71
|
constructor(address registryOwner, VersionPart majorVersion)
|
86
72
|
{
|
87
73
|
require(registryOwner > address(0), "Registry: registry owner is 0");
|
88
|
-
|
74
|
+
|
75
|
+
// major version at constructor time
|
76
|
+
_majorVersion = VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
|
77
|
+
emit LogInitialMajorVersionSet(_majorVersion);
|
89
78
|
|
90
79
|
// deploy NFT
|
91
80
|
_chainNft = new ChainNft(address(this));// adds 10kb to deployment size
|
@@ -101,6 +90,24 @@ contract Registry is
|
|
101
90
|
_registerInterface(type(IRegistry).interfaceId);
|
102
91
|
}
|
103
92
|
|
93
|
+
// from IRegistry
|
94
|
+
|
95
|
+
/// @dev latest GIF release version
|
96
|
+
function setMajorVersion(VersionPart newMajorVersion)
|
97
|
+
external
|
98
|
+
onlyOwner
|
99
|
+
{
|
100
|
+
// ensure major version increments is one
|
101
|
+
uint256 oldMax = _majorVersion.toInt();
|
102
|
+
uint256 newMax = newMajorVersion.toInt();
|
103
|
+
if (newMax <= oldMax || newMax - oldMax != 1) {
|
104
|
+
revert MajorVersionMaxIncreaseInvalid(newMajorVersion, _majorVersion);
|
105
|
+
}
|
106
|
+
|
107
|
+
_majorVersion = newMajorVersion;
|
108
|
+
emit LogMajorVersionSet(_majorVersion);
|
109
|
+
}
|
110
|
+
|
104
111
|
/// @dev registry protects only against tampering existing records, registering with invalid types pairs and 0 parent address
|
105
112
|
// TODO service registration means its approval for some type?
|
106
113
|
// TODO registration of precompile addresses
|
@@ -168,13 +175,35 @@ contract Registry is
|
|
168
175
|
|
169
176
|
emit LogRegistration(info);
|
170
177
|
}
|
178
|
+
/// @dev earliest GIF major version
|
179
|
+
function getMajorVersionMin() external view returns (VersionPart) {
|
180
|
+
return VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
|
181
|
+
}
|
182
|
+
|
183
|
+
// TODO make distinction between active an not yet active version
|
184
|
+
// need to be thought trough, not yet clear if necessary
|
185
|
+
// need to answer question: what is the latest version during the upgrade process?
|
186
|
+
// likely setting up a new gif version does not fit into a single tx
|
187
|
+
// in this case we might want to have a period where the latest version is
|
188
|
+
// in the process of being set up while the latest active version is 1 major release smaller
|
189
|
+
/// @dev latest GIF major version (might not yet be active)
|
190
|
+
function getMajorVersionMax() external view returns (VersionPart) {
|
191
|
+
return _majorVersion;
|
192
|
+
}
|
193
|
+
|
194
|
+
/// @dev latest active GIF release version
|
195
|
+
function getMajorVersion() external view returns (VersionPart) {
|
196
|
+
return _majorVersion;
|
197
|
+
}
|
171
198
|
|
172
|
-
// from IRegistry
|
173
199
|
function getObjectCount() external view override returns (uint256) {
|
174
|
-
|
175
200
|
return _chainNft.totalSupply();
|
176
201
|
}
|
177
202
|
|
203
|
+
function getNftId() external view returns (NftId nftId) {
|
204
|
+
return _registryNftId;
|
205
|
+
}
|
206
|
+
|
178
207
|
function getNftId(address object) external view override returns (NftId id) {
|
179
208
|
return _nftIdByAddress[object];
|
180
209
|
}
|
@@ -184,7 +213,6 @@ contract Registry is
|
|
184
213
|
}
|
185
214
|
|
186
215
|
function ownerOf(address contractAddress) public view returns (address) {
|
187
|
-
|
188
216
|
return _chainNft.ownerOf(_nftIdByAddress[contractAddress].toInt());
|
189
217
|
}
|
190
218
|
|
@@ -193,7 +221,6 @@ contract Registry is
|
|
193
221
|
}
|
194
222
|
|
195
223
|
function getObjectInfo(address object) external view override returns (ObjectInfo memory) {
|
196
|
-
|
197
224
|
return _info[_nftIdByAddress[object]];
|
198
225
|
}
|
199
226
|
|
@@ -205,6 +232,10 @@ contract Registry is
|
|
205
232
|
return _nftIdByAddress[object].gtz();
|
206
233
|
}
|
207
234
|
|
235
|
+
function isRegisteredService(address object) external view override returns (bool) {
|
236
|
+
return _nftIdByAddress[object].gtz() && _info[_nftIdByAddress[object]].objectType == SERVICE();
|
237
|
+
}
|
238
|
+
|
208
239
|
function getServiceName(NftId nftId) external view returns (string memory) {
|
209
240
|
return _string[nftId];
|
210
241
|
}
|
@@ -238,14 +269,8 @@ contract Registry is
|
|
238
269
|
) = abi.decode(info.data, (string, VersionPart));
|
239
270
|
bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
|
240
271
|
|
241
|
-
//
|
242
|
-
|
243
|
-
// TODO do not use names -> each object type is registered by corresponding service -> conflicting with approve()
|
244
|
-
if(
|
245
|
-
majorVersion.toInt() < MAJOR_VERSION_MIN ||
|
246
|
-
(majorVersion.toInt() > MAJOR_VERSION_MIN &&
|
247
|
-
_service[serviceNameHash][VersionLib.toVersionPart(majorVersion.toInt() - 1)] == address(0) )
|
248
|
-
) {
|
272
|
+
// ensures consistency of service.getVersion() and majorVersion here
|
273
|
+
if(majorVersion != _majorVersion) {
|
249
274
|
revert InvalidServiceVersion(majorVersion);
|
250
275
|
}
|
251
276
|
|
@@ -312,7 +337,7 @@ contract Registry is
|
|
312
337
|
function _registerRegistry(address registryOwner)
|
313
338
|
internal
|
314
339
|
{
|
315
|
-
uint256 registryId = _chainNft.calculateTokenId(
|
340
|
+
uint256 registryId = _chainNft.calculateTokenId(REGISTRY_TOKEN_SEQUENCE_ID);
|
316
341
|
NftId registryNftId = toNftId(registryId);
|
317
342
|
|
318
343
|
NftId parentNftId;
|
@@ -386,7 +411,7 @@ contract Registry is
|
|
386
411
|
|
387
412
|
string memory serviceName = "RegistryService";
|
388
413
|
bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
|
389
|
-
_service[serviceNameHash][VersionLib.toVersionPart(
|
414
|
+
_service[serviceNameHash][VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT)] = msg.sender;
|
390
415
|
_string[serviceNftId] = serviceName;
|
391
416
|
_serviceNftId = serviceNftId;
|
392
417
|
}
|
@@ -1,17 +1,13 @@
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
2
2
|
pragma solidity ^0.8.20;
|
3
3
|
|
4
|
-
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
|
5
4
|
import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
|
6
|
-
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
|
7
5
|
import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";
|
8
6
|
|
9
7
|
import {IRegistry} from "./IRegistry.sol";
|
10
8
|
import {IInstance} from "../instance/IInstance.sol";
|
11
9
|
|
12
10
|
import {ContractDeployerLib} from "../shared/ContractDeployerLib.sol";
|
13
|
-
// import {IComponent, IComponentModule} from "../../contracts/instance/module/component/IComponent.sol";
|
14
|
-
// import {IPool} from "../../contracts/instance/module/pool/IPoolModule.sol";
|
15
11
|
import {IBaseComponent} from "../../contracts/components/IBaseComponent.sol";
|
16
12
|
import {IPoolComponent} from "../../contracts/components/IPoolComponent.sol";
|
17
13
|
import {IProductComponent} from "../../contracts/components/IProductComponent.sol";
|
@@ -22,42 +18,24 @@ import {Versionable} from "../../contracts/shared/Versionable.sol";
|
|
22
18
|
import {IRegisterable} from "../../contracts/shared/IRegisterable.sol";
|
23
19
|
|
24
20
|
import {RoleId, PRODUCT_OWNER_ROLE, POOL_OWNER_ROLE, ORACLE_OWNER_ROLE} from "../../contracts/types/RoleId.sol";
|
25
|
-
import {ObjectType, REGISTRY,
|
21
|
+
import {ObjectType, REGISTRY, SERVICE, PRODUCT, ORACLE, POOL, INSTANCE, DISTRIBUTION, POLICY, BUNDLE, STAKE} from "../../contracts/types/ObjectType.sol";
|
26
22
|
import {StateId, ACTIVE, PAUSED} from "../../contracts/types/StateId.sol";
|
27
23
|
import {NftId, NftIdLib, zeroNftId} from "../../contracts/types/NftId.sol";
|
28
24
|
import {Fee, FeeLib} from "../../contracts/types/Fee.sol";
|
29
25
|
import {Version, VersionPart, VersionLib} from "../../contracts/types/Version.sol";
|
30
26
|
|
31
|
-
import {
|
32
|
-
import {IService} from "
|
27
|
+
import {Service} from "../shared/Service.sol";
|
28
|
+
import {IService} from "../shared/IService.sol";
|
33
29
|
import {IRegistryService} from "./IRegistryService.sol";
|
34
30
|
import {Registry} from "./Registry.sol";
|
35
|
-
import {ChainNft} from "./ChainNft.sol";
|
36
31
|
|
37
32
|
contract RegistryService is
|
38
33
|
AccessManagedUpgradeable,
|
39
|
-
|
34
|
+
Service,
|
40
35
|
IRegistryService
|
41
36
|
{
|
42
37
|
using NftIdLib for NftId;
|
43
38
|
|
44
|
-
error SelfRegistration();
|
45
|
-
error NotRegistryOwner();
|
46
|
-
|
47
|
-
error NotToken();
|
48
|
-
error NotService();
|
49
|
-
error NotInstance();
|
50
|
-
error NotProduct();
|
51
|
-
error NotPool();
|
52
|
-
error NotDistribution();
|
53
|
-
|
54
|
-
error UnexpectedRegisterableType(ObjectType expected, ObjectType found);
|
55
|
-
error NotRegisterableOwner(address expectedOwner);
|
56
|
-
error RegisterableOwnerIsZero();
|
57
|
-
error RegisterableOwnerIsRegistered();
|
58
|
-
error InvalidInitialOwner(address initialOwner);
|
59
|
-
error InvalidAddress(address registerableAddress);
|
60
|
-
|
61
39
|
|
62
40
|
// Initial value for constant variable has to be compile-time constant
|
63
41
|
// TODO define types as constants?
|
@@ -69,48 +47,6 @@ contract RegistryService is
|
|
69
47
|
|
70
48
|
address public constant NFT_LOCK_ADDRESS = address(0x1);
|
71
49
|
|
72
|
-
/// @dev
|
73
|
-
// msg.sender - ONLY registry owner
|
74
|
-
// CAN NOT register itself
|
75
|
-
// CAN NOT register IRegisterable address
|
76
|
-
// CAN register ONLY valid object-parent types combinations for TOKEN
|
77
|
-
// IMPORTANT: MUST NOT call untrusted contract inbetween calls to registry/instance (trusted contracts)
|
78
|
-
// motivation: registry/instance state may change during external call
|
79
|
-
// TODO it may be usefull to have transferable token nft in order to delist token, make it invalid for new beginings
|
80
|
-
// TODO: MUST prohibit registration of precompiles addresses
|
81
|
-
function registerToken(address tokenAddress)
|
82
|
-
external
|
83
|
-
returns(NftId nftId)
|
84
|
-
{
|
85
|
-
if(msg.sender == tokenAddress) {
|
86
|
-
revert SelfRegistration();
|
87
|
-
}
|
88
|
-
|
89
|
-
// MUST not revert if no ERC165 support
|
90
|
-
if(tokenAddress.code.length == 0 ||
|
91
|
-
ERC165Checker.supportsInterface(tokenAddress, type(IRegisterable).interfaceId)) {
|
92
|
-
revert NotToken();
|
93
|
-
}
|
94
|
-
|
95
|
-
NftId registryNftId = _registry.getNftId(address(_registry));
|
96
|
-
|
97
|
-
if(msg.sender != _registry.ownerOf(registryNftId)) {
|
98
|
-
revert NotRegistryOwner();
|
99
|
-
}
|
100
|
-
|
101
|
-
IRegistry.ObjectInfo memory info = IRegistry.ObjectInfo(
|
102
|
-
zeroNftId(), // any value
|
103
|
-
registryNftId, // parent nft id
|
104
|
-
TOKEN(),
|
105
|
-
false, // isInterceptor
|
106
|
-
tokenAddress,
|
107
|
-
NFT_LOCK_ADDRESS,
|
108
|
-
"" // any value
|
109
|
-
);
|
110
|
-
|
111
|
-
nftId = _registry.register(info);
|
112
|
-
}
|
113
|
-
|
114
50
|
/// @dev
|
115
51
|
// msg.sender - ONLY registry owner
|
116
52
|
// CAN NOT register itself
|
@@ -119,9 +55,7 @@ contract RegistryService is
|
|
119
55
|
// IMPORTANT: MUST NOT check owner before calling external contract
|
120
56
|
function registerService(IService service)
|
121
57
|
external
|
122
|
-
|
123
|
-
// services are not always owned by registry owner - actually only registry service is owned by registry owner
|
124
|
-
|
58
|
+
restricted
|
125
59
|
returns(
|
126
60
|
IRegistry.ObjectInfo memory info,
|
127
61
|
bytes memory data
|
@@ -140,17 +74,9 @@ contract RegistryService is
|
|
140
74
|
|
141
75
|
info.nftId = _registry.register(info);
|
142
76
|
service.linkToRegisteredNftId();
|
143
|
-
return (
|
144
|
-
info,
|
145
|
-
data
|
146
|
-
);
|
77
|
+
return (info, data);
|
147
78
|
}
|
148
79
|
|
149
|
-
// If msg.sender is approved service:
|
150
|
-
// 1) add owner arg (service MUST pass it's msg.sender as owner)
|
151
|
-
// 2) check service allowance
|
152
|
-
// 3) comment self registrstion check
|
153
|
-
//function registerInstance(IRegisterable instance, address owner)
|
154
80
|
function registerInstance(IRegisterable instance)
|
155
81
|
external
|
156
82
|
returns(
|
@@ -158,7 +84,6 @@ contract RegistryService is
|
|
158
84
|
bytes memory data
|
159
85
|
)
|
160
86
|
{
|
161
|
-
|
162
87
|
if(!instance.supportsInterface(type(IInstance).interfaceId)) {
|
163
88
|
revert NotInstance();
|
164
89
|
}
|
@@ -171,10 +96,7 @@ contract RegistryService is
|
|
171
96
|
info.nftId = _registry.register(info);
|
172
97
|
instance.linkToRegisteredNftId(); // asume safe
|
173
98
|
|
174
|
-
return (
|
175
|
-
info,
|
176
|
-
data
|
177
|
-
);
|
99
|
+
return (info, data);
|
178
100
|
}
|
179
101
|
|
180
102
|
function registerProduct(IBaseComponent product, address owner)
|
@@ -195,16 +117,11 @@ contract RegistryService is
|
|
195
117
|
data
|
196
118
|
) = _getAndVerifyContractInfo(product, PRODUCT(), owner);
|
197
119
|
|
198
|
-
NftId serviceNftId = _registry.getNftId(msg.sender);
|
199
|
-
|
200
120
|
info.nftId = _registry.register(info);
|
201
121
|
// TODO unsafe, let component or its owner derive nftId latter, when state assumptions and modifications of GIF contracts are finished
|
202
122
|
product.linkToRegisteredNftId();
|
203
123
|
|
204
|
-
return (
|
205
|
-
info,
|
206
|
-
data
|
207
|
-
);
|
124
|
+
return (info, data);
|
208
125
|
}
|
209
126
|
|
210
127
|
function registerPool(IBaseComponent pool, address owner)
|
@@ -224,15 +141,10 @@ contract RegistryService is
|
|
224
141
|
data
|
225
142
|
) = _getAndVerifyContractInfo(pool, POOL(), owner);
|
226
143
|
|
227
|
-
NftId serviceNftId = _registry.getNftId(msg.sender);
|
228
|
-
|
229
144
|
info.nftId = _registry.register(info);
|
230
145
|
pool.linkToRegisteredNftId();
|
231
146
|
|
232
|
-
return (
|
233
|
-
info,
|
234
|
-
data
|
235
|
-
);
|
147
|
+
return (info, data);
|
236
148
|
}
|
237
149
|
|
238
150
|
function registerDistribution(IBaseComponent distribution, address owner)
|
@@ -252,15 +164,10 @@ contract RegistryService is
|
|
252
164
|
data
|
253
165
|
) = _getAndVerifyContractInfo(distribution, DISTRIBUTION(), owner);
|
254
166
|
|
255
|
-
NftId serviceNftId = _registry.getNftId(msg.sender);
|
256
|
-
|
257
167
|
info.nftId = _registry.register(info);
|
258
168
|
distribution.linkToRegisteredNftId();
|
259
169
|
|
260
|
-
return (
|
261
|
-
info,
|
262
|
-
data
|
263
|
-
);
|
170
|
+
return (info, data);
|
264
171
|
}
|
265
172
|
|
266
173
|
function registerPolicy(IRegistry.ObjectInfo memory info)
|
@@ -268,8 +175,6 @@ contract RegistryService is
|
|
268
175
|
restricted
|
269
176
|
returns(NftId nftId)
|
270
177
|
{
|
271
|
-
NftId senderNftId = _registry.getNftId(msg.sender);
|
272
|
-
|
273
178
|
_verifyObjectInfo(info, POLICY());
|
274
179
|
|
275
180
|
nftId = _registry.register(info);
|
@@ -280,17 +185,23 @@ contract RegistryService is
|
|
280
185
|
restricted
|
281
186
|
returns(NftId nftId)
|
282
187
|
{
|
283
|
-
|
284
|
-
NftId senderNftId = _registry.getNftId(msg.sender);
|
285
|
-
|
286
188
|
_verifyObjectInfo(info, BUNDLE());
|
287
189
|
|
288
190
|
nftId = _registry.register(info);
|
289
191
|
}
|
290
192
|
|
193
|
+
function registerStake(IRegistry.ObjectInfo memory info)
|
194
|
+
external
|
195
|
+
restricted
|
196
|
+
returns(NftId nftId)
|
197
|
+
{
|
198
|
+
_verifyObjectInfo(info, STAKE());
|
199
|
+
|
200
|
+
nftId = _registry.register(info);
|
201
|
+
}
|
291
202
|
|
292
203
|
// From IService
|
293
|
-
function getName() public pure override(IService,
|
204
|
+
function getName() public pure override(IService, Service) returns(string memory) {
|
294
205
|
return NAME;
|
295
206
|
}
|
296
207
|
//function getType() public pure override(IService, ServiceBase) returns(ObjectType serviceType) {
|
@@ -334,7 +245,7 @@ contract RegistryService is
|
|
334
245
|
|
335
246
|
NftId registryNftId = registry.getNftId(address(registry));
|
336
247
|
|
337
|
-
|
248
|
+
_initializeService(address(registry), owner);
|
338
249
|
|
339
250
|
// TODO why do registry service proxy need to keep its nftId??? -> no registryServiceNftId checks in implementation
|
340
251
|
// if they are -> use registry address to obtain owner of registry service nft (works the same with any registerable and(or) implementation)
|
@@ -342,7 +253,6 @@ contract RegistryService is
|
|
342
253
|
_registerInterface(type(IRegistryService).interfaceId);
|
343
254
|
}
|
344
255
|
|
345
|
-
// parent check done in registry because of approve()
|
346
256
|
function _getAndVerifyContractInfo(
|
347
257
|
IRegisterable registerable,
|
348
258
|
ObjectType expectedType, // assume can be valid only
|
@@ -367,8 +277,13 @@ contract RegistryService is
|
|
367
277
|
|
368
278
|
address owner = info.initialOwner;
|
369
279
|
|
370
|
-
|
371
|
-
|
280
|
+
// solhint-disable-next-line
|
281
|
+
if(expectedType == INSTANCE()) {
|
282
|
+
// any address may create a new instance via instance service
|
283
|
+
} else {
|
284
|
+
if(owner != expectedOwner) { // registerable owner protection
|
285
|
+
revert NotRegisterableOwner(expectedOwner);
|
286
|
+
}
|
372
287
|
}
|
373
288
|
|
374
289
|
if(owner == address(registerable)) {
|
@@ -396,25 +311,28 @@ contract RegistryService is
|
|
396
311
|
);
|
397
312
|
}
|
398
313
|
|
399
|
-
// parent checks done in registry because of approve()
|
400
314
|
function _verifyObjectInfo(
|
401
315
|
IRegistry.ObjectInfo memory info,
|
402
|
-
ObjectType
|
316
|
+
ObjectType expectedType
|
403
317
|
)
|
404
318
|
internal
|
405
319
|
view
|
406
320
|
{
|
407
|
-
|
408
|
-
|
321
|
+
// enforce instead of check
|
322
|
+
info.objectAddress = address(0);
|
323
|
+
|
324
|
+
if(info.objectType != expectedType) {// type is checked in registry anyway...but service logic may depend on expected value
|
325
|
+
revert UnexpectedRegisterableType(expectedType, info.objectType);
|
326
|
+
}
|
327
|
+
|
328
|
+
address owner = info.initialOwner;
|
329
|
+
|
330
|
+
if(owner == address(0)) {
|
331
|
+
revert RegisterableOwnerIsZero();
|
409
332
|
}
|
410
333
|
|
411
|
-
if(
|
412
|
-
|
413
|
-
info.initialOwner == address(0)) {
|
414
|
-
// TODO non registered address can register object(e.g. POLICY()) and then transfer associated nft to registered contract
|
415
|
-
// what are motivations to do so?
|
416
|
-
// at least registered contract can not register objects by itself, SERVICE,
|
417
|
-
revert InvalidInitialOwner(info.initialOwner);
|
334
|
+
if(getRegistry().isRegistered(owner)) {
|
335
|
+
revert RegisterableOwnerIsRegistered();
|
418
336
|
}
|
419
337
|
|
420
338
|
// can catch all 3 if check that initialOwner is not registered
|
@@ -9,6 +9,7 @@ import {Registry} from "./Registry.sol";
|
|
9
9
|
import {IVersionable} from "../shared/IVersionable.sol";
|
10
10
|
import {ProxyManager} from "../shared/ProxyManager.sol";
|
11
11
|
import {RegistryService} from "./RegistryService.sol";
|
12
|
+
import {TokenRegistry} from "./TokenRegistry.sol";
|
12
13
|
|
13
14
|
|
14
15
|
contract RegistryServiceManager is
|
@@ -16,9 +17,9 @@ contract RegistryServiceManager is
|
|
16
17
|
{
|
17
18
|
bytes32 constant public ACCESS_MANAGER_CREATION_CODE_HASH = 0x0;
|
18
19
|
|
19
|
-
RegistryService private _registryService;
|
20
|
-
|
21
20
|
AccessManager private _accessManager;
|
21
|
+
RegistryService private _registryService;
|
22
|
+
TokenRegistry private _tokenRegistry;
|
22
23
|
|
23
24
|
/// @dev initializes proxy manager with registry service implementation and deploys registry
|
24
25
|
constructor(
|
@@ -41,11 +42,26 @@ contract RegistryServiceManager is
|
|
41
42
|
address(_registryService.getRegistry()),
|
42
43
|
address(_registryService));
|
43
44
|
|
45
|
+
// deploy token registry
|
46
|
+
|
47
|
+
// _tokenRegistry = new TokenRegistry(
|
48
|
+
// address(_registryService.getRegistry()),
|
49
|
+
// address(_registryService));
|
50
|
+
|
44
51
|
// implies that after this constructor call only upgrade functionality is available
|
45
52
|
_isDeployed = true;
|
46
53
|
}
|
47
54
|
|
48
55
|
//--- view functions ----------------------------------------------------//
|
56
|
+
|
57
|
+
function getAccessManager()
|
58
|
+
external
|
59
|
+
view
|
60
|
+
returns (AccessManager)
|
61
|
+
{
|
62
|
+
return _accessManager;
|
63
|
+
}
|
64
|
+
|
49
65
|
function getRegistryService()
|
50
66
|
external
|
51
67
|
view
|
@@ -54,11 +70,11 @@ contract RegistryServiceManager is
|
|
54
70
|
return _registryService;
|
55
71
|
}
|
56
72
|
|
57
|
-
function
|
73
|
+
function getTokenRegistry()
|
58
74
|
external
|
59
75
|
view
|
60
|
-
returns (
|
76
|
+
returns (TokenRegistry)
|
61
77
|
{
|
62
|
-
return
|
78
|
+
return _tokenRegistry;
|
63
79
|
}
|
64
80
|
}
|
@@ -0,0 +1,111 @@
|
|
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 {Version, VersionPart, VersionLib, VersionPartLib} from "../types/Version.sol";
|
10
|
+
import {NftOwnable} from "../shared/NftOwnable.sol";
|
11
|
+
|
12
|
+
/// @title contract to register token per GIF major release.
|
13
|
+
contract TokenRegistry is
|
14
|
+
NftOwnable
|
15
|
+
{
|
16
|
+
|
17
|
+
string public constant REGISTRY_SERVICE_NAME = "RegistryService";
|
18
|
+
|
19
|
+
event LogRegistered(address token, string symbol, uint256 decimals);
|
20
|
+
event LogTokenStateSet(address token, VersionPart majorVersion, bool active);
|
21
|
+
|
22
|
+
error NotContract(address account);
|
23
|
+
error NotToken(address account);
|
24
|
+
error TokenDecimalsZero();
|
25
|
+
error TokenMajorVersionInvalid(VersionPart majorVersion);
|
26
|
+
|
27
|
+
address [] internal _token;
|
28
|
+
mapping(address token => bool registered) internal _registered;
|
29
|
+
mapping(address token => mapping(VersionPart majorVersion => bool isActive)) internal _active;
|
30
|
+
|
31
|
+
constructor()
|
32
|
+
NftOwnable()
|
33
|
+
{ }
|
34
|
+
|
35
|
+
|
36
|
+
/// @dev link ownership of token registry to nft owner of registry service
|
37
|
+
function linkToNftOwnable(address registryAddress)
|
38
|
+
external
|
39
|
+
onlyOwner
|
40
|
+
{
|
41
|
+
IRegistry registry = IRegistry(registryAddress);
|
42
|
+
address registryServiceAddress = registry.getServiceAddress(REGISTRY_SERVICE_NAME, registry.getMajorVersion());
|
43
|
+
|
44
|
+
_linkToNftOwnable(registryAddress, registryServiceAddress);
|
45
|
+
}
|
46
|
+
|
47
|
+
/// @dev token state is informative, registry have no clue about used tokens
|
48
|
+
// component owner is responsible for token selection and operations
|
49
|
+
// service MUST deny registration of component with inactive token
|
50
|
+
function setActive(address token, VersionPart majorVersion, bool active)
|
51
|
+
external
|
52
|
+
onlyOwner
|
53
|
+
{
|
54
|
+
// verify that token is registered
|
55
|
+
if (!_registered[token]) {
|
56
|
+
_registerToken(token);
|
57
|
+
}
|
58
|
+
|
59
|
+
// verify valid major version
|
60
|
+
// ensure major version increments is one
|
61
|
+
uint256 version = majorVersion.toInt();
|
62
|
+
if (version < _registry.getMajorVersionMin().toInt() || version > _registry.getMajorVersionMax().toInt()) {
|
63
|
+
revert TokenMajorVersionInvalid(majorVersion);
|
64
|
+
}
|
65
|
+
|
66
|
+
_active[token][majorVersion] = active;
|
67
|
+
|
68
|
+
emit LogTokenStateSet(token, majorVersion, active);
|
69
|
+
}
|
70
|
+
|
71
|
+
function tokens() external view returns (uint256) {
|
72
|
+
return _token.length;
|
73
|
+
}
|
74
|
+
|
75
|
+
function getToken(uint256 idx) external view returns (IERC20Metadata token) {
|
76
|
+
return IERC20Metadata(_token[idx]);
|
77
|
+
}
|
78
|
+
|
79
|
+
function isRegistered(address token) external view returns (bool) {
|
80
|
+
return _registered[token];
|
81
|
+
}
|
82
|
+
|
83
|
+
function isActive(address token, VersionPart majorVersion) external view returns (bool) {
|
84
|
+
return _active[token][majorVersion];
|
85
|
+
}
|
86
|
+
|
87
|
+
/// @dev some sanity checks to prevent unintended registration
|
88
|
+
function _registerToken(address token) internal {
|
89
|
+
|
90
|
+
// MUST be contract
|
91
|
+
if(token.code.length == 0) {
|
92
|
+
revert NotContract(token);
|
93
|
+
}
|
94
|
+
|
95
|
+
// MUST not be GIF registerable
|
96
|
+
if(ERC165Checker.supportsInterface(token, type(IRegisterable).interfaceId)) {
|
97
|
+
revert NotToken(token);
|
98
|
+
}
|
99
|
+
|
100
|
+
// MUST have decimals > 0
|
101
|
+
IERC20Metadata erc20 = IERC20Metadata(token);
|
102
|
+
if(erc20.decimals() == 0) {
|
103
|
+
revert TokenDecimalsZero();
|
104
|
+
}
|
105
|
+
|
106
|
+
_registered[token] = true;
|
107
|
+
_token.push(token);
|
108
|
+
|
109
|
+
emit LogRegistered(token, erc20.symbol(), erc20.decimals());
|
110
|
+
}
|
111
|
+
}
|