@etherisc/gif-next 0.0.2-790d44b-698 → 0.0.2-79559e6-556

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