@etherisc/gif-next 0.0.2-790d44b-698 → 0.0.2-7a9d124-838

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 (382) hide show
  1. package/README.md +148 -26
  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 +0 -238
  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 +300 -96
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +355 -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/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +4 -0
  45. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.json +101 -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 +747 -1140
  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 +2322 -1223
  56. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +4 -0
  57. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +917 -0
  58. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +4 -0
  59. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +1407 -0
  60. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +4 -0
  61. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +931 -0
  62. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +4 -0
  63. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +508 -0
  64. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  65. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +198 -22
  66. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  67. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +1 -1
  68. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  69. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.json +27 -158
  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 +37 -245
  73. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  74. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
  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/{distribution/IDistribution.sol → IDistribution.sol}/IDistribution.json +1 -1
  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 +294 -62
  91. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  92. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +269 -37
  93. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
  94. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +444 -0
  95. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  96. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +121 -60
  97. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  98. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +118 -38
  99. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  100. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +205 -38
  101. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  102. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +137 -69
  103. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  104. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +358 -39
  105. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
  106. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +448 -0
  107. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  108. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +269 -97
  109. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
  110. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +472 -0
  111. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  112. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +186 -12
  113. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  114. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +358 -37
  115. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +4 -0
  116. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +947 -0
  117. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +4 -0
  118. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +34 -0
  119. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  120. package/artifacts/contracts/registry/Registry.sol/Registry.json +379 -294
  121. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +4 -0
  122. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +1293 -0
  123. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +4 -0
  124. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +513 -0
  125. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
  126. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +410 -0
  127. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +4 -0
  128. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.json +107 -0
  129. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  130. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  131. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +4 -0
  132. package/artifacts/contracts/{instance/module/component/ComponentModule.sol/ComponentModule.json → shared/INftOwnable.sol/INftOwnable.json} +67 -57
  133. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  134. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +117 -37
  135. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +4 -0
  136. package/artifacts/contracts/{instance/base → shared}/IService.sol/IService.json +119 -39
  137. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  138. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +4 -0
  139. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +158 -0
  140. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  141. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +349 -0
  142. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  143. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +190 -37
  144. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +4 -0
  145. package/artifacts/contracts/{instance/base/InstanceBase.sol/InstanceBase.json → shared/RegisterableUpgradable.sol/RegisterableUpgradable.json} +135 -133
  146. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +4 -0
  147. package/artifacts/contracts/{instance/base/ServiceBase.sol/ServiceBase.json → shared/Service.sol/Service.json} +144 -40
  148. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +4 -0
  149. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +96 -0
  150. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  151. package/artifacts/contracts/shared/{Proxy.sol/ProxyWithProxyAdminGetter.json → UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json} +4 -4
  152. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  153. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  154. package/artifacts/contracts/test/TestFee.sol/TestFee.json +4 -4
  155. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  156. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +204 -36
  157. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  158. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +14 -14
  159. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  160. package/artifacts/contracts/test/TestService.sol/TestService.json +205 -48
  161. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  162. package/artifacts/contracts/test/TestToken.sol/TestUsdc.json +91 -53
  163. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  164. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  165. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  166. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +18 -2
  167. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  168. package/artifacts/contracts/test/Usdc.sol/USDC.json +91 -53
  169. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  170. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  171. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  172. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +4 -0
  173. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.json +104 -0
  174. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  175. package/artifacts/contracts/types/Fee.sol/FeeLib.json +4 -4
  176. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  177. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +31 -17
  178. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  179. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +2 -2
  180. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  181. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +2 -2
  182. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +4 -0
  183. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.json +100 -0
  184. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  185. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
  186. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +4 -0
  187. package/artifacts/contracts/types/Referral.sol/ReferralLib.json +123 -0
  188. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  189. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +2 -2
  190. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  191. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +134 -8
  192. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  193. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  194. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  195. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +15 -2
  196. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +4 -0
  197. package/artifacts/contracts/types/UFixed.sol/MathLib.json +10 -0
  198. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +4 -0
  199. package/artifacts/contracts/types/UFixed.sol/{UFixedMathLib.json → UFixedLib.json} +3 -3
  200. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  201. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  202. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  203. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +22 -3
  204. package/contracts/components/BaseComponent.sol +26 -29
  205. package/contracts/components/Distribution.sol +45 -18
  206. package/contracts/components/IBaseComponent.sol +9 -3
  207. package/contracts/components/IDistributionComponent.sol +3 -6
  208. package/contracts/components/IPoolComponent.sol +2 -11
  209. package/contracts/components/IProductComponent.sol +4 -7
  210. package/contracts/components/Pool.sol +81 -74
  211. package/contracts/components/Product.sol +104 -47
  212. package/contracts/experiment/cloning/Cloner.sol +47 -0
  213. package/contracts/instance/AccessManagedSimple.sol +115 -0
  214. package/contracts/instance/AccessManagerSimple.sol +692 -0
  215. package/contracts/instance/IAccessManagerSimple.sol +391 -0
  216. package/contracts/instance/IInstance.sol +46 -45
  217. package/contracts/instance/IInstanceService.sol +30 -0
  218. package/contracts/instance/Instance.sol +426 -57
  219. package/contracts/instance/InstanceAccessManager.sol +288 -0
  220. package/contracts/instance/InstanceReader.sol +315 -0
  221. package/contracts/instance/InstanceService.sol +198 -0
  222. package/contracts/instance/InstanceServiceManager.sol +57 -0
  223. package/contracts/instance/base/ComponentServiceBase.sol +95 -10
  224. package/contracts/instance/base/IInstanceBase.sol +3 -2
  225. package/contracts/instance/base/IKeyValueStore.sol +13 -14
  226. package/contracts/instance/base/ILifecycle.sol +3 -3
  227. package/contracts/instance/base/KeyValueStore.sol +49 -38
  228. package/contracts/instance/base/Lifecycle.sol +1 -1
  229. package/contracts/instance/module/IAccess.sol +38 -0
  230. package/contracts/instance/module/IBundle.sol +20 -0
  231. package/contracts/instance/module/IDistribution.sol +39 -0
  232. package/contracts/instance/module/IPolicy.sol +45 -0
  233. package/contracts/instance/module/IRisk.sol +11 -0
  234. package/contracts/instance/module/ISetup.sol +44 -0
  235. package/contracts/instance/module/ITreasury.sol +23 -0
  236. package/contracts/instance/service/ComponentOwnerService.sol +232 -72
  237. package/contracts/instance/service/DistributionService.sol +49 -20
  238. package/contracts/instance/service/DistributionServiceManager.sol +54 -0
  239. package/contracts/instance/service/IComponentOwnerService.sol +1 -3
  240. package/contracts/instance/service/IDistributionService.sol +1 -1
  241. package/contracts/instance/service/IPoolService.sol +5 -1
  242. package/contracts/instance/service/IProductService.sol +6 -6
  243. package/contracts/instance/service/PoolService.sol +107 -58
  244. package/contracts/instance/service/PoolServiceManager.sol +54 -0
  245. package/contracts/instance/service/ProductService.sol +194 -139
  246. package/contracts/instance/service/ProductServiceManager.sol +54 -0
  247. package/contracts/registry/ChainNft.sol +80 -37
  248. package/contracts/registry/IRegistry.sol +47 -25
  249. package/contracts/registry/IRegistryService.sol +50 -0
  250. package/contracts/registry/ITransferInterceptor.sol +6 -0
  251. package/contracts/registry/Registry.sol +310 -324
  252. package/contracts/registry/RegistryService.sol +358 -0
  253. package/contracts/registry/RegistryServiceManager.sol +80 -0
  254. package/contracts/registry/TokenRegistry.sol +111 -0
  255. package/contracts/shared/ContractDeployerLib.sol +72 -0
  256. package/contracts/shared/ERC165.sol +6 -2
  257. package/contracts/shared/INftOwnable.sol +22 -0
  258. package/contracts/shared/IRegisterable.sol +8 -15
  259. package/contracts/{instance/base → shared}/IService.sol +3 -3
  260. package/contracts/shared/IVersionable.sol +15 -13
  261. package/contracts/shared/NftOwnable.sol +134 -0
  262. package/contracts/shared/ProxyManager.sol +94 -0
  263. package/contracts/shared/Registerable.sol +63 -59
  264. package/contracts/shared/RegisterableUpgradable.sol +16 -0
  265. package/contracts/shared/Service.sol +55 -0
  266. package/contracts/shared/TokenHandler.sol +27 -0
  267. package/contracts/shared/UpgradableProxyWithAdmin.sol +16 -0
  268. package/contracts/shared/Versionable.sol +49 -43
  269. package/contracts/test/TestFee.sol +2 -2
  270. package/contracts/test/TestRegisterable.sol +5 -6
  271. package/contracts/test/TestRoleId.sol +1 -1
  272. package/contracts/test/TestService.sol +5 -13
  273. package/contracts/types/DistributorType.sol +55 -0
  274. package/contracts/types/Fee.sol +3 -3
  275. package/contracts/types/Key32.sol +8 -3
  276. package/contracts/types/NumberId.sol +52 -0
  277. package/contracts/types/ObjectType.sol +35 -14
  278. package/contracts/types/Referral.sol +85 -0
  279. package/contracts/types/RoleId.sol +61 -9
  280. package/contracts/types/StateId.sol +5 -1
  281. package/contracts/types/Timestamp.sol +7 -3
  282. package/contracts/types/UFixed.sol +128 -12
  283. package/contracts/types/Version.sol +5 -1
  284. package/package.json +4 -3
  285. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +0 -4
  286. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.json +0 -24
  287. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +0 -4
  288. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +0 -4
  289. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +0 -4
  290. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +0 -4
  291. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +0 -4
  292. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.json +0 -333
  293. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +0 -4
  294. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.json +0 -10
  295. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +0 -4
  296. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.json +0 -333
  297. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +0 -4
  298. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.json +0 -297
  299. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +0 -4
  300. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +0 -4
  301. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.json +0 -297
  302. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +0 -4
  303. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +0 -4
  304. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.json +0 -10
  305. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +0 -4
  306. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.json +0 -117
  307. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +0 -4
  308. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.json +0 -10
  309. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +0 -4
  310. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +0 -4
  311. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.json +0 -10
  312. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +0 -4
  313. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +0 -4
  314. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.json +0 -284
  315. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +0 -4
  316. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.json +0 -284
  317. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +0 -4
  318. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.json +0 -10
  319. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +0 -4
  320. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.json +0 -144
  321. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +0 -4
  322. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.json +0 -144
  323. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +0 -4
  324. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +0 -4
  325. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.json +0 -113
  326. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +0 -4
  327. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +0 -131
  328. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +0 -4
  329. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +0 -4
  330. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.json +0 -511
  331. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +0 -4
  332. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +0 -76
  333. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +0 -4
  334. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.json +0 -511
  335. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +0 -4
  336. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +0 -452
  337. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +0 -4
  338. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.json +0 -24
  339. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +0 -4
  340. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.json +0 -24
  341. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.dbg.json +0 -4
  342. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.json +0 -248
  343. package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.dbg.json +0 -4
  344. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +0 -4
  345. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +0 -405
  346. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +0 -4
  347. package/artifacts/contracts/test/TestPool.sol/TestPool.json +0 -578
  348. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +0 -4
  349. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +0 -575
  350. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +0 -4
  351. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.json +0 -99
  352. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +0 -4
  353. package/contracts/experiment/statemachine/README.md +0 -112
  354. package/contracts/instance/IInstanceLinked.sol +0 -8
  355. package/contracts/instance/base/InstanceBase.sol +0 -91
  356. package/contracts/instance/base/ModuleBase.sol +0 -57
  357. package/contracts/instance/base/ServiceBase.sol +0 -37
  358. package/contracts/instance/module/access/Access.sol +0 -149
  359. package/contracts/instance/module/access/IAccess.sol +0 -53
  360. package/contracts/instance/module/bundle/BundleModule.sol +0 -134
  361. package/contracts/instance/module/bundle/IBundle.sol +0 -53
  362. package/contracts/instance/module/component/ComponentModule.sol +0 -70
  363. package/contracts/instance/module/component/IComponent.sol +0 -28
  364. package/contracts/instance/module/distribution/DistributionModule.sol +0 -17
  365. package/contracts/instance/module/distribution/IDistribution.sol +0 -10
  366. package/contracts/instance/module/policy/IPolicy.sol +0 -63
  367. package/contracts/instance/module/policy/PolicyModule.sol +0 -91
  368. package/contracts/instance/module/pool/IPoolModule.sol +0 -40
  369. package/contracts/instance/module/pool/PoolModule.sol +0 -90
  370. package/contracts/instance/module/risk/IRisk.sol +0 -26
  371. package/contracts/instance/module/risk/RiskModule.sol +0 -62
  372. package/contracts/instance/module/treasury/ITreasury.sol +0 -82
  373. package/contracts/instance/module/treasury/TokenHandler.sol +0 -48
  374. package/contracts/instance/module/treasury/TreasuryModule.sol +0 -138
  375. package/contracts/registry/IChainNft.sol +0 -21
  376. package/contracts/registry/IRegistryLinked.sol +0 -8
  377. package/contracts/shared/IOwnable.sol +0 -6
  378. package/contracts/shared/Proxy.sol +0 -94
  379. package/contracts/test/TestDistribution.sol +0 -21
  380. package/contracts/test/TestPool.sol +0 -25
  381. package/contracts/test/TestProduct.sol +0 -72
  382. package/contracts/types/ReferralId.sol +0 -48
@@ -2,457 +2,443 @@
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 getServiceName(NftId nftId) external view returns (string memory) {
236
+ return _string[nftId];
256
237
  }
257
238
 
258
- // from IRegistryLinked
259
- function getRegistry() external view override returns (IRegistry registry) {
260
- return this;
239
+ // special case to retrive a gif service
240
+ function getServiceAddress(
241
+ string memory serviceName,
242
+ VersionPart majorVersion
243
+ ) external view returns (address)
244
+ {
245
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
246
+ return _service[serviceNameHash][majorVersion];
261
247
  }
262
248
 
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();
249
+ function getChainNft() external view override returns (ChainNft) {
250
+ return _chainNft;
275
251
  }
276
252
 
277
- function getType() external pure override returns (ObjectType objectType) {
278
- return REGISTRY();
253
+ function getOwner() public view returns (address owner) {
254
+ return ownerOf(address(this));
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;
284
- }
257
+ // Internals
285
258
 
286
- function getNftId() public view override (IRegisterable, IRegistry) returns (NftId nftId) {
287
- return _getStorage()._nftId;
288
- }
259
+ function _registerService(ObjectInfo memory info)
260
+ internal
261
+ {
262
+ (
263
+ string memory serviceName,
264
+ VersionPart majorVersion
265
+ ) = abi.decode(info.data, (string, VersionPart));
266
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
289
267
 
290
- function getParentNftId() public view returns (NftId nftId) {
291
- StorageV1 storage $ = _getStorage();
292
- nftId = $._info[$._nftId].parentNftId;
293
- }
268
+ // ensures consistency of service.getVersion() and majorVersion here
269
+ if(majorVersion != _majorVersion) {
270
+ revert InvalidServiceVersion(majorVersion);
271
+ }
272
+
273
+ if(_service[serviceNameHash][majorVersion] != address(0)) {
274
+ revert ServiceNameAlreadyRegistered(serviceName, majorVersion);
275
+ }
294
276
 
295
- function getData() public pure returns (bytes memory data) {
296
- return "";
297
- }
277
+ _string[info.nftId] = serviceName;
278
+ _service[serviceNameHash][majorVersion] = info.objectAddress;
298
279
 
299
- // registry specific functions
300
- function getProtocolOwner() external view override returns (address) {
301
- return _getStorage()._protocolOwner;
280
+ emit LogServiceNameRegistration(serviceName, majorVersion);
302
281
  }
303
282
 
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;
318
- }
283
+ /// @dev obtain interceptor address for this nft if applicable, address(0) otherwise
284
+ function _getInterceptor(
285
+ bool isInterceptor,
286
+ address objectAddress,
287
+ bool parentIsInterceptor,
288
+ address parentObjectAddress
289
+ )
290
+ internal
291
+ view
292
+ returns (address interceptor)
293
+ {
294
+ if (objectAddress == address(0)) {
295
+ if (parentIsInterceptor) {
296
+ return parentObjectAddress;
297
+ } else {
298
+ return address(0);
299
+ }
300
+ }
319
301
 
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;
302
+ if (isInterceptor) {
303
+ return objectAddress;
304
+ }
305
+
306
+ return address(0);
340
307
  }
341
308
 
309
+ // Internals called only in constructor
310
+
342
311
  /// @dev protocol registration used to anchor the dip ecosystem relations
343
312
  function _registerProtocol()
344
- virtual
345
313
  internal
346
- onlyInitializing
347
314
  {
348
- StorageV1 storage $ = _getStorage();
315
+ uint256 protocolId = _chainNft.PROTOCOL_NFT_ID();
316
+ NftId protocolNftId = toNftId(protocolId);
349
317
 
350
- uint256 protocolId = $._chainNftInternal.PROTOCOL_NFT_ID();
351
- $._chainNftInternal.mint($._protocolOwner, protocolId);
318
+ _chainNft.mint(NFT_LOCK_ADDRESS, protocolId);
352
319
 
353
- NftId protocolNftid = toNftId(protocolId);
354
- ObjectInfo memory protocolInfo = ObjectInfo(
355
- protocolNftid,
356
- zeroNftId(), // parent nft id
320
+ _info[protocolNftId] = ObjectInfo(
321
+ protocolNftId,
322
+ zeroNftId(), // parent
357
323
  PROTOCOL(),
358
- address(0), // contract address
359
- $._protocolOwner,
360
- "" // data
324
+ false, // isInterceptor
325
+ address(0), // objectAddress
326
+ NFT_LOCK_ADDRESS,// initialOwner
327
+ ""
361
328
  );
362
-
363
- $._info[protocolNftid] = protocolInfo;
364
329
  }
365
330
 
366
331
  /// @dev registry registration
367
332
  /// might also register the global registry when not on mainnet
368
- function _registerRegistry()
369
- virtual
333
+ function _registerRegistry(address registryOwner)
370
334
  internal
371
- onlyInitializing
372
- returns (NftId registryNftId)
373
335
  {
374
- StorageV1 storage $ = _getStorage();
336
+ uint256 registryId = _chainNft.calculateTokenId(REGISTRY_TOKEN_SEQUENCE_ID);
337
+ NftId registryNftId = toNftId(registryId);
375
338
 
376
- uint256 registryId = $._chainNftInternal.calculateTokenId(2);
377
- registryNftId = toNftId(registryId);
339
+ NftId parentNftId;
378
340
 
379
- // we're not the global registry
380
- if(registryId != $._chainNftInternal.GLOBAL_REGISTRY_ID()) {
341
+ if(registryId != _chainNft.GLOBAL_REGISTRY_ID())
342
+ {// we're not the global registry
381
343
  _registerGlobalRegistry();
344
+ parentNftId = toNftId(_chainNft.GLOBAL_REGISTRY_ID());
345
+ }
346
+ else
347
+ {// we are global registry
348
+ parentNftId = toNftId(_chainNft.PROTOCOL_NFT_ID());
382
349
  }
383
350
 
384
- $._chainNftInternal.mint($._protocolOwner, registryId);
351
+ _chainNft.mint(registryOwner, registryId);
385
352
 
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(
353
+ _info[registryNftId] = ObjectInfo(
395
354
  registryNftId,
396
355
  parentNftId,
397
356
  REGISTRY(),
398
- address(this), // proxy address
399
- $._protocolOwner, // registry owner is different from proxy owner
400
- ""
357
+ false, // isInterceptor
358
+ address(this),
359
+ registryOwner,
360
+ ""
401
361
  );
402
-
403
- $._info[registryNftId] = registryInfo;
404
- $._nftIdByAddress[address(this)] = registryNftId;
405
-
406
- // add logging
362
+ _nftIdByAddress[address(this)] = registryNftId;
363
+ _registryNftId = registryNftId;
407
364
  }
408
365
 
409
366
 
410
367
  /// @dev global registry registration for non mainnet registries
411
368
  function _registerGlobalRegistry()
412
- virtual
413
369
  internal
414
- onlyInitializing
415
370
  {
416
- StorageV1 storage $ = _getStorage();
371
+ uint256 globalRegistryId = _chainNft.GLOBAL_REGISTRY_ID();
417
372
 
418
- uint256 globalRegistryId = $._chainNftInternal.GLOBAL_REGISTRY_ID();
419
- $._chainNftInternal.mint($._protocolOwner, globalRegistryId);
373
+ _chainNft.mint(NFT_LOCK_ADDRESS, globalRegistryId);
420
374
 
421
375
  NftId globalRegistryNftId = toNftId(globalRegistryId);
422
- ObjectInfo memory globalRegistryInfo = ObjectInfo(
376
+
377
+ _info[globalRegistryNftId] = ObjectInfo(
423
378
  globalRegistryNftId,
424
- toNftId($._chainNftInternal.PROTOCOL_NFT_ID()),
379
+ toNftId(_chainNft.PROTOCOL_NFT_ID()), // parent
425
380
  REGISTRY(),
426
- address(0), // contract address
427
- $._protocolOwner,
381
+ false, // isInterceptor
382
+ address(0), // objectAddress
383
+ NFT_LOCK_ADDRESS, // initialOwner
428
384
  "" // data
429
385
  );
430
-
431
- $._info[globalRegistryNftId] = globalRegistryInfo;
432
386
  }
433
387
 
434
- function _registerObjectInfo(
435
- IRegisterable registerable,
436
- NftId nftId
437
- )
438
- internal
439
- virtual
388
+ function _registerRegistryService(address registryOwner)
389
+ internal
440
390
  {
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()
391
+ uint256 serviceId = _chainNft.calculateTokenId(REGISTRY_SERVICE_TOKEN_SEQUENCE_ID);
392
+ NftId serviceNftId = toNftId(serviceId);
393
+
394
+ _chainNft.mint(registryOwner, serviceId);
395
+
396
+ _info[serviceNftId] = ObjectInfo(
397
+ serviceNftId,
398
+ _registryNftId,
399
+ SERVICE(),
400
+ false, // isInterceptor
401
+ msg.sender, // service deploys registry
402
+ registryOwner, // initialOwner,
403
+ ""
449
404
  );
450
405
 
451
- StorageV1 storage $ = _getStorage();
452
- $._info[nftId] = info;
453
- $._nftIdByAddress[objectAddress] = nftId;
406
+ _nftIdByAddress[msg.sender] = serviceNftId;
454
407
 
455
- // add logging
408
+ string memory serviceName = "RegistryService";
409
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
410
+ _service[serviceNameHash][VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT)] = msg.sender;
411
+ _string[serviceNftId] = serviceName;
412
+ _serviceNftId = serviceNftId;
456
413
  }
457
414
 
458
- }
415
+ /// @dev defines which object - parent types relations are allowed to register
416
+ // IMPORTANT:
417
+ // 1) EACH object type MUST have only one parent type across ALL mappings
418
+ // 2) DO NOT use object type (e.g. POLCY, BUNDLE, STAKE) as parent type
419
+ // 3) DO NOT use REGISTRY as object type
420
+ // 2) DO NOT use PROTOCOL and "zeroObjectType"
421
+ function _setupValidObjectParentCombinations()
422
+ internal
423
+ {
424
+ // registry as parent, ONLY registry owner
425
+ _isValidContractCombination[TOKEN()][REGISTRY()] = true;
426
+ _isValidContractCombination[SERVICE()][REGISTRY()] = true;
427
+
428
+ // registry as parent, ONLY approved
429
+ _isValidContractCombination[INSTANCE()][REGISTRY()] = true;
430
+
431
+ // instance as parent, ONLY approved
432
+ _isValidContractCombination[PRODUCT()][INSTANCE()] = true;
433
+ _isValidContractCombination[DISTRIBUTION()][INSTANCE()] = true;
434
+ _isValidContractCombination[ORACLE()][INSTANCE()] = true;
435
+ _isValidContractCombination[POOL()][INSTANCE()] = true;
436
+
437
+ // product as parent, ONLY approved
438
+ _isValidObjectCombination[POLICY()][PRODUCT()] = true;
439
+
440
+ // pool as parent, ONLY approved
441
+ _isValidObjectCombination[BUNDLE()][POOL()] = true;
442
+ _isValidObjectCombination[STAKE()][POOL()] = true;
443
+ }
444
+ }