@etherisc/gif-next 0.0.2-de220d6-949 → 0.0.2-e1e92ab-754

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