@etherisc/gif-next 0.0.2-790d44b-698 → 0.0.2-7acbd99-227

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 (222) hide show
  1. package/README.md +40 -25
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +80 -41
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +101 -61
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +43 -40
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +55 -52
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +100 -113
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +50 -47
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +150 -126
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +110 -52
  18. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  35. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  36. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +196 -72
  37. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +1 -1
  38. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  39. package/artifacts/contracts/instance/Instance.sol/Instance.json +281 -155
  40. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  41. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +61 -32
  42. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  43. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +1 -1
  44. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  45. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  46. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +1 -1
  47. package/artifacts/contracts/instance/base/IService.sol/IService.json +43 -40
  48. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +1 -1
  49. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.json +64 -48
  50. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  51. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  52. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +1 -1
  53. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +1 -1
  54. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.json +57 -41
  55. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +1 -1
  56. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +1 -1
  57. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +1 -1
  58. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +1 -1
  59. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +1 -1
  60. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +1 -1
  61. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +1 -1
  62. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +1 -1
  63. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +1 -1
  64. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +1 -1
  65. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.json +2 -2
  66. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +1 -1
  67. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +1 -1
  68. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +1 -1
  69. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +1 -1
  70. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
  71. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +1 -1
  72. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +1 -1
  73. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.json +29 -9
  74. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
  75. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.json +28 -8
  76. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +1 -1
  77. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +1 -1
  78. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +1 -1
  79. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +2 -2
  80. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +1 -1
  81. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +1 -1
  82. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.json +138 -11
  83. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  84. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +2 -2
  85. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +1 -1
  86. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.json +138 -11
  87. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  88. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +164 -69
  89. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  90. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +86 -44
  91. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  92. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +43 -59
  93. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  94. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +43 -40
  95. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  96. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +43 -40
  97. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  98. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +43 -40
  99. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  100. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +88 -46
  101. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  102. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +110 -68
  103. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  104. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +141 -12
  105. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  106. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +5 -0
  107. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  108. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +293 -40
  109. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
  110. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +4 -0
  111. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +668 -0
  112. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +4 -0
  113. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +34 -0
  114. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  115. package/artifacts/contracts/registry/Registry.sol/Registry.json +390 -292
  116. package/artifacts/contracts/registry/Registry.sol/RegistryCreationCode.dbg.json +4 -0
  117. package/artifacts/contracts/registry/Registry.sol/RegistryCreationCode.json +150 -0
  118. package/artifacts/contracts/registry/RegistryInstaller.sol/RegistryInstaller.dbg.json +4 -0
  119. package/artifacts/contracts/registry/RegistryInstaller.sol/RegistryInstaller.json +344 -0
  120. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +4 -0
  121. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +861 -0
  122. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  123. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  124. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +1 -1
  125. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  126. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +43 -40
  127. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  128. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  129. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +310 -0
  130. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  131. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +76 -37
  132. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  133. package/artifacts/contracts/shared/{Proxy.sol/ProxyWithProxyAdminGetter.json → UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json} +4 -4
  134. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  135. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +1 -1
  136. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +101 -61
  137. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  138. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +1 -1
  139. package/artifacts/contracts/test/TestPool.sol/TestPool.json +150 -126
  140. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +1 -1
  141. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +115 -58
  142. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  143. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +93 -39
  144. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  145. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  146. package/artifacts/contracts/test/TestService.sol/TestService.json +80 -51
  147. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  148. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  149. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  150. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  151. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +2 -2
  152. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  153. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  154. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  155. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  156. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  157. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  158. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  159. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  160. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  161. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +1 -1
  162. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  163. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  164. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  165. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  166. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  167. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  168. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  169. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  170. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +2 -2
  171. package/contracts/components/BaseComponent.sol +12 -27
  172. package/contracts/components/Distribution.sol +29 -6
  173. package/contracts/components/IBaseComponent.sol +2 -2
  174. package/contracts/components/IPoolComponent.sol +2 -8
  175. package/contracts/components/IProductComponent.sol +2 -1
  176. package/contracts/components/Pool.sol +84 -73
  177. package/contracts/components/Product.sol +85 -13
  178. package/contracts/instance/IInstance.sol +4 -3
  179. package/contracts/instance/Instance.sol +14 -3
  180. package/contracts/instance/base/ComponentServiceBase.sol +13 -6
  181. package/contracts/instance/base/IInstanceBase.sol +3 -2
  182. package/contracts/instance/base/InstanceBase.sol +6 -8
  183. package/contracts/instance/base/ServiceBase.sol +19 -13
  184. package/contracts/instance/module/component/ComponentModule.sol +5 -4
  185. package/contracts/instance/module/component/IComponent.sol +2 -2
  186. package/contracts/instance/module/pool/IPoolModule.sol +4 -3
  187. package/contracts/instance/module/pool/PoolModule.sol +12 -7
  188. package/contracts/instance/module/treasury/ITreasury.sol +7 -5
  189. package/contracts/instance/module/treasury/TokenHandler.sol +2 -2
  190. package/contracts/instance/module/treasury/TreasuryModule.sol +21 -28
  191. package/contracts/instance/service/ComponentOwnerService.sol +181 -66
  192. package/contracts/instance/service/DistributionService.sol +6 -11
  193. package/contracts/instance/service/IComponentOwnerService.sol +0 -2
  194. package/contracts/instance/service/PoolService.sol +19 -19
  195. package/contracts/instance/service/ProductService.sol +20 -20
  196. package/contracts/registry/ChainNft.sol +43 -15
  197. package/contracts/registry/IChainNft.sol +3 -2
  198. package/contracts/registry/IRegistry.sol +44 -28
  199. package/contracts/registry/IRegistryService.sol +29 -0
  200. package/contracts/registry/ITransferInterceptor.sol +6 -0
  201. package/contracts/registry/Registry.sol +368 -328
  202. package/contracts/registry/RegistryInstaller.sol +100 -0
  203. package/contracts/registry/RegistryService.sol +383 -0
  204. package/contracts/shared/ERC165.sol +1 -1
  205. package/contracts/shared/IRegisterable.sol +7 -9
  206. package/contracts/shared/IVersionable.sol +15 -13
  207. package/contracts/shared/ProxyManager.sol +115 -0
  208. package/contracts/shared/Registerable.sol +74 -43
  209. package/contracts/shared/UpgradableProxyWithAdmin.sol +16 -0
  210. package/contracts/shared/Versionable.sol +46 -40
  211. package/contracts/test/TestDistribution.sol +3 -2
  212. package/contracts/test/TestPool.sol +4 -2
  213. package/contracts/test/TestProduct.sol +4 -2
  214. package/contracts/test/TestRegisterable.sol +5 -6
  215. package/contracts/test/TestService.sol +5 -11
  216. package/contracts/types/Version.sol +1 -0
  217. package/package.json +1 -1
  218. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.dbg.json +0 -4
  219. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.json +0 -248
  220. package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.dbg.json +0 -4
  221. package/contracts/experiment/statemachine/README.md +0 -112
  222. package/contracts/shared/Proxy.sol +0 -94
@@ -10,449 +10,489 @@ import {IRegistry} from "./IRegistry.sol";
10
10
  import {NftId, toNftId, zeroNftId, NftIdLib} from "../types/NftId.sol";
11
11
  import {Version, VersionPart, VersionLib} from "../types/Version.sol";
12
12
  import {ObjectType, PROTOCOL, REGISTRY, TOKEN, SERVICE, INSTANCE, STAKE, PRODUCT, DISTRIBUTION, ORACLE, POOL, POLICY, BUNDLE} from "../types/ObjectType.sol";
13
+ import {ITransferInterceptor} from "./ITransferInterceptor.sol";
13
14
 
14
- import {Versionable} from "../shared/Versionable.sol";
15
+ import {IOwnable} from "../shared/IOwnable.sol";
16
+ import {ERC165} from "../shared/ERC165.sol";
15
17
 
16
18
 
19
+ // IMPORTANT
20
+ // Each NFT minted by registry is accosiated with:
21
+ // 1) NFT owner
22
+ // 2) registred contract OR object stored in registered (parent) contract
23
+ // Four registration flows:
24
+ // 1) non IRegisterable address by registryOwner (TOKEN)
25
+ // 2) IRegisterable address by registryOwner (SERVICE)
26
+ // 3) IRegisterable address by approved service (INSTANCE, COMPONENT)
27
+ // 4) state object by approved service (POLICY, BUNDLE, STAKE)
28
+
17
29
  contract Registry is
18
- Versionable,
19
- IRegisterable,
30
+ ERC165,
20
31
  IRegistry
21
32
  {
22
- using NftIdLib for NftId;
23
-
33
+ // register
34
+ error NotRegistryService();
35
+ error ZeroParentAddress();
36
+ error ContractAlreadyRegistered(address objectAddress);
37
+ error InvalidServiceVersion(VersionPart majorVersion);
38
+ error ServiceNameAlreadyRegistered(string name, VersionPart majorVersion);
39
+
40
+ // approve
41
+ error NotOwner();
42
+ error NotRegisteredContract(NftId registrarNftId);
43
+ error NotService(NftId registrarNftId);
44
+ error InvalidTypesCombination(ObjectType objectType, ObjectType parentType);
45
+
46
+ uint256 public constant MAJOR_VERSION_MIN = 3;
47
+
24
48
  string public constant EMPTY_URI = "";
25
49
 
26
- // IMPORTANT Every new version with storage changes must implement its own struct
27
- // copy paste previous version and add changes
28
- // @custom:storage-location erc7201:gif-next.contracts.registry.Registry.sol
29
- struct StorageV1 {
50
+ address constant public NFT_LOCK_ADDRESS = address(0x1);
51
+
52
+ mapping(NftId nftId => ObjectInfo info) _info;
53
+ mapping(address object => NftId nftId) _nftIdByAddress;
54
+
55
+ mapping(NftId registrator => mapping(
56
+ ObjectType objectType => bool)) _isApproved;
30
57
 
31
- mapping(NftId nftId => ObjectInfo info) _info;
32
- mapping(address object => NftId nftId) _nftIdByAddress;
33
- mapping(ObjectType objectType => bool) _isValidType;
34
- mapping(ObjectType objectType => mapping(ObjectType objectParentType => bool)) _isValidParentType;
58
+ mapping(ObjectType objectType => mapping(
59
+ ObjectType parentType => bool)) _isValidContractCombination;
35
60
 
36
- mapping(NftId nftId => string stringValue) _string;
37
- mapping(bytes32 serviceNameHash => mapping(VersionPart majorVersion => address service)) _service;
61
+ mapping(ObjectType objectType => mapping(
62
+ ObjectType parentType => bool)) _isValidObjectCombination;
38
63
 
39
- NftId _nftId;
40
- IChainNft _chainNft;
41
- ChainNft _chainNftInternal;
42
- address _initialOwner;
64
+ mapping(NftId nftId => string name) _string;
65
+ mapping(bytes32 serviceNameHash => mapping(
66
+ VersionPart majorVersion => address service)) _service;
67
+
68
+ NftId _registryNftId;
69
+ NftId _serviceNftId; // set in stone upon registry creation
70
+ IChainNft _chainNft;
71
+ ChainNft _chainNftInternal;
72
+
73
+ /*
74
+ modifier onlyInitialOwner() {
75
+ if(
76
+ msg.sender != getOwner() ||
77
+ msg.sender != _info[_registryNftId].initialOwner) {
78
+ revert NotInitialOwner();
79
+ }
80
+ }*/
43
81
 
44
- /// @dev will own protocol nft and registry nft(s) minted during initialize
45
- address _protocolOwner;
46
- // if struct goes here
47
- // then you cannot add new vars here
82
+ modifier onlyOwner() {
83
+ if(msg.sender != getOwner()) {
84
+ revert NotOwner();
85
+ }
86
+ _;
48
87
  }
49
88
 
50
- // TODO do not use gif-next in namespace id
51
- // TODO ask openzeppelin about public location
52
- // keccak256(abi.encode(uint256(keccak256("gif-next.contracts.registry.Registry.sol")) - 1)) & ~bytes32(uint256(0xff));
53
- bytes32 public constant LOCATION_V1 = 0x6548007c3f4340f82f348c576c0ff69f4f529cadd5ad41f96aae61abceeaa300;
54
-
55
- // TODO check how usage of "$.data" influences gas costs
56
- // IMPORTANT Every new version must implement this function
57
- // keep it private -> if unreachable from the next version then not included in its byte code
58
- // each version MUST use the same locationV1, just change return type
59
- function _getStorage() private pure returns (StorageV1 storage $) {
60
- assembly {
61
- $.slot := LOCATION_V1
89
+ modifier onlyRegistryService() {
90
+
91
+ if(msg.sender != _info[_serviceNftId].objectAddress) {
92
+ revert NotRegistryService();
62
93
  }
94
+ _;
63
95
  }
64
96
 
65
- /// @dev the protocol owner will get ownership of the
66
- // protocol nft and the global registry nft minted in this
67
- // initializer function
68
- function _initialize(bytes memory data)
69
- internal
70
- onlyInitializing
71
- virtual override
97
+ constructor(address registryOwner, VersionPart majorVersion)
72
98
  {
73
- address protocolOwner = abi.decode(data, (address));
74
- StorageV1 storage $ = _getStorage();
99
+ require(registryOwner > address(0), "Registry: protocol owner is 0");
100
+ require(majorVersion.toInt() == MAJOR_VERSION_MIN, "Registry: initial major version of registry service is not MAJOR_VERSION_MIN");
75
101
 
76
- // TODO here delegate call from proxy constructor, msg.sender is proxy deployer -> Proxy.sol
77
- $._initialOwner = msg.sender;
78
- $._protocolOwner = protocolOwner;
79
-
80
- // TODO deployment size is to big, call another contract which keeps and deploys ChainNft byte code
81
102
  // deploy NFT
82
- $._chainNftInternal = new ChainNft(address(this));// adds 10kb to deployment size
83
- $._chainNft = IChainNft($._chainNftInternal);
84
-
103
+ _chainNftInternal = new ChainNft(address(this));// adds 10kb to deployment size
104
+ _chainNft = IChainNft(_chainNftInternal);
105
+
85
106
  // initial registry setup
86
107
  _registerProtocol();
87
- $._nftId = _registerRegistry();
88
-
89
- // setup rules for further registrations
90
- _setupValidTypes();
91
- _setupValidParentTypes();
92
- }
93
-
94
- function register(
95
- address objectAddress
96
- )
97
- // TODO add authz (only services may register components etc)
98
- // we have to check how we do authz for registring services (just restrict to protocol owner/registry owner)
99
- external override returns (NftId nftId) {
100
- StorageV1 storage $ = _getStorage();
101
-
102
- require(
103
- $._nftIdByAddress[objectAddress].eqz(),
104
- "ERROR:REG-002:ALREADY_REGISTERED"
105
- );
106
-
107
- IRegisterable registerable = IRegisterable(objectAddress);
108
- require(
109
- registerable.supportsInterface(type(IRegisterable).interfaceId),
110
- "ERROR:REG-003:NOT_REGISTERABLE"
111
- );
112
-
113
- ObjectType objectType = registerable.getType();
114
- require(
115
- $._isValidType[objectType],
116
- "ERROR:REG-004:TYPE_INVALID"
117
- );
118
-
119
- NftId parentNftId = registerable.getParentNftId();
120
- require(
121
- isRegistered(parentNftId),
122
- "ERROR:REG-005:PARENT_NOT_REGISTERED"
123
- );
124
-
125
- require(
126
- $._isValidParentType[objectType][$._info[parentNftId].objectType],
127
- "ERROR:REG-006:PARENT_TYPE_INVALID"
128
- );
129
108
 
130
- // also check that nftId and parentNFtId are on the same chain if applicable
109
+ _registerRegistry(registryOwner);
131
110
 
132
- // nft minting
133
- uint256 mintedTokenId = $._chainNft.mint(
134
- registerable.getOwner(),
135
- EMPTY_URI
136
- );
111
+ _registerRegistryService();
137
112
 
138
- nftId = toNftId(mintedTokenId);
113
+ // set object parent relations
114
+ _setupValidObjectParentCombinations();
139
115
 
140
- // special case services
141
- if(registerable.getType() == SERVICE()) {
142
- IService service = IService(objectAddress);
143
- require(
144
- service.supportsInterface(type(IService).interfaceId),
145
- "ERROR:REG-007:NOT_SERVICE"
146
- );
147
-
148
- string memory serviceName = service.getName();
149
- VersionPart majorVersion = service.getMajorVersion();
150
- bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
151
-
152
- // service specific state
153
- $._string[nftId] = serviceName;
154
-
155
- require(
156
- $._service[serviceNameHash][majorVersion] == address(0),
157
- "ERROR:REG-008:ALREADY_REGISTERED"
158
- );
159
- $._service[serviceNameHash][majorVersion] = objectAddress;
160
- }
161
-
162
- // create object info and link nft id with it
163
- _registerObjectInfo(registerable, nftId);
116
+ _registerInterface(type(IRegistry).interfaceId);
117
+ _registerInterface(type(IOwnable).interfaceId);
164
118
  }
165
119
 
166
-
167
- function registerObjectForInstance(
168
- NftId parentNftId,
169
- ObjectType objectType,
170
- address initialOwner,
171
- bytes memory data
172
- )
120
+ /// @dev registry protects only from tampering existing records and invalid types pairs
121
+ // IMPORTANT: rare case when parentNftId is not registered and == next nftId -> technincally this is ZeroParentAddress error
122
+ // to catch this check parent address before minting !!!!
123
+ // TODO service registration means its approval for some type?
124
+ function register(ObjectInfo memory info)
173
125
  external
174
- override
175
- returns (
176
- // TODO add onlyRegisteredInstance
177
- NftId nftId
178
- )
126
+ onlyRegistryService
127
+ returns(NftId nftId)
179
128
  {
180
- StorageV1 storage $ = _getStorage();
129
+ ObjectType objectType = info.objectType;
130
+ NftId parentNftId = info.parentNftId;
131
+ ObjectInfo memory parentInfo = _info[parentNftId];
132
+ ObjectType parentType = parentInfo.objectType; // see function header
133
+ address parentAddress = parentInfo.objectAddress;
134
+
135
+ // parent is contract -> need to check? -> check before minting
136
+ // special case: global registry nft as parent when not on mainnet -> global registry address is 0
137
+ // special case: when parentNftId == _chainNft.mint(), check for zero parent address before mint
138
+ // special case: when parentNftId == _chainNft.mint() && objectAddress == initialOwner
139
+ if(parentAddress == address(0)) {
140
+ revert ZeroParentAddress();
141
+ }
181
142
 
182
- // TODO add more validation
183
- require(
184
- objectType == POLICY() || objectType == BUNDLE(),
185
- "ERROR:REG-010:TYPE_INVALID"
186
- );
143
+ address interceptor = _getInterceptor(info.isInterceptor, info.objectAddress, parentInfo.isInterceptor, parentAddress);
187
144
 
188
- uint256 mintedTokenId = $._chainNft.mint(initialOwner, EMPTY_URI);
145
+ uint256 mintedTokenId = _chainNft.mint(
146
+ info.initialOwner,
147
+ interceptor,
148
+ EMPTY_URI);
189
149
  nftId = toNftId(mintedTokenId);
190
150
 
191
- ObjectInfo memory info = ObjectInfo(
192
- nftId,
193
- parentNftId,
194
- objectType,
195
- address(0),
196
- initialOwner,
197
- data
198
- );
199
-
200
- $._info[nftId] = info;
201
-
202
- // add logging
203
- }
151
+ // TODO move nftId out of info struct
152
+ // getters by nftId -> return struct without nftId
153
+ // getters by address -> return nftId AND struct
154
+ info.nftId = nftId;
155
+ _info[nftId] = info;
156
+
157
+ if(info.objectAddress > address(0))
158
+ {
159
+ // TODO if need to add types latter -> at least call this check from registry service
160
+ // parent is registered + object-parent types are valid
161
+ if(_isValidContractCombination[objectType][parentType] == false) {
162
+ revert InvalidTypesCombination(objectType, parentType);
163
+ }
164
+
165
+ address contractAddress = info.objectAddress;
166
+
167
+ if(_nftIdByAddress[contractAddress].gtz()) {
168
+ revert ContractAlreadyRegistered(contractAddress);
169
+ }
170
+
171
+ _nftIdByAddress[contractAddress] = nftId;
172
+
173
+ // special case
174
+ if(objectType == SERVICE())
175
+ {
176
+ (
177
+ string memory serviceName,
178
+ VersionPart majorVersion
179
+ ) = abi.decode(info.data, (string, VersionPart));
180
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
181
+
182
+ // TODO MUST guarantee consistency of registerable.getVersion() and majorVersion here
183
+ // TODO update _serviceNftId when registryService with new major version is registered? -> it is fixed in current setup
184
+ // TODO do not use names -> each object type is registered by corresponding service -> conflicting with approve()
185
+ if(
186
+ majorVersion.toInt() < MAJOR_VERSION_MIN ||
187
+ (majorVersion.toInt() > MAJOR_VERSION_MIN &&
188
+ _service[serviceNameHash][VersionLib.toVersionPart(majorVersion.toInt() - 1)] == address(0) )
189
+ ) {
190
+ revert InvalidServiceVersion(majorVersion);
191
+ }
192
+
193
+ if(_service[serviceNameHash][majorVersion] != address(0)) {
194
+ revert ServiceNameAlreadyRegistered(serviceName, majorVersion);
195
+ }
196
+
197
+ _string[nftId] = serviceName;
198
+ _service[serviceNameHash][majorVersion] = contractAddress;
199
+
200
+ emit LogServiceNameRegistration(serviceName, majorVersion);
201
+ }
202
+ }
203
+ else
204
+ {
205
+ if(_isValidObjectCombination[objectType][parentType] == false) {
206
+ revert InvalidTypesCombination(objectType, parentType);
207
+ }
208
+ }
204
209
 
205
- function getObjectCount() external view override returns (uint256) {
206
- return _getStorage()._chainNft.totalSupply();
210
+ emit LogRegistration(nftId, info.parentNftId, info.objectType, info.objectAddress, info.initialOwner);
207
211
  }
208
212
 
209
- function getNftId(
210
- address object
211
- ) external view override returns (NftId id) {
212
- return _getStorage()._nftIdByAddress[object];
213
+ function registerFrom(
214
+ address from,
215
+ ObjectInfo memory info
216
+ ) external returns (NftId nftId)
217
+ {
218
+ revert();
213
219
  }
220
+
221
+
222
+ /// @dev
223
+ // msg.sender - registry owner
224
+ // CAN approve only registered service contract
225
+ // CAN approve any combination specified in _isValidCombination
226
+ // CAN NOT approve itself
227
+ // TODO in case where exists exactly one registered service per objectType (and major version):
228
+ // - registration and approve is a single operation, no need for separate approve() function
229
+ // - then approve can be used to adding new valid object-parent combinations???
230
+ function approve(
231
+ NftId serviceNftId,
232
+ ObjectType objectType,
233
+ ObjectType parentType
234
+ )
235
+ public
236
+ onlyOwner()
237
+ {
238
+ address serviceAddress = _info[serviceNftId].objectAddress;
239
+
240
+ if(_nftIdByAddress[serviceAddress].eqz()) {
241
+ revert NotRegisteredContract(serviceNftId);
242
+ }
214
243
 
215
- function isRegistered(
216
- NftId nftId
217
- ) public view override returns (bool) {
218
- return _getStorage()._info[nftId].objectType.gtz();
219
- }
244
+ if(_info[serviceNftId].objectType != SERVICE()) {
245
+ revert NotService(serviceNftId);
246
+ }
220
247
 
221
- function isRegistered(
222
- address object
223
- ) external view override returns (bool) {
224
- return _getStorage()._nftIdByAddress[object].gtz();
225
- }
248
+ if(
249
+ _isValidContractCombination[objectType][parentType] == false &&
250
+ _isValidObjectCombination[objectType][parentType] == false) {
251
+ revert InvalidTypesCombination(objectType, parentType);
252
+ }
226
253
 
227
- function getObjectInfo(
228
- NftId nftId
229
- ) external view override returns (ObjectInfo memory info) {
230
- return _getStorage()._info[nftId];
231
- }
254
+ _isApproved[serviceNftId][objectType] = true;
232
255
 
233
- function getName(
234
- NftId nftId
235
- ) external view returns (string memory name) {
236
- return _getStorage()._string[nftId];
256
+ emit LogApproval(serviceNftId, objectType);
237
257
  }
238
258
 
239
- function getOwner(NftId nftId) external view override returns (address) {
240
- return _getStorage()._chainNft.ownerOf(nftId.toInt());
259
+ /// @dev returns false for registry owner nft
260
+ // TODO allowance by address?
261
+ // TODO checked by registry service -> but registry owner can upgrade registry service not to check allowance....
262
+ function allowance(
263
+ NftId nftId,
264
+ ObjectType object
265
+ )
266
+ public
267
+ view
268
+ returns (bool)
269
+ {
270
+ return _isApproved[nftId][object];
241
271
  }
242
272
 
243
- function getChainNft() external view override returns (IChainNft) {
244
- return _getStorage()._chainNft;
273
+ // from IRegistry
274
+ function getObjectCount() external view override returns (uint256) {
275
+
276
+ return _chainNft.totalSupply();
245
277
  }
246
278
 
247
- // special case to retrive a gif service
248
- function getServiceAddress(string memory serviceName, VersionPart majorVersion) external view override returns (address serviceAddress) {
249
- bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
250
- return _getStorage()._service[serviceNameHash][majorVersion];
279
+ function getNftId(address object) external view override returns (NftId id) {
280
+ return _nftIdByAddress[object];
251
281
  }
252
282
 
253
- // from IERC165
254
- function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {
255
- return interfaceId == type(IRegistry).interfaceId;
283
+ function ownerOf(NftId nftId) public view override returns (address) {
284
+ return _chainNft.ownerOf(nftId.toInt());
256
285
  }
257
286
 
258
- // from IRegistryLinked
259
- function getRegistry() external view override returns (IRegistry registry) {
260
- return this;
287
+ function ownerOf(address contractAddress) public view returns (address) {
288
+
289
+ return _chainNft.ownerOf(_nftIdByAddress[contractAddress].toInt());
261
290
  }
262
291
 
263
- // from IVersionable
264
- function getVersion() public pure virtual override returns (Version) {
265
- return VersionLib.toVersion(1, 0, 0);
266
- }
267
-
268
- // from IRegisterable
269
- // TODO
270
- // 1) Registerable can not register itself -> otherwise register have to trust owner address provided by registerable
271
- // registerable owner MUST call register and provide registerable address
272
- // 2) Who is msg.sender here???
273
- function register() external pure override returns (NftId nftId) {
274
- return zeroNftId();
292
+ function getObjectInfo(NftId nftId) external view override returns (ObjectInfo memory) {
293
+ return _info[nftId];
275
294
  }
276
295
 
277
- function getType() external pure override returns (ObjectType objectType) {
278
- return REGISTRY();
296
+ function getObjectInfo(address object) external view override returns (ObjectInfo memory) {
297
+
298
+ return _info[_nftIdByAddress[object]];
279
299
  }
280
300
 
281
- function getOwner() public view override returns (address owner) {
282
- StorageV1 storage $ = _getStorage();
283
- return $._nftId.gtz() ? this.getOwner($._nftId) : $._initialOwner;
301
+ function isRegistered(NftId nftId) public view override returns (bool) {
302
+ return _info[nftId].objectType.gtz();
284
303
  }
285
304
 
286
- function getNftId() public view override (IRegisterable, IRegistry) returns (NftId nftId) {
287
- return _getStorage()._nftId;
305
+ function isRegistered(address object) external view override returns (bool) {
306
+ return _nftIdByAddress[object].gtz();
288
307
  }
289
308
 
290
- function getParentNftId() public view returns (NftId nftId) {
291
- StorageV1 storage $ = _getStorage();
292
- nftId = $._info[$._nftId].parentNftId;
309
+ function getServiceName(NftId nftId) external view returns (string memory) {
310
+ return _string[nftId];
293
311
  }
294
312
 
295
- function getData() public pure returns (bytes memory data) {
296
- return "";
313
+ // special case to retrive a gif service
314
+ function getServiceAddress(
315
+ string memory serviceName,
316
+ VersionPart majorVersion
317
+ ) external view returns (address)
318
+ {
319
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
320
+ return _service[serviceNameHash][majorVersion];
297
321
  }
298
322
 
299
- // registry specific functions
300
- function getProtocolOwner() external view override returns (address) {
301
- return _getStorage()._protocolOwner;
323
+ function getChainNft() external view override returns (IChainNft) {
324
+ return _chainNft;
302
325
  }
303
326
 
304
- /// @dev defines which types are allowed to register
305
- function _setupValidTypes() internal onlyInitializing {
306
- StorageV1 storage $ = _getStorage();
307
- $._isValidType[REGISTRY()] = true; // only for global registry
308
- $._isValidType[TOKEN()] = true;
309
- $._isValidType[SERVICE()] = true;
310
- $._isValidType[INSTANCE()] = true;
311
- $._isValidType[STAKE()] = true;
312
- $._isValidType[PRODUCT()] = true;
313
- $._isValidType[ORACLE()] = true;
314
- $._isValidType[POOL()] = true;
315
- $._isValidType[DISTRIBUTION()] = true;
316
- $._isValidType[POLICY()] = true;
317
- $._isValidType[BUNDLE()] = true;
327
+ // from IOwnable
328
+ function getOwner() public view returns (address owner) {
329
+ return ownerOf(address(this));
318
330
  }
319
331
 
320
- /// @dev defines which types - parent type relations are allowed to register
321
- function _setupValidParentTypes() internal onlyInitializing {
322
- StorageV1 storage $ = _getStorage();
323
- // registry as parent
324
- $._isValidParentType[TOKEN()][REGISTRY()] = true;
325
- $._isValidParentType[SERVICE()][REGISTRY()] = true;
326
- $._isValidParentType[INSTANCE()][REGISTRY()] = true;
327
-
328
- // instance as parent
329
- $._isValidParentType[PRODUCT()][INSTANCE()] = true;
330
- $._isValidParentType[DISTRIBUTION()][INSTANCE()] = true;
331
- $._isValidParentType[ORACLE()][INSTANCE()] = true;
332
- $._isValidParentType[POOL()][INSTANCE()] = true;
333
-
334
- // product as parent
335
- $._isValidParentType[POLICY()][PRODUCT()] = true;
336
-
337
- // pool as parent
338
- $._isValidParentType[BUNDLE()][POOL()] = true;
339
- $._isValidParentType[STAKE()][POOL()] = true;
340
- }
332
+ // Internals, called only in constructor
341
333
 
342
334
  /// @dev protocol registration used to anchor the dip ecosystem relations
343
335
  function _registerProtocol()
344
- virtual
345
336
  internal
346
- onlyInitializing
347
337
  {
348
- StorageV1 storage $ = _getStorage();
338
+ uint256 protocolId = _chainNftInternal.PROTOCOL_NFT_ID();
339
+ NftId protocolNftId = toNftId(protocolId);
349
340
 
350
- uint256 protocolId = $._chainNftInternal.PROTOCOL_NFT_ID();
351
- $._chainNftInternal.mint($._protocolOwner, protocolId);
341
+ _chainNftInternal.mint(NFT_LOCK_ADDRESS, protocolId);
352
342
 
353
- NftId protocolNftid = toNftId(protocolId);
354
- ObjectInfo memory protocolInfo = ObjectInfo(
355
- protocolNftid,
356
- zeroNftId(), // parent nft id
343
+ _info[protocolNftId] = ObjectInfo(
344
+ protocolNftId,
345
+ zeroNftId(), // parent
357
346
  PROTOCOL(),
358
- address(0), // contract address
359
- $._protocolOwner,
360
- "" // data
347
+ false, // isInterceptor
348
+ address(0), // objectAddress
349
+ NFT_LOCK_ADDRESS,// initialOwner
350
+ ""
361
351
  );
362
-
363
- $._info[protocolNftid] = protocolInfo;
364
352
  }
365
353
 
366
354
  /// @dev registry registration
367
355
  /// might also register the global registry when not on mainnet
368
- function _registerRegistry()
369
- virtual
356
+ function _registerRegistry(address registryOwner)
370
357
  internal
371
- onlyInitializing
372
- returns (NftId registryNftId)
373
358
  {
374
- StorageV1 storage $ = _getStorage();
359
+ uint256 registryId = _chainNftInternal.calculateTokenId(2);
360
+ NftId registryNftId = toNftId(registryId);
375
361
 
376
- uint256 registryId = $._chainNftInternal.calculateTokenId(2);
377
- registryNftId = toNftId(registryId);
362
+ NftId parentNftId;
378
363
 
379
- // we're not the global registry
380
- if(registryId != $._chainNftInternal.GLOBAL_REGISTRY_ID()) {
364
+ if(registryId != _chainNftInternal.GLOBAL_REGISTRY_ID())
365
+ {// we're not the global registry
381
366
  _registerGlobalRegistry();
367
+ parentNftId = toNftId(_chainNftInternal.GLOBAL_REGISTRY_ID());
368
+ }
369
+ else
370
+ {// we are global registry
371
+ parentNftId = toNftId(_chainNftInternal.PROTOCOL_NFT_ID());
382
372
  }
383
373
 
384
- $._chainNftInternal.mint($._protocolOwner, registryId);
374
+ _chainNftInternal.mint(registryOwner, registryId);
385
375
 
386
- NftId parentNftId;
387
- // we're the global registry
388
- if(block.chainid == 1) {
389
- parentNftId = toNftId($._chainNftInternal.PROTOCOL_NFT_ID());
390
- }
391
- else {
392
- parentNftId = toNftId($._chainNftInternal.GLOBAL_REGISTRY_ID());
393
- }
394
- ObjectInfo memory registryInfo = ObjectInfo(
376
+ _info[registryNftId] = ObjectInfo(
395
377
  registryNftId,
396
378
  parentNftId,
397
379
  REGISTRY(),
398
- address(this), // proxy address
399
- $._protocolOwner, // registry owner is different from proxy owner
400
- ""
380
+ false, // isInterceptor
381
+ address(this),
382
+ registryOwner,
383
+ ""
401
384
  );
402
-
403
- $._info[registryNftId] = registryInfo;
404
- $._nftIdByAddress[address(this)] = registryNftId;
405
-
406
- // add logging
385
+ _nftIdByAddress[address(this)] = registryNftId;
386
+ _registryNftId = registryNftId;
407
387
  }
408
388
 
409
389
 
410
390
  /// @dev global registry registration for non mainnet registries
411
391
  function _registerGlobalRegistry()
412
- virtual
413
392
  internal
414
- onlyInitializing
415
393
  {
416
- StorageV1 storage $ = _getStorage();
394
+ uint256 globalRegistryId = _chainNftInternal.GLOBAL_REGISTRY_ID();
417
395
 
418
- uint256 globalRegistryId = $._chainNftInternal.GLOBAL_REGISTRY_ID();
419
- $._chainNftInternal.mint($._protocolOwner, globalRegistryId);
396
+ _chainNftInternal.mint(NFT_LOCK_ADDRESS, globalRegistryId);
420
397
 
421
398
  NftId globalRegistryNftId = toNftId(globalRegistryId);
422
- ObjectInfo memory globalRegistryInfo = ObjectInfo(
399
+
400
+ _info[globalRegistryNftId] = ObjectInfo(
423
401
  globalRegistryNftId,
424
- toNftId($._chainNftInternal.PROTOCOL_NFT_ID()),
402
+ toNftId(_chainNftInternal.PROTOCOL_NFT_ID()), // parent
425
403
  REGISTRY(),
426
- address(0), // contract address
427
- $._protocolOwner,
404
+ false, // isInterceptor
405
+ address(0), // objectAddress
406
+ NFT_LOCK_ADDRESS, // initialOwner
428
407
  "" // data
429
408
  );
409
+ }
410
+
411
+ function _registerRegistryService()
412
+ internal
413
+ {
414
+ uint256 serviceId = _chainNftInternal.calculateTokenId(3);
415
+ NftId serviceNftId = toNftId(serviceId);
416
+
417
+ _chainNftInternal.mint(NFT_LOCK_ADDRESS, serviceId);
418
+
419
+ _info[serviceNftId] = ObjectInfo(
420
+ serviceNftId,
421
+ _registryNftId,
422
+ SERVICE(),
423
+ false, // isInterceptor
424
+ msg.sender, // service deploys registry
425
+ NFT_LOCK_ADDRESS, // initialOwner,
426
+ ""
427
+ );
430
428
 
431
- $._info[globalRegistryNftId] = globalRegistryInfo;
429
+ _nftIdByAddress[msg.sender] = serviceNftId;
430
+
431
+ string memory serviceName = "RegistryService";
432
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
433
+ _service[serviceNameHash][VersionLib.toVersionPart(MAJOR_VERSION_MIN)] = msg.sender;
434
+ _string[serviceNftId] = serviceName;
435
+ _serviceNftId = serviceNftId;
432
436
  }
433
437
 
434
- function _registerObjectInfo(
435
- IRegisterable registerable,
436
- NftId nftId
437
- )
438
+ /// @dev obtain interceptor address for this nft if applicable, address(0) otherwise
439
+ function _getInterceptor(
440
+ bool isInterceptor,
441
+ address objectAddress,
442
+ bool parentIsInterceptor,
443
+ address parentObjectAddress
444
+ )
438
445
  internal
439
- virtual
446
+ view
447
+ returns (address interceptor)
440
448
  {
441
- address objectAddress = address(registerable);
442
- ObjectInfo memory info = ObjectInfo(
443
- nftId,
444
- registerable.getParentNftId(),
445
- registerable.getType(),
446
- objectAddress,
447
- registerable.getOwner(),
448
- registerable.getData()
449
- );
449
+ if (objectAddress == address(0)) {
450
+ if (parentIsInterceptor) {
451
+ return parentObjectAddress;
452
+ } else {
453
+ return address(0);
454
+ }
455
+ }
456
+
457
+ if (isInterceptor) {
458
+ return objectAddress;
459
+ }
460
+
461
+ return address(0);
462
+ }
463
+
464
+ /// @dev defines which object - parent types relations are allowed to register
465
+ // IMPORTANT:
466
+ // 1) EACH object type MUST have only one parent type across ALL mappings
467
+ // 2) DO NOT use object type (e.g. POLCY, BUNDLE, STAKE) as parent type
468
+ // 3) DO NOT use REGISTRY as object type
469
+ // 2) DO NOT use PROTOCOL and "zeroObjectType"
470
+ function _setupValidObjectParentCombinations()
471
+ internal
472
+ {
473
+ // registry as parent, ONLY registry owner
474
+ _isValidContractCombination[TOKEN()][REGISTRY()] = true;
475
+ _isValidContractCombination[SERVICE()][REGISTRY()] = true;
476
+
477
+ // registry as parent, ONLY approved
478
+ _isValidContractCombination[INSTANCE()][REGISTRY()] = true;
479
+
480
+ // instance as parent, ONLY approved
481
+ _isValidContractCombination[PRODUCT()][INSTANCE()] = true;
482
+ _isValidContractCombination[DISTRIBUTION()][INSTANCE()] = true;
483
+ _isValidContractCombination[ORACLE()][INSTANCE()] = true;
484
+ _isValidContractCombination[POOL()][INSTANCE()] = true;
450
485
 
451
- StorageV1 storage $ = _getStorage();
452
- $._info[nftId] = info;
453
- $._nftIdByAddress[objectAddress] = nftId;
486
+ // product as parent, ONLY approved
487
+ _isValidObjectCombination[POLICY()][PRODUCT()] = true;
454
488
 
455
- // add logging
489
+ // pool as parent, ONLY approved
490
+ _isValidObjectCombination[BUNDLE()][POOL()] = true;
491
+ _isValidObjectCombination[STAKE()][POOL()] = true;
456
492
  }
493
+ }
457
494
 
458
- }
495
+ // use to deploy with hardhat
496
+ contract RegistryCreationCode {
497
+ bytes constant public registryCreationCode = type(Registry).creationCode;
498
+ }