@etherisc/gif-next 0.0.2-aad7ee0-660 → 0.0.2-ab4c2da-820

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.
Files changed (249) hide show
  1. package/README.md +67 -1
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +139 -0
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +149 -15
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +101 -0
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +28 -2
  11. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  12. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  13. package/artifacts/contracts/components/Pool.sol/Pool.json +181 -16
  14. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  15. package/artifacts/contracts/components/Product.sol/Product.json +157 -56
  16. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
  18. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  35. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  36. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +4 -0
  37. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +1206 -0
  38. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +4 -0
  39. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +788 -0
  40. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +4 -0
  41. package/artifacts/contracts/instance/{AccessManagedSimple.sol/AccessManagedSimple.json → Cloneable.sol/Cloneable.json} +74 -3
  42. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
  43. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  44. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1373 -93
  45. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
  46. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.json +448 -0
  47. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  48. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +30 -14
  49. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  50. package/artifacts/contracts/instance/Instance.sol/Instance.json +195 -155
  51. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  52. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +57 -47
  53. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.dbg.json +4 -0
  54. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.json +763 -0
  55. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  56. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +177 -38
  57. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  58. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +378 -67
  59. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  60. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +145 -17
  61. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +4 -0
  62. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +285 -0
  63. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  64. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +49 -9
  65. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  66. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  67. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  68. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  69. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  70. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  71. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  72. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  73. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  74. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  75. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  76. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  77. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +4 -0
  78. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +923 -0
  79. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +4 -0
  80. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +440 -0
  81. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  82. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +39 -52
  83. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  84. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +90 -36
  85. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  86. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +20 -20
  87. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +4 -0
  88. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +669 -0
  89. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  90. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +13 -13
  91. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  92. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +13 -13
  93. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +4 -0
  94. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +664 -0
  95. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  96. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +15 -77
  97. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  98. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +25 -240
  99. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +4 -0
  100. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +971 -0
  101. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +4 -0
  102. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +464 -0
  103. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  104. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +705 -0
  105. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
  106. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +428 -0
  107. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  108. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +755 -0
  109. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
  110. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +420 -0
  111. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  112. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +2 -2
  113. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  114. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +197 -68
  115. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  116. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +187 -83
  117. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  118. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  119. package/artifacts/contracts/registry/Registry.sol/Registry.json +197 -182
  120. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.dbg.json +4 -0
  121. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.json +285 -0
  122. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  123. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +31 -97
  124. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  125. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +38 -91
  126. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +4 -0
  127. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +551 -0
  128. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
  129. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +397 -0
  130. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  131. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  132. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  133. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  134. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  135. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  136. package/artifacts/contracts/shared/IService.sol/IService.json +13 -13
  137. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  138. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  139. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  140. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  141. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  142. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  143. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +4 -4
  144. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
  145. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  146. package/artifacts/contracts/shared/Service.sol/Service.json +13 -13
  147. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  148. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  149. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
  150. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  151. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  152. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  153. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
  154. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  155. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  156. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  157. package/artifacts/contracts/test/TestService.sol/TestService.json +31 -31
  158. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  159. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  160. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  161. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  162. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +2 -2
  163. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  164. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  165. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  166. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  167. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  168. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  169. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  170. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  171. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  172. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +26 -3
  173. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  174. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  175. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  176. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  177. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  178. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  179. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  180. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  181. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  182. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  183. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  184. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  185. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  186. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +22 -3
  187. package/contracts/components/BaseComponent.sol +57 -11
  188. package/contracts/components/Distribution.sol +15 -18
  189. package/contracts/components/IBaseComponent.sol +7 -0
  190. package/contracts/components/IDistributionComponent.sol +1 -0
  191. package/contracts/components/IPoolComponent.sol +5 -1
  192. package/contracts/components/Pool.sol +43 -31
  193. package/contracts/components/Product.sol +42 -47
  194. package/contracts/instance/AccessManagerUpgradeableInitializeable.sol +23 -0
  195. package/contracts/instance/BundleManager.sol +129 -0
  196. package/contracts/instance/Cloneable.sol +46 -0
  197. package/contracts/instance/IInstance.sol +34 -7
  198. package/contracts/instance/IInstanceBase.sol +26 -0
  199. package/contracts/instance/IInstanceService.sol +7 -3
  200. package/contracts/instance/Instance.sol +54 -32
  201. package/contracts/instance/InstanceAccessManager.sol +6 -6
  202. package/contracts/instance/InstanceBase.sol +41 -0
  203. package/contracts/instance/InstanceReader.sol +26 -1
  204. package/contracts/instance/InstanceService.sol +229 -68
  205. package/contracts/instance/InstanceServiceManager.sol +8 -6
  206. package/contracts/instance/ObjectManager.sol +101 -0
  207. package/contracts/instance/base/ComponentServiceBase.sol +45 -12
  208. package/contracts/instance/module/IBundle.sol +1 -0
  209. package/contracts/instance/module/ISetup.sol +3 -0
  210. package/contracts/instance/service/BundleService.sol +260 -0
  211. package/contracts/instance/service/BundleServiceManager.sol +55 -0
  212. package/contracts/instance/service/ComponentOwnerService.sol +4 -6
  213. package/contracts/instance/service/DistributionService.sol +53 -12
  214. package/contracts/instance/service/DistributionServiceManager.sol +8 -6
  215. package/contracts/instance/service/IBundleService.sol +45 -0
  216. package/contracts/instance/service/IPolicyService.sol +87 -0
  217. package/contracts/instance/service/IPoolService.sol +6 -23
  218. package/contracts/instance/service/IProductService.sol +6 -73
  219. package/contracts/instance/service/PolicyService.sol +503 -0
  220. package/contracts/instance/service/PolicyServiceManager.sol +54 -0
  221. package/contracts/instance/service/PoolService.sol +122 -0
  222. package/contracts/instance/service/PoolServiceManager.sol +55 -0
  223. package/contracts/instance/service/ProductService.sol +168 -0
  224. package/contracts/instance/service/ProductServiceManager.sol +54 -0
  225. package/contracts/registry/ChainNft.sol +1 -1
  226. package/contracts/registry/IRegistry.sol +25 -6
  227. package/contracts/registry/IRegistryService.sol +36 -13
  228. package/contracts/registry/Registry.sol +165 -203
  229. package/contracts/registry/RegistryAccessManager.sol +207 -0
  230. package/contracts/registry/RegistryService.sol +83 -197
  231. package/contracts/registry/RegistryServiceManager.sol +20 -22
  232. package/contracts/registry/ReleaseManager.sol +382 -0
  233. package/contracts/registry/TokenRegistry.sol +110 -0
  234. package/contracts/shared/ERC165.sol +6 -2
  235. package/contracts/shared/IService.sol +2 -1
  236. package/contracts/shared/NftOwnable.sol +2 -4
  237. package/contracts/shared/ProxyManager.sol +1 -1
  238. package/contracts/shared/Registerable.sol +1 -0
  239. package/contracts/shared/Service.sol +11 -7
  240. package/contracts/test/TestService.sol +3 -2
  241. package/contracts/types/NftIdSet.sol +26 -24
  242. package/contracts/types/RoleId.sol +14 -5
  243. package/contracts/types/Version.sol +4 -1
  244. package/package.json +1 -1
  245. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +0 -4
  246. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +0 -4
  247. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.json +0 -1132
  248. package/contracts/instance/AccessManagedSimple.sol +0 -122
  249. package/contracts/instance/AccessManagerSimple.sol +0 -692
@@ -0,0 +1,207 @@
1
+ // SPDX-License-Identifier: UNLICENSED
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {AccessManager} from "@openzeppelin/contracts/access/manager/AccessManager.sol";
5
+ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";
6
+
7
+ import {RoleId, RoleIdLib,
8
+ REGISTRY_SERVICE_MANAGER_ROLE,
9
+ REGISTRY_SERVICE_ADMIN_ROLE,
10
+ RELEASE_MANAGER_ROLE} from "../types/RoleId.sol";
11
+
12
+ import {TokenRegistry} from "./TokenRegistry.sol";
13
+ import {ReleaseManager} from "./ReleaseManager.sol";
14
+
15
+ /*
16
+ 3 types of roles:
17
+ 1) REGISTRAR roles
18
+ - each one is unique
19
+ - always have 1 member
20
+ - one role is set for each function of each version of registry service
21
+ 2) REGISTRY_SERVICE_MANAGER_ROLE aka GIF_MANAGER_ROLE
22
+ - can have arbitrary number of members
23
+ - responsible for services registrations
24
+ - responsible for token registration and activation
25
+ 3) REGISTRY_SERVICE_ADMIN_ROLE aka GIF_ADMIN_ROLE
26
+ - admin of REGISTRY_SERVICE_MANAGER_ROLE
27
+ - MUST have 1 member at any time
28
+ - granted/revoked ONLY in transferAdminRole() -> consider lock out situations!!!
29
+ - responsible for release manager initialization
30
+ - responsible for creation and activation of each release
31
+
32
+ */
33
+
34
+ contract RegistryAccessManager is AccessManaged
35
+ {
36
+ error NotInitialized();
37
+ error AlreadyInitialized();
38
+
39
+ uint64 public constant UNIQUE_ROLE_ID_MIN = 1000000;
40
+
41
+ AccessManager private immutable _accessManager;
42
+ address private _releaseManager;
43
+ address private _tokenRegistry;
44
+
45
+ uint64 private _idNext; // role id
46
+ bool private _isInitialized;
47
+
48
+ modifier onlyOnce() {
49
+ if(_isInitialized) {
50
+ revert AlreadyInitialized();
51
+ }
52
+ _;
53
+ _isInitialized = true;
54
+ }
55
+
56
+ modifier onlyInitialized() {
57
+ if(!_isInitialized) {
58
+ revert NotInitialized();
59
+ }
60
+ _;
61
+ }
62
+
63
+ constructor(address manager)
64
+ AccessManaged(msg.sender)
65
+ {
66
+ _accessManager = new AccessManager(address(this));
67
+ setAuthority(address(_accessManager));
68
+
69
+ _idNext = UNIQUE_ROLE_ID_MIN;
70
+
71
+ _configureAdminRoleInitial();
72
+
73
+ address admin = msg.sender;
74
+ _grantRole(REGISTRY_SERVICE_ADMIN_ROLE(), admin, 0);
75
+ _grantRole(REGISTRY_SERVICE_MANAGER_ROLE(), manager, 0);
76
+ }
77
+
78
+ function initialize(address releaseManager, address tokenRegistry)
79
+ external
80
+ restricted // GIF_ADMIN_ROLE
81
+ onlyOnce
82
+ {
83
+ require(ReleaseManager(releaseManager).authority() == address(_accessManager));
84
+ //require(tokenRegistry.authority() == address(_accessManager));
85
+
86
+ _releaseManager = releaseManager;
87
+ _tokenRegistry = tokenRegistry;
88
+
89
+ _configureAdminRole();
90
+ _configureManagerRole();
91
+ _configureReleaseManagerRole();
92
+
93
+ _grantRole(RELEASE_MANAGER_ROLE(), releaseManager, 0);
94
+ }
95
+
96
+ // set unique role for target, role forever have 1 member and never revoked
97
+ function setAndGrantUniqueRole(
98
+ address account,
99
+ address target,
100
+ bytes4[] memory selector
101
+ )
102
+ external
103
+ restricted // RELEASE_MANAGER_ROLE
104
+ onlyInitialized
105
+ returns(RoleId)
106
+ {
107
+ // TODO questionable check...
108
+ // target is not part of `runtime`
109
+ //if(
110
+ // target == address(this) ||
111
+ // target == address(_accessManager) ||
112
+ // target == _releaseManager ||
113
+ // target == _tokenRegistry)
114
+ //{ return TargetInvalid(); }
115
+
116
+ RoleId roleId = _getNextRoleId();
117
+
118
+ _setTargetFunctionRole(target, selector, roleId);
119
+ _grantRole(roleId, account, 0);
120
+ }
121
+
122
+ /*function transferAdmin(address to)
123
+ external
124
+ restricted // only with REGISTRY_SERVICE_ADMIN_ROLE or nft owner
125
+ {
126
+ _accessManager.revoke(REGISTRY_SERVICE_ADMIN_ROLE, );
127
+ _accesssManager.grant(REGISTRY_SERVICE_ADMIN_ROLE, to, 0);
128
+ }*/
129
+
130
+ //--- view functions ----------------------------------------------------//
131
+
132
+ function getAccessManager()
133
+ external
134
+ view
135
+ returns (AccessManager)
136
+ {
137
+ return _accessManager;
138
+ }
139
+
140
+ //--- private functions -------------------------------------------------//
141
+
142
+ function _configureAdminRoleInitial() private
143
+ {
144
+ bytes4[] memory functionSelector = new bytes4[](1);
145
+
146
+ functionSelector[0] = RegistryAccessManager.initialize.selector;
147
+ _setTargetFunctionRole(address(this), functionSelector, REGISTRY_SERVICE_ADMIN_ROLE());
148
+ }
149
+
150
+ function _configureAdminRole() private
151
+ {
152
+ bytes4[] memory functionSelector = new bytes4[](1);
153
+
154
+ // for RegistryServiceProxyManager
155
+ // TODO upgrading with releaseManager.upgrade()->proxy.upgrade()???
156
+ //functionSelector[0] = RegistryServiceManager.upgrade.selector;
157
+ //_setTargetFunctionRole(address(this), functionSelector, REGISTRY_SERVICE_ADMIN_ROLE());
158
+
159
+ // for TokenRegistry
160
+
161
+ // for ReleaseManager
162
+ functionSelector[0] = ReleaseManager.createNextRelease.selector;
163
+ _setTargetFunctionRole(_releaseManager, functionSelector, REGISTRY_SERVICE_ADMIN_ROLE());
164
+ //functionSelector[0] = ReleaseManager.activateNextRelease.selector;
165
+ //_setTargetFunctionRole(_releaseManager, functionSelector, REGISTRY_SERVICE_ADMIN_ROLE());
166
+ }
167
+
168
+ function _configureManagerRole() private
169
+ {
170
+ bytes4[] memory functionSelector = new bytes4[](1);
171
+
172
+ // for TokenRegistry
173
+ functionSelector[0] = TokenRegistry.setActive.selector;
174
+ _setTargetFunctionRole(address(_tokenRegistry), functionSelector, REGISTRY_SERVICE_MANAGER_ROLE());
175
+
176
+ // for ReleaseManager
177
+ functionSelector[0] = ReleaseManager.registerService.selector;
178
+ _setTargetFunctionRole(_releaseManager, functionSelector, REGISTRY_SERVICE_MANAGER_ROLE());
179
+
180
+ // set admin
181
+ _setRoleAdmin(REGISTRY_SERVICE_MANAGER_ROLE(), REGISTRY_SERVICE_ADMIN_ROLE());
182
+ }
183
+
184
+ function _configureReleaseManagerRole() private
185
+ {
186
+ bytes4[] memory functionSelector = new bytes4[](1);
187
+
188
+ functionSelector[0] = RegistryAccessManager.setAndGrantUniqueRole.selector;
189
+ _setTargetFunctionRole(address(this), functionSelector, RELEASE_MANAGER_ROLE());
190
+ }
191
+
192
+ function _setTargetFunctionRole(address target, bytes4[] memory selectors, RoleId roleId) private {
193
+ _accessManager.setTargetFunctionRole(target, selectors, roleId.toInt());
194
+ }
195
+
196
+ function _setRoleAdmin(RoleId roleId, RoleId adminRoleId) private {
197
+ _accessManager.setRoleAdmin(roleId.toInt(), adminRoleId.toInt());
198
+ }
199
+
200
+ function _grantRole(RoleId roleId, address account, uint32 executionDelay) private {
201
+ _accessManager.grantRole(roleId.toInt(), account, executionDelay);
202
+ }
203
+
204
+ function _getNextRoleId() private returns(RoleId roleId) {
205
+ roleId = RoleIdLib.toRoleId(_idNext++);
206
+ }
207
+ }
@@ -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";
@@ -20,9 +16,10 @@ import {IDistributionComponent} from "../../contracts/components/IDistributionCo
20
16
  import {IVersionable} from "../../contracts/shared/IVersionable.sol";
21
17
  import {Versionable} from "../../contracts/shared/Versionable.sol";
22
18
  import {IRegisterable} from "../../contracts/shared/IRegisterable.sol";
19
+ import {Registerable} from "../../contracts/shared/Registerable.sol";
23
20
 
24
21
  import {RoleId, PRODUCT_OWNER_ROLE, POOL_OWNER_ROLE, ORACLE_OWNER_ROLE} from "../../contracts/types/RoleId.sol";
25
- import {ObjectType, REGISTRY, TOKEN, SERVICE, PRODUCT, ORACLE, POOL, TOKEN, INSTANCE, DISTRIBUTION, POLICY, BUNDLE} from "../../contracts/types/ObjectType.sol";
22
+ import {ObjectType, REGISTRY, SERVICE, PRODUCT, ORACLE, POOL, INSTANCE, DISTRIBUTION, POLICY, BUNDLE, STAKE} from "../../contracts/types/ObjectType.sol";
26
23
  import {StateId, ACTIVE, PAUSED} from "../../contracts/types/StateId.sol";
27
24
  import {NftId, NftIdLib, zeroNftId} from "../../contracts/types/NftId.sol";
28
25
  import {Fee, FeeLib} from "../../contracts/types/Fee.sol";
@@ -32,7 +29,6 @@ import {Service} from "../shared/Service.sol";
32
29
  import {IService} from "../shared/IService.sol";
33
30
  import {IRegistryService} from "./IRegistryService.sol";
34
31
  import {Registry} from "./Registry.sol";
35
- import {ChainNft} from "./ChainNft.sol";
36
32
 
37
33
  contract RegistryService is
38
34
  AccessManagedUpgradeable,
@@ -41,116 +37,12 @@ contract RegistryService is
41
37
  {
42
38
  using NftIdLib for NftId;
43
39
 
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
-
62
- // Initial value for constant variable has to be compile-time constant
63
- // TODO define types as constants?
64
- //ObjectType public constant SERVICE_TYPE = REGISTRY();
65
- string public constant NAME = "RegistryService";
66
-
67
40
  // TODO update to real hash when registry is stable
68
41
  bytes32 public constant REGISTRY_CREATION_CODE_HASH = bytes32(0);
69
42
 
70
43
  address public constant NFT_LOCK_ADDRESS = address(0x1);
71
44
 
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
- /// @dev
115
- // msg.sender - ONLY registry owner
116
- // CAN NOT register itself
117
- // CAN register ONLY valid object-parent types combinations for SERVICE
118
- // CAN register ONLY IRegisterable address he owns
119
- // IMPORTANT: MUST NOT check owner before calling external contract
120
- function registerService(IService service)
121
- external
122
- // TODO restrict access - registryService.registerService must use accessmanager for checking permissions as
123
- // services are not always owned by registry owner - actually only registry service is owned by registry owner
124
-
125
- returns(
126
- IRegistry.ObjectInfo memory info,
127
- bytes memory data
128
- )
129
- {
130
-
131
- // CAN revert if no ERC165 support -> will revert with empty message
132
- if(!service.supportsInterface(type(IService).interfaceId)) {
133
- revert NotService();
134
- }
135
-
136
- (
137
- info,
138
- data
139
- ) = _getAndVerifyContractInfo(service, SERVICE(), msg.sender);
140
45
 
141
- info.nftId = _registry.register(info);
142
- service.linkToRegisteredNftId();
143
- return (
144
- info,
145
- data
146
- );
147
- }
148
-
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
46
  function registerInstance(IRegisterable instance)
155
47
  external
156
48
  returns(
@@ -162,18 +54,12 @@ contract RegistryService is
162
54
  revert NotInstance();
163
55
  }
164
56
 
165
- (
166
- info,
167
- data
168
- ) = _getAndVerifyContractInfo(instance, INSTANCE(), msg.sender);
57
+ (info, data) = _getAndVerifyContractInfo(instance, INSTANCE(), msg.sender);
169
58
 
170
59
  info.nftId = _registry.register(info);
171
60
  instance.linkToRegisteredNftId(); // asume safe
172
61
 
173
- return (
174
- info,
175
- data
176
- );
62
+ return (info, data);
177
63
  }
178
64
 
179
65
  function registerProduct(IBaseComponent product, address owner)
@@ -189,21 +75,13 @@ contract RegistryService is
189
75
  revert NotProduct();
190
76
  }
191
77
 
192
- (
193
- info,
194
- data
195
- ) = _getAndVerifyContractInfo(product, PRODUCT(), owner);
196
-
197
- NftId serviceNftId = _registry.getNftId(msg.sender);
78
+ (info, data) = _getAndVerifyContractInfo(product, PRODUCT(), owner);
198
79
 
199
80
  info.nftId = _registry.register(info);
200
81
  // TODO unsafe, let component or its owner derive nftId latter, when state assumptions and modifications of GIF contracts are finished
201
82
  product.linkToRegisteredNftId();
202
83
 
203
- return (
204
- info,
205
- data
206
- );
84
+ return (info, data);
207
85
  }
208
86
 
209
87
  function registerPool(IBaseComponent pool, address owner)
@@ -218,20 +96,12 @@ contract RegistryService is
218
96
  revert NotPool();
219
97
  }
220
98
 
221
- (
222
- info,
223
- data
224
- ) = _getAndVerifyContractInfo(pool, POOL(), owner);
225
-
226
- NftId serviceNftId = _registry.getNftId(msg.sender);
99
+ (info, data) = _getAndVerifyContractInfo(pool, POOL(), owner);
227
100
 
228
101
  info.nftId = _registry.register(info);
229
102
  pool.linkToRegisteredNftId();
230
103
 
231
- return (
232
- info,
233
- data
234
- );
104
+ return (info, data);
235
105
  }
236
106
 
237
107
  function registerDistribution(IBaseComponent distribution, address owner)
@@ -246,20 +116,12 @@ contract RegistryService is
246
116
  revert NotDistribution();
247
117
  }
248
118
 
249
- (
250
- info,
251
- data
252
- ) = _getAndVerifyContractInfo(distribution, DISTRIBUTION(), owner);
253
-
254
- NftId serviceNftId = _registry.getNftId(msg.sender);
119
+ (info, data) = _getAndVerifyContractInfo(distribution, DISTRIBUTION(), owner);
255
120
 
256
121
  info.nftId = _registry.register(info);
257
122
  distribution.linkToRegisteredNftId();
258
123
 
259
- return (
260
- info,
261
- data
262
- );
124
+ return (info, data);
263
125
  }
264
126
 
265
127
  function registerPolicy(IRegistry.ObjectInfo memory info)
@@ -267,8 +129,6 @@ contract RegistryService is
267
129
  restricted
268
130
  returns(NftId nftId)
269
131
  {
270
- NftId senderNftId = _registry.getNftId(msg.sender);
271
-
272
132
  _verifyObjectInfo(info, POLICY());
273
133
 
274
134
  nftId = _registry.register(info);
@@ -279,31 +139,29 @@ contract RegistryService is
279
139
  restricted
280
140
  returns(NftId nftId)
281
141
  {
282
-
283
- NftId senderNftId = _registry.getNftId(msg.sender);
284
-
285
142
  _verifyObjectInfo(info, BUNDLE());
286
143
 
287
144
  nftId = _registry.register(info);
288
145
  }
289
146
 
147
+ function registerStake(IRegistry.ObjectInfo memory info)
148
+ external
149
+ restricted
150
+ returns(NftId nftId)
151
+ {
152
+ _verifyObjectInfo(info, STAKE());
290
153
 
291
- // From IService
292
- function getName() public pure override(IService, Service) returns(string memory) {
293
- return NAME;
154
+ nftId = _registry.register(info);
294
155
  }
295
- //function getType() public pure override(IService, ServiceBase) returns(ObjectType serviceType) {
296
- // return SERVICE_TYPE;
297
- //}
298
156
 
157
+ // From IService
158
+ function getDomain() public pure override(IService, Service) returns(ObjectType serviceDomain) {
159
+ return SERVICE();
160
+ }
299
161
 
300
162
  // from Versionable
301
163
 
302
164
  /// @dev top level initializer
303
- // 1) registry is non upgradeable -> don't need a proxy and uses constructor !
304
- // 2) deploy registry service first -> from its initialization func it is easier to deploy registry then vice versa
305
- // 3) deploy registry -> pass registry service address as constructor argument
306
- // registry is getting instantiated and locked to registry service address forever
307
165
  function _initialize(
308
166
  address owner,
309
167
  bytes memory data
@@ -314,38 +172,66 @@ contract RegistryService is
314
172
  {
315
173
  (
316
174
  address initialAuthority,
317
- bytes memory registryByteCodeWithInitCode
318
- ) = abi.decode(data, (address, bytes));
175
+ address registry
176
+ ) = abi.decode(data, (address, address));
319
177
 
320
178
  __AccessManaged_init(initialAuthority);
321
179
 
322
- bytes memory encodedConstructorArguments = abi.encode(
323
- owner,
324
- getMajorVersion());
180
+ _initializeService(address(registry), owner);
181
+
182
+ _registerInterface(type(IRegistryService).interfaceId);
183
+ }
184
+
185
+ // from IRegisterable
186
+
187
+ function getInitialInfo()
188
+ public
189
+ view
190
+ override(IRegisterable, Registerable)
191
+ returns (IRegistry.ObjectInfo memory info, bytes memory data)
192
+ {
193
+ (info , data) = super.getInitialInfo();
325
194
 
326
- bytes memory registryCreationCode = ContractDeployerLib.getCreationCode(
327
- registryByteCodeWithInitCode,
328
- encodedConstructorArguments);
195
+ FunctionConfig[] memory config = new FunctionConfig[](6);
329
196
 
330
- IRegistry registry = IRegistry(ContractDeployerLib.deploy(
331
- registryCreationCode,
332
- REGISTRY_CREATION_CODE_HASH));
197
+ // registerInstance() have no restriction
198
+ config[0].serviceDomain = INSTANCE();
199
+ config[0].selector = new bytes4[](1);
200
+ config[0].selector[0] = RegistryService.registerInstance.selector;
333
201
 
334
- NftId registryNftId = registry.getNftId(address(registry));
202
+ config[1].serviceDomain = POOL();
203
+ config[1].selector = new bytes4[](1);
204
+ config[1].selector[0] = RegistryService.registerPool.selector;
335
205
 
336
- _initializeService(address(registry), owner);
206
+ config[2].serviceDomain = DISTRIBUTION();
207
+ config[2].selector = new bytes4[](1);
208
+ config[2].selector[0] = RegistryService.registerDistribution.selector;
337
209
 
338
- // TODO why do registry service proxy need to keep its nftId??? -> no registryServiceNftId checks in implementation
339
- // if they are -> use registry address to obtain owner of registry service nft (works the same with any registerable and(or) implementation)
340
- linkToRegisteredNftId();
341
- _registerInterface(type(IRegistryService).interfaceId);
210
+ config[3].serviceDomain = PRODUCT();
211
+ config[3].selector = new bytes4[](1);
212
+ config[3].selector[0] = RegistryService.registerProduct.selector;
213
+
214
+ config[4].serviceDomain = POLICY();
215
+ config[4].selector = new bytes4[](1);
216
+ config[4].selector[0] = RegistryService.registerPolicy.selector;
217
+
218
+ config[5].serviceDomain = BUNDLE();
219
+ config[5].selector = new bytes4[](1);
220
+ config[5].selector[0] = RegistryService.registerBundle.selector;
221
+
222
+ /*config[6].serviceDomain = STAKE();
223
+ config[6].selector = new bytes4[](1);
224
+ config[6].selector[0] = RegistryService.registerStake.selector;*/
225
+
226
+ data = abi.encode(config);
342
227
  }
343
228
 
344
- // parent check done in registry because of approve()
229
+ // Internal
230
+
345
231
  function _getAndVerifyContractInfo(
346
232
  IRegisterable registerable,
347
233
  ObjectType expectedType, // assume can be valid only
348
- address expectedOwner // assume can be 0
234
+ address expectedOwner // assume can be 0 when given by other service
349
235
  )
350
236
  internal
351
237
  view
@@ -394,31 +280,31 @@ contract RegistryService is
394
280
  revert InvalidParent(parentNftId);
395
281
  }*/
396
282
 
397
- return(
398
- info,
399
- data
400
- );
283
+ return(info, data);
401
284
  }
402
285
 
403
- // parent checks done in registry because of approve()
404
286
  function _verifyObjectInfo(
405
287
  IRegistry.ObjectInfo memory info,
406
- ObjectType objectType
288
+ ObjectType expectedType
407
289
  )
408
290
  internal
409
291
  view
410
292
  {
411
- if(info.objectAddress > address(0)) {
412
- revert InvalidAddress(info.objectAddress);
293
+ // enforce instead of check
294
+ info.objectAddress = address(0);
295
+
296
+ if(info.objectType != expectedType) {// type is checked in registry anyway...but service logic may depend on expected value
297
+ revert UnexpectedRegisterableType(expectedType, info.objectType);
413
298
  }
414
299
 
415
- if(
416
- getRegistry().isRegistered(info.initialOwner) ||
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);
300
+ address owner = info.initialOwner;
301
+
302
+ if(owner == address(0)) {
303
+ revert RegisterableOwnerIsZero();
304
+ }
305
+
306
+ if(getRegistry().isRegistered(owner)) {
307
+ revert RegisterableOwnerIsRegistered();
422
308
  }
423
309
 
424
310
  // can catch all 3 if check that initialOwner is not registered