@etherisc/gif-next 0.0.2-e42b0ca-323 → 0.0.2-e4b632c-016

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