@etherisc/gif-next 0.0.2-b4fc06b-491 → 0.0.2-b643f7e-850
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 +63 -1
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +139 -0
- package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/components/Distribution.sol/Distribution.json +149 -15
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +101 -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 +181 -16
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +157 -56
- 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 +775 -0
- package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +4 -0
- package/artifacts/contracts/instance/{AccessManagedSimple.sol/AccessManagedSimple.json → Cloneable.sol/Cloneable.json} +74 -3
- package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1369 -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 +6 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +182 -155
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +57 -47
- 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 +177 -38
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +250 -35
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +95 -15
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +4 -0
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +272 -0
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +59 -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/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/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 +716 -0
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +444 -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/IPoolService.sol/IPoolService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +167 -0
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +40 -31
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +1049 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +464 -0
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +1147 -0
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +488 -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 +23 -105
- 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 +70 -145
- 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 +44 -35
- 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 +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 +1 -1
- package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
- 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/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/TestVersionable.sol/TestVersionable.dbg.json +1 -1
- 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/VersionPartLib.dbg.json +1 -1
- package/contracts/components/BaseComponent.sol +57 -11
- package/contracts/components/Distribution.sol +15 -18
- package/contracts/components/IBaseComponent.sol +7 -0
- package/contracts/components/IDistributionComponent.sol +1 -0
- package/contracts/components/IPoolComponent.sol +5 -1
- package/contracts/components/Pool.sol +36 -28
- package/contracts/components/Product.sol +34 -42
- 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 +35 -7
- package/contracts/instance/IInstanceBase.sol +26 -0
- package/contracts/instance/IInstanceService.sol +5 -3
- package/contracts/instance/Instance.sol +43 -32
- package/contracts/instance/InstanceAccessManager.sol +6 -6
- package/contracts/instance/InstanceBase.sol +41 -0
- package/contracts/instance/InstanceReader.sol +26 -1
- package/contracts/instance/InstanceService.sol +112 -17
- package/contracts/instance/InstanceServiceManager.sol +6 -5
- package/contracts/instance/ObjectManager.sol +95 -0
- package/contracts/instance/base/ComponentServiceBase.sol +91 -6
- package/contracts/instance/module/IBundle.sol +1 -0
- package/contracts/instance/module/ISetup.sol +3 -0
- package/contracts/instance/service/DistributionService.sol +88 -0
- package/contracts/instance/service/DistributionServiceManager.sol +54 -0
- package/contracts/instance/service/IPoolService.sol +16 -2
- package/contracts/instance/service/IProductService.sol +6 -3
- package/contracts/instance/service/PoolService.sol +287 -0
- package/contracts/instance/service/PoolServiceManager.sol +54 -0
- package/contracts/instance/service/ProductService.sol +570 -0
- package/contracts/instance/service/ProductServiceManager.sol +54 -0
- package/contracts/registry/IRegistry.sol +8 -17
- package/contracts/registry/IRegistryService.sol +27 -12
- package/contracts/registry/Registry.sol +20 -40
- package/contracts/registry/RegistryService.sol +30 -116
- package/contracts/registry/RegistryServiceManager.sol +21 -5
- package/contracts/registry/TokenRegistry.sol +111 -0
- package/contracts/shared/ERC165.sol +6 -2
- package/contracts/shared/NftOwnable.sol +2 -4
- package/contracts/shared/Registerable.sol +1 -0
- package/contracts/shared/Service.sol +1 -0
- package/contracts/types/NftIdSet.sol +26 -24
- package/contracts/types/RoleId.sol +8 -0
- package/contracts/types/StateId.sol +4 -0
- 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 -1132
- package/contracts/instance/AccessManagedSimple.sol +0 -122
- package/contracts/instance/AccessManagerSimple.sol +0 -692
@@ -12,24 +12,39 @@ import {IBaseComponent} from "../components/IBaseComponent.sol";
|
|
12
12
|
|
13
13
|
interface IRegistryService is IService {
|
14
14
|
|
15
|
-
|
15
|
+
error SelfRegistration();
|
16
|
+
error NotRegistryOwner();
|
16
17
|
|
17
|
-
|
18
|
+
error NotService();
|
19
|
+
error NotInstance();
|
20
|
+
error NotProduct();
|
21
|
+
error NotPool();
|
22
|
+
error NotDistribution();
|
18
23
|
|
19
|
-
|
20
|
-
|
24
|
+
error UnexpectedRegisterableType(ObjectType expected, ObjectType found);
|
25
|
+
error NotRegisterableOwner(address expectedOwner);
|
26
|
+
error RegisterableOwnerIsZero();
|
27
|
+
error RegisterableOwnerIsRegistered();
|
28
|
+
error InvalidInitialOwner(address initialOwner);
|
29
|
+
error InvalidAddress(address registerableAddress);
|
21
30
|
|
22
|
-
function registerProduct(IBaseComponent product, address owner)
|
23
|
-
external returns(IRegistry.ObjectInfo memory info, bytes memory data);
|
24
31
|
|
25
|
-
|
26
|
-
external returns(IRegistry.ObjectInfo memory info, bytes memory data);
|
32
|
+
function registerService(IService service) external returns(IRegistry.ObjectInfo memory info, bytes memory data);
|
27
33
|
|
28
|
-
|
29
|
-
|
34
|
+
function registerInstance(IRegisterable instance)
|
35
|
+
external returns(IRegistry.ObjectInfo memory info, bytes memory data);
|
30
36
|
|
31
|
-
|
37
|
+
function registerProduct(IBaseComponent product, address owner)
|
38
|
+
external returns(IRegistry.ObjectInfo memory info, bytes memory data);
|
32
39
|
|
33
|
-
|
40
|
+
function registerPool(IBaseComponent pool, address owner)
|
41
|
+
external returns(IRegistry.ObjectInfo memory info, bytes memory data);
|
42
|
+
|
43
|
+
function registerDistribution(IBaseComponent distribution, address owner)
|
44
|
+
external returns(IRegistry.ObjectInfo memory info, bytes memory data);
|
45
|
+
|
46
|
+
function registerPolicy(IRegistry.ObjectInfo memory info) external returns(NftId nftId); // -> easy to upgrade
|
47
|
+
|
48
|
+
function registerBundle(IRegistry.ObjectInfo memory info) external returns(NftId nftId);
|
34
49
|
}
|
35
50
|
|
@@ -28,8 +28,9 @@ contract Registry is
|
|
28
28
|
ERC165,
|
29
29
|
IRegistry
|
30
30
|
{
|
31
|
-
uint256 public constant GIF_MAJOR_VERSION_AT_DEPLOYMENT = 3;
|
31
|
+
uint256 public constant GIF_MAJOR_VERSION_AT_DEPLOYMENT = 3;
|
32
32
|
address public constant NFT_LOCK_ADDRESS = address(0x1);
|
33
|
+
uint256 public constant REGISTRY_TOKEN_SEQUENCE_ID = 2;
|
33
34
|
uint256 public constant REGISTRY_SERVICE_TOKEN_SEQUENCE_ID = 3;
|
34
35
|
string public constant EMPTY_URI = "";
|
35
36
|
|
@@ -38,18 +39,12 @@ contract Registry is
|
|
38
39
|
mapping(NftId nftId => ObjectInfo info) internal _info;
|
39
40
|
mapping(address object => NftId nftId) internal _nftIdByAddress;
|
40
41
|
|
41
|
-
mapping(NftId registrator => mapping(
|
42
|
-
ObjectType objectType => bool)) internal _isApproved;
|
43
|
-
|
44
42
|
mapping(ObjectType objectType => mapping(
|
45
43
|
ObjectType parentType => bool)) internal _isValidContractCombination;
|
46
44
|
|
47
45
|
mapping(ObjectType objectType => mapping(
|
48
46
|
ObjectType parentType => bool)) internal _isValidObjectCombination;
|
49
47
|
|
50
|
-
mapping(address token => mapping(
|
51
|
-
VersionPart majorVersion => bool isActive)) internal _tokenIsActive;
|
52
|
-
|
53
48
|
mapping(NftId nftId => string name) internal _string;
|
54
49
|
mapping(bytes32 serviceNameHash => mapping(
|
55
50
|
VersionPart majorVersion => address service)) internal _service;
|
@@ -67,7 +62,6 @@ contract Registry is
|
|
67
62
|
}
|
68
63
|
|
69
64
|
modifier onlyRegistryService() {
|
70
|
-
|
71
65
|
if(msg.sender != _info[_serviceNftId].objectAddress) {
|
72
66
|
revert NotRegistryService();
|
73
67
|
}
|
@@ -98,6 +92,7 @@ contract Registry is
|
|
98
92
|
|
99
93
|
// from IRegistry
|
100
94
|
|
95
|
+
/// @dev latest GIF release version
|
101
96
|
function setMajorVersion(VersionPart newMajorVersion)
|
102
97
|
external
|
103
98
|
onlyOwner
|
@@ -180,36 +175,23 @@ contract Registry is
|
|
180
175
|
|
181
176
|
emit LogRegistration(info);
|
182
177
|
}
|
178
|
+
/// @dev earliest GIF major version
|
179
|
+
function getMajorVersionMin() external view returns (VersionPart) {
|
180
|
+
return VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
|
181
|
+
}
|
183
182
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
// verify provided address is a registered token
|
195
|
-
if (info.objectType != TOKEN()) {
|
196
|
-
revert NotToken(token);
|
197
|
-
}
|
198
|
-
|
199
|
-
// verify valid major version
|
200
|
-
// ensure major version increments is one
|
201
|
-
uint256 version = majorVersion.toInt();
|
202
|
-
uint256 versionNow = _majorVersion.toInt();
|
203
|
-
if (version < GIF_MAJOR_VERSION_AT_DEPLOYMENT || version > versionNow) {
|
204
|
-
revert TokenMajorVersionInvalid(majorVersion);
|
205
|
-
}
|
206
|
-
|
207
|
-
_tokenIsActive[token][majorVersion] = active;
|
208
|
-
|
209
|
-
emit LogTokenStateSet(token, majorVersion, active);
|
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;
|
210
192
|
}
|
211
193
|
|
212
|
-
/// @dev latest GIF release version
|
194
|
+
/// @dev latest active GIF release version
|
213
195
|
function getMajorVersion() external view returns (VersionPart) {
|
214
196
|
return _majorVersion;
|
215
197
|
}
|
@@ -231,7 +213,6 @@ contract Registry is
|
|
231
213
|
}
|
232
214
|
|
233
215
|
function ownerOf(address contractAddress) public view returns (address) {
|
234
|
-
|
235
216
|
return _chainNft.ownerOf(_nftIdByAddress[contractAddress].toInt());
|
236
217
|
}
|
237
218
|
|
@@ -240,7 +221,6 @@ contract Registry is
|
|
240
221
|
}
|
241
222
|
|
242
223
|
function getObjectInfo(address object) external view override returns (ObjectInfo memory) {
|
243
|
-
|
244
224
|
return _info[_nftIdByAddress[object]];
|
245
225
|
}
|
246
226
|
|
@@ -252,8 +232,8 @@ contract Registry is
|
|
252
232
|
return _nftIdByAddress[object].gtz();
|
253
233
|
}
|
254
234
|
|
255
|
-
function
|
256
|
-
return
|
235
|
+
function isRegisteredService(address object) external view override returns (bool) {
|
236
|
+
return _nftIdByAddress[object].gtz() && _info[_nftIdByAddress[object]].objectType == SERVICE();
|
257
237
|
}
|
258
238
|
|
259
239
|
function getServiceName(NftId nftId) external view returns (string memory) {
|
@@ -357,7 +337,7 @@ contract Registry is
|
|
357
337
|
function _registerRegistry(address registryOwner)
|
358
338
|
internal
|
359
339
|
{
|
360
|
-
uint256 registryId = _chainNft.calculateTokenId(
|
340
|
+
uint256 registryId = _chainNft.calculateTokenId(REGISTRY_TOKEN_SEQUENCE_ID);
|
361
341
|
NftId registryNftId = toNftId(registryId);
|
362
342
|
|
363
343
|
NftId parentNftId;
|
@@ -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,7 +18,7 @@ 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";
|
@@ -32,7 +28,6 @@ import {Service} from "../shared/Service.sol";
|
|
32
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,
|
@@ -41,23 +36,6 @@ contract RegistryService is
|
|
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(
|
@@ -170,10 +96,7 @@ contract RegistryService is
|
|
170
96
|
info.nftId = _registry.register(info);
|
171
97
|
instance.linkToRegisteredNftId(); // asume safe
|
172
98
|
|
173
|
-
return (
|
174
|
-
info,
|
175
|
-
data
|
176
|
-
);
|
99
|
+
return (info, data);
|
177
100
|
}
|
178
101
|
|
179
102
|
function registerProduct(IBaseComponent product, address owner)
|
@@ -194,16 +117,11 @@ contract RegistryService is
|
|
194
117
|
data
|
195
118
|
) = _getAndVerifyContractInfo(product, PRODUCT(), owner);
|
196
119
|
|
197
|
-
NftId serviceNftId = _registry.getNftId(msg.sender);
|
198
|
-
|
199
120
|
info.nftId = _registry.register(info);
|
200
121
|
// TODO unsafe, let component or its owner derive nftId latter, when state assumptions and modifications of GIF contracts are finished
|
201
122
|
product.linkToRegisteredNftId();
|
202
123
|
|
203
|
-
return (
|
204
|
-
info,
|
205
|
-
data
|
206
|
-
);
|
124
|
+
return (info, data);
|
207
125
|
}
|
208
126
|
|
209
127
|
function registerPool(IBaseComponent pool, address owner)
|
@@ -223,15 +141,10 @@ contract RegistryService is
|
|
223
141
|
data
|
224
142
|
) = _getAndVerifyContractInfo(pool, POOL(), owner);
|
225
143
|
|
226
|
-
NftId serviceNftId = _registry.getNftId(msg.sender);
|
227
|
-
|
228
144
|
info.nftId = _registry.register(info);
|
229
145
|
pool.linkToRegisteredNftId();
|
230
146
|
|
231
|
-
return (
|
232
|
-
info,
|
233
|
-
data
|
234
|
-
);
|
147
|
+
return (info, data);
|
235
148
|
}
|
236
149
|
|
237
150
|
function registerDistribution(IBaseComponent distribution, address owner)
|
@@ -251,15 +164,10 @@ contract RegistryService is
|
|
251
164
|
data
|
252
165
|
) = _getAndVerifyContractInfo(distribution, DISTRIBUTION(), owner);
|
253
166
|
|
254
|
-
NftId serviceNftId = _registry.getNftId(msg.sender);
|
255
|
-
|
256
167
|
info.nftId = _registry.register(info);
|
257
168
|
distribution.linkToRegisteredNftId();
|
258
169
|
|
259
|
-
return (
|
260
|
-
info,
|
261
|
-
data
|
262
|
-
);
|
170
|
+
return (info, data);
|
263
171
|
}
|
264
172
|
|
265
173
|
function registerPolicy(IRegistry.ObjectInfo memory info)
|
@@ -267,8 +175,6 @@ contract RegistryService is
|
|
267
175
|
restricted
|
268
176
|
returns(NftId nftId)
|
269
177
|
{
|
270
|
-
NftId senderNftId = _registry.getNftId(msg.sender);
|
271
|
-
|
272
178
|
_verifyObjectInfo(info, POLICY());
|
273
179
|
|
274
180
|
nftId = _registry.register(info);
|
@@ -279,14 +185,20 @@ contract RegistryService is
|
|
279
185
|
restricted
|
280
186
|
returns(NftId nftId)
|
281
187
|
{
|
282
|
-
|
283
|
-
NftId senderNftId = _registry.getNftId(msg.sender);
|
284
|
-
|
285
188
|
_verifyObjectInfo(info, BUNDLE());
|
286
189
|
|
287
190
|
nftId = _registry.register(info);
|
288
191
|
}
|
289
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
|
+
}
|
290
202
|
|
291
203
|
// From IService
|
292
204
|
function getName() public pure override(IService, Service) returns(string memory) {
|
@@ -341,7 +253,6 @@ contract RegistryService is
|
|
341
253
|
_registerInterface(type(IRegistryService).interfaceId);
|
342
254
|
}
|
343
255
|
|
344
|
-
// parent check done in registry because of approve()
|
345
256
|
function _getAndVerifyContractInfo(
|
346
257
|
IRegisterable registerable,
|
347
258
|
ObjectType expectedType, // assume can be valid only
|
@@ -400,25 +311,28 @@ contract RegistryService is
|
|
400
311
|
);
|
401
312
|
}
|
402
313
|
|
403
|
-
// parent checks done in registry because of approve()
|
404
314
|
function _verifyObjectInfo(
|
405
315
|
IRegistry.ObjectInfo memory info,
|
406
|
-
ObjectType
|
316
|
+
ObjectType expectedType
|
407
317
|
)
|
408
318
|
internal
|
409
319
|
view
|
410
320
|
{
|
411
|
-
|
412
|
-
|
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();
|
413
332
|
}
|
414
333
|
|
415
|
-
if(
|
416
|
-
|
417
|
-
info.initialOwner == address(0)) {
|
418
|
-
// TODO non registered address can register object(e.g. POLICY()) and then transfer associated nft to registered contract
|
419
|
-
// what are motivations to do so?
|
420
|
-
// at least registered contract can not register objects by itself, SERVICE,
|
421
|
-
revert InvalidInitialOwner(info.initialOwner);
|
334
|
+
if(getRegistry().isRegistered(owner)) {
|
335
|
+
revert RegisterableOwnerIsRegistered();
|
422
336
|
}
|
423
337
|
|
424
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
|
+
}
|
@@ -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
|
}
|
@@ -13,10 +13,7 @@ contract NftOwnable is INftOwnable {
|
|
13
13
|
|
14
14
|
/// @dev enforces msg.sender is owner of nft (or initial owner of nft ownable)
|
15
15
|
modifier onlyOwner() {
|
16
|
-
|
17
|
-
|
18
|
-
// owner == address(0) is eg uninitialized upgradable contract
|
19
|
-
if (owner != address(0) && msg.sender != owner) {
|
16
|
+
if (msg.sender != getOwner()) {
|
20
17
|
revert ErrorNotOwner(msg.sender);
|
21
18
|
}
|
22
19
|
_;
|
@@ -77,6 +74,7 @@ contract NftOwnable is INftOwnable {
|
|
77
74
|
internal
|
78
75
|
virtual
|
79
76
|
{
|
77
|
+
require(initialOwner > address(0), "NftOwnable: initial owner is 0");
|
80
78
|
_initialOwner = initialOwner;
|
81
79
|
_setRegistry(registryAddress);
|
82
80
|
}
|