@etherisc/gif-next 0.0.2-e875d61-189 → 0.0.2-e9148e0-933

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