@etherisc/gif-next 0.0.2-8a352ce → 0.0.2-8d47fa1-080

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 (387) hide show
  1. package/README.md +193 -6
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +4 -0
  3. package/artifacts/contracts/components/{IProduct.sol/IProductComponent.json → BaseComponent.sol/BaseComponent.json} +88 -67
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +4 -0
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +445 -0
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +4 -0
  7. package/artifacts/contracts/components/{IPool.sol/IPoolComponent.json → IBaseComponent.sol/IBaseComponent.json} +69 -71
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +343 -0
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +4 -0
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +474 -0
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +4 -0
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +373 -0
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +445 -56
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +324 -53
  18. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +2 -2
  20. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +2 -2
  22. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +2 -2
  24. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +2 -2
  26. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +4 -0
  33. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +59 -0
  34. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +4 -0
  35. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.json +124 -0
  36. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +4 -0
  37. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.json +74 -0
  38. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +4 -0
  39. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +124 -0
  40. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +4 -0
  41. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +207 -0
  42. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  43. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +2 -2
  44. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  45. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +2 -2
  46. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  47. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1575 -295
  48. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +4 -0
  49. package/artifacts/contracts/instance/{component/IComponent.sol → IInstanceLinked.sol}/IInstanceLinked.json +1 -1
  50. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  51. package/artifacts/contracts/instance/Instance.sol/Instance.json +1888 -376
  52. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +4 -0
  53. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +393 -0
  54. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
  55. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +113 -0
  56. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +4 -0
  57. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.json +560 -0
  58. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +4 -0
  59. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.json +115 -0
  60. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +4 -0
  61. package/artifacts/contracts/instance/{component/ComponentModule.sol/ComponentModule.json → base/IService.sol/IService.json} +171 -154
  62. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +4 -0
  63. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.json +456 -0
  64. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +4 -0
  65. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +710 -0
  66. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +4 -0
  67. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +169 -0
  68. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +4 -0
  69. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.json +10 -0
  70. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +4 -0
  71. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.json +380 -0
  72. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +4 -0
  73. package/artifacts/contracts/instance/{access → module/access}/Access.sol/AccessModule.json +85 -152
  74. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +4 -0
  75. package/artifacts/contracts/instance/{access → module/access}/IAccess.sol/IAccess.json +1 -1
  76. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +4 -0
  77. package/artifacts/contracts/instance/{access → module/access}/IAccess.sol/IAccessModule.json +96 -99
  78. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +4 -0
  79. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.json +297 -0
  80. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +4 -0
  81. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.json +10 -0
  82. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +4 -0
  83. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.json +297 -0
  84. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
  85. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.json +117 -0
  86. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +4 -0
  87. package/artifacts/contracts/instance/{component → module/component}/IComponent.sol/IComponent.json +1 -1
  88. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +4 -0
  89. package/artifacts/contracts/instance/{product/IProductService.sol/IProductService.json → module/component/IComponent.sol/IComponentModule.json} +56 -53
  90. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +4 -0
  91. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.json +10 -0
  92. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +4 -0
  93. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.json +10 -0
  94. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +4 -0
  95. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.json +10 -0
  96. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  97. package/artifacts/contracts/instance/{policy → module/policy}/IPolicy.sol/IPolicy.json +1 -1
  98. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  99. package/artifacts/contracts/instance/{policy → module/policy}/IPolicy.sol/IPolicyModule.json +159 -106
  100. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  101. package/artifacts/contracts/instance/{policy → module/policy}/PolicyModule.sol/PolicyModule.json +159 -106
  102. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  103. package/artifacts/contracts/instance/{pool → module/pool}/IPoolModule.sol/IPool.json +1 -1
  104. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  105. package/artifacts/contracts/instance/{pool → module/pool}/IPoolModule.sol/IPoolModule.json +74 -59
  106. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  107. package/artifacts/contracts/instance/{pool → module/pool}/PoolModule.sol/PoolModule.json +64 -62
  108. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +4 -0
  109. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.json +10 -0
  110. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +4 -0
  111. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.json +113 -0
  112. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +4 -0
  113. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +131 -0
  114. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +4 -0
  115. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.json +10 -0
  116. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +4 -0
  117. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.json +638 -0
  118. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +4 -0
  119. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +76 -0
  120. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +4 -0
  121. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.json +638 -0
  122. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +4 -0
  123. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +690 -0
  124. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  125. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +526 -0
  126. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +4 -0
  127. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +389 -0
  128. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +4 -0
  129. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +369 -0
  130. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +4 -0
  131. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +484 -0
  132. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +4 -0
  133. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +674 -0
  134. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  135. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +649 -0
  136. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  137. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +964 -0
  138. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  139. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +194 -2
  140. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  141. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +5 -0
  142. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  143. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +364 -72
  144. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +4 -0
  145. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.json +24 -0
  146. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +4 -0
  147. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +668 -0
  148. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +4 -0
  149. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +34 -0
  150. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  151. package/artifacts/contracts/registry/Registry.sol/Registry.json +570 -82
  152. package/artifacts/contracts/registry/RegistryInstaller.sol/RegistryInstaller.dbg.json +4 -0
  153. package/artifacts/contracts/registry/RegistryInstaller.sol/RegistryInstaller.json +344 -0
  154. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +4 -0
  155. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +861 -0
  156. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +4 -0
  157. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +35 -0
  158. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +4 -0
  159. package/artifacts/contracts/{registry/IRegistry.sol → shared/IOwnable.sol}/IOwnable.json +1 -1
  160. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +4 -0
  161. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +124 -0
  162. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +4 -0
  163. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +205 -0
  164. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  165. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +310 -0
  166. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +4 -0
  167. package/artifacts/contracts/{registry/Registry.sol → shared/Registerable.sol}/Registerable.json +71 -77
  168. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  169. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +129 -0
  170. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +4 -0
  171. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +228 -0
  172. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +4 -0
  173. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +445 -0
  174. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +4 -0
  175. package/artifacts/contracts/test/TestFee.sol/TestFee.json +119 -0
  176. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +4 -0
  177. package/artifacts/contracts/test/TestPool.sol/TestPool.json +602 -0
  178. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +4 -0
  179. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +632 -0
  180. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +4 -0
  181. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +191 -0
  182. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +4 -0
  183. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +116 -0
  184. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +4 -0
  185. package/artifacts/contracts/test/TestService.sol/TestService.json +472 -0
  186. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +4 -0
  187. package/artifacts/contracts/test/TestToken.sol/TestUsdc.json +338 -0
  188. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +4 -0
  189. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +218 -0
  190. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +4 -0
  191. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +270 -0
  192. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +4 -0
  193. package/artifacts/contracts/test/Usdc.sol/USDC.json +338 -0
  194. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +4 -0
  195. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.json +10 -0
  196. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +4 -0
  197. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +174 -0
  198. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  199. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +2 -2
  200. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +4 -0
  201. package/artifacts/contracts/types/Fee.sol/FeeLib.json +257 -0
  202. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +4 -0
  203. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +111 -0
  204. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  205. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +65 -4
  206. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +4 -0
  207. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +10 -0
  208. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +4 -0
  209. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +92 -0
  210. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +4 -0
  211. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.json +99 -0
  212. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +4 -0
  213. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +86 -0
  214. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +4 -0
  215. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +30 -0
  216. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +4 -0
  217. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +92 -0
  218. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +4 -0
  219. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +236 -0
  220. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +4 -0
  221. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +479 -0
  222. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +4 -0
  223. package/artifacts/contracts/types/Version.sol/VersionLib.json +177 -0
  224. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +4 -0
  225. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +30 -0
  226. package/contracts/components/BaseComponent.sol +79 -0
  227. package/contracts/components/Distribution.sol +155 -0
  228. package/contracts/components/IBaseComponent.sol +19 -0
  229. package/contracts/components/IDistributionComponent.sol +47 -0
  230. package/contracts/components/IPoolComponent.sol +65 -0
  231. package/contracts/components/IProductComponent.sol +39 -0
  232. package/contracts/components/Pool.sol +235 -18
  233. package/contracts/components/Product.sol +268 -35
  234. package/contracts/experiment/errors/Require.sol +10 -5
  235. package/contracts/experiment/errors/Revert.sol +13 -8
  236. package/contracts/experiment/inheritance/A.sol +8 -11
  237. package/contracts/experiment/inheritance/B.sol +10 -5
  238. package/contracts/experiment/inheritance/C.sol +11 -5
  239. package/contracts/experiment/inheritance/IA.sol +2 -7
  240. package/contracts/experiment/inheritance/IB.sol +3 -2
  241. package/contracts/experiment/inheritance/IC.sol +4 -3
  242. package/contracts/experiment/statemachine/Dummy.sol +27 -0
  243. package/contracts/experiment/statemachine/ISM.sol +25 -0
  244. package/contracts/experiment/statemachine/SM.sol +57 -0
  245. package/contracts/experiment/statemachine/SimpleStateMachine.sol +31 -0
  246. package/contracts/experiment/types/TypeA.sol +14 -9
  247. package/contracts/experiment/types/TypeB.sol +14 -9
  248. package/contracts/instance/IInstance.sol +42 -8
  249. package/contracts/instance/IInstanceLinked.sol +8 -0
  250. package/contracts/instance/Instance.sol +62 -41
  251. package/contracts/instance/base/ComponentServiceBase.sol +49 -0
  252. package/contracts/instance/base/IInstanceBase.sol +23 -0
  253. package/contracts/instance/base/IKeyValueStore.sol +50 -0
  254. package/contracts/instance/base/ILifecycle.sol +30 -0
  255. package/contracts/instance/base/IService.sol +15 -0
  256. package/contracts/instance/base/InstanceBase.sol +89 -0
  257. package/contracts/instance/base/KeyValueStore.sol +161 -0
  258. package/contracts/instance/base/Lifecycle.sol +100 -0
  259. package/contracts/instance/base/ModuleBase.sol +57 -0
  260. package/contracts/instance/base/ServiceBase.sol +43 -0
  261. package/contracts/instance/module/access/Access.sol +149 -0
  262. package/contracts/instance/module/access/IAccess.sol +53 -0
  263. package/contracts/instance/module/bundle/BundleModule.sol +134 -0
  264. package/contracts/instance/module/bundle/IBundle.sol +53 -0
  265. package/contracts/instance/module/component/ComponentModule.sol +71 -0
  266. package/contracts/instance/module/component/IComponent.sol +28 -0
  267. package/contracts/instance/module/distribution/DistributionModule.sol +17 -0
  268. package/contracts/instance/module/distribution/IDistribution.sol +10 -0
  269. package/contracts/instance/module/policy/IPolicy.sol +63 -0
  270. package/contracts/instance/module/policy/PolicyModule.sol +91 -0
  271. package/contracts/instance/module/pool/IPoolModule.sol +41 -0
  272. package/contracts/instance/module/pool/PoolModule.sol +95 -0
  273. package/contracts/instance/module/risk/IRisk.sol +26 -0
  274. package/contracts/instance/module/risk/RiskModule.sol +62 -0
  275. package/contracts/instance/module/treasury/ITreasury.sol +84 -0
  276. package/contracts/instance/module/treasury/TokenHandler.sol +48 -0
  277. package/contracts/instance/module/treasury/TreasuryModule.sol +131 -0
  278. package/contracts/instance/service/ComponentOwnerService.sol +272 -0
  279. package/contracts/instance/service/DistributionService.sol +54 -0
  280. package/contracts/instance/service/IComponentOwnerService.sol +20 -0
  281. package/contracts/instance/service/IDistributionService.sol +12 -0
  282. package/contracts/instance/service/IPoolService.sol +37 -0
  283. package/contracts/instance/service/IProductService.sol +107 -0
  284. package/contracts/instance/service/PoolService.sol +149 -0
  285. package/contracts/instance/service/ProductService.sol +509 -0
  286. package/contracts/registry/ChainNft.sol +111 -97
  287. package/contracts/registry/IChainNft.sol +13 -9
  288. package/contracts/registry/IRegistry.sol +61 -56
  289. package/contracts/registry/IRegistryLinked.sol +8 -0
  290. package/contracts/registry/IRegistryService.sol +29 -0
  291. package/contracts/registry/ITransferInterceptor.sol +6 -0
  292. package/contracts/registry/Registry.sol +443 -120
  293. package/contracts/registry/RegistryInstaller.sol +100 -0
  294. package/contracts/registry/RegistryService.sol +383 -0
  295. package/contracts/shared/ERC165.sol +21 -0
  296. package/contracts/shared/IOwnable.sol +6 -0
  297. package/contracts/shared/IRegisterable.sol +22 -0
  298. package/contracts/shared/IVersionable.sol +96 -0
  299. package/contracts/shared/ProxyManager.sol +115 -0
  300. package/contracts/shared/Registerable.sol +117 -0
  301. package/contracts/shared/UpgradableProxyWithAdmin.sol +16 -0
  302. package/contracts/shared/Versionable.sol +147 -0
  303. package/contracts/test/TestDistribution.sol +22 -0
  304. package/contracts/test/TestFee.sol +25 -0
  305. package/contracts/test/TestPool.sol +27 -0
  306. package/contracts/test/TestProduct.sol +74 -0
  307. package/contracts/test/TestRegisterable.sol +18 -0
  308. package/contracts/test/TestRoleId.sol +14 -0
  309. package/contracts/test/TestService.sol +26 -0
  310. package/contracts/test/TestToken.sol +26 -0
  311. package/contracts/test/TestVersion.sol +44 -0
  312. package/contracts/test/TestVersionable.sol +17 -0
  313. package/contracts/test/Usdc.sol +26 -0
  314. package/contracts/types/AddressSet.sol +58 -0
  315. package/contracts/types/Blocknumber.sol +118 -0
  316. package/contracts/types/ChainId.sol +18 -10
  317. package/contracts/types/Fee.sol +56 -0
  318. package/contracts/types/Key32.sol +45 -0
  319. package/contracts/types/NftId.sol +48 -11
  320. package/contracts/types/NftIdSet.sol +60 -0
  321. package/contracts/types/ObjectType.sol +131 -0
  322. package/contracts/types/ReferralId.sol +48 -0
  323. package/contracts/types/RiskId.sol +43 -0
  324. package/contracts/types/RoleId.sol +38 -0
  325. package/contracts/types/StateId.sol +101 -0
  326. package/contracts/types/Timestamp.sol +123 -0
  327. package/contracts/types/UFixed.sol +209 -0
  328. package/contracts/types/Version.sol +104 -0
  329. package/package.json +19 -5
  330. package/artifacts/contracts/components/Component.sol/Component.dbg.json +0 -4
  331. package/artifacts/contracts/components/Component.sol/Component.json +0 -179
  332. package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +0 -4
  333. package/artifacts/contracts/components/Component.sol/InstanceLinked.json +0 -35
  334. package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +0 -4
  335. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +0 -4
  336. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +0 -4
  337. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +0 -4
  338. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +0 -4
  339. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +0 -35
  340. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +0 -4
  341. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +0 -50
  342. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +0 -4
  343. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +0 -4
  344. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +0 -4
  345. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +0 -147
  346. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +0 -4
  347. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +0 -4
  348. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +0 -179
  349. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +0 -4
  350. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +0 -245
  351. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +0 -4
  352. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +0 -94
  353. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +0 -4
  354. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +0 -4
  355. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +0 -4
  356. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +0 -4
  357. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +0 -4
  358. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +0 -4
  359. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +0 -4
  360. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +0 -4
  361. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +0 -75
  362. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +0 -4
  363. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +0 -4
  364. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +0 -75
  365. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +0 -4
  366. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +0 -167
  367. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +0 -4
  368. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +0 -4
  369. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +0 -166
  370. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +0 -4
  371. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +0 -49
  372. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +0 -4
  373. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +0 -4
  374. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +0 -60
  375. package/contracts/components/Component.sol +0 -62
  376. package/contracts/components/IPool.sol +0 -9
  377. package/contracts/components/IProduct.sol +0 -12
  378. package/contracts/instance/access/Access.sol +0 -218
  379. package/contracts/instance/access/IAccess.sol +0 -83
  380. package/contracts/instance/component/ComponentModule.sol +0 -248
  381. package/contracts/instance/component/IComponent.sol +0 -95
  382. package/contracts/instance/policy/IPolicy.sol +0 -66
  383. package/contracts/instance/policy/PolicyModule.sol +0 -107
  384. package/contracts/instance/pool/IPoolModule.sol +0 -41
  385. package/contracts/instance/pool/PoolModule.sol +0 -86
  386. package/contracts/instance/product/IProductService.sol +0 -46
  387. package/contracts/instance/product/ProductService.sol +0 -108
@@ -1,182 +1,505 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
- import {IChainNft} from "./IChainNft.sol";
5
- import {IRegistry, IRegistryLinked, IRegisterable} from "./IRegistry.sol";
6
- import {NftId, toNftId} from "../types/NftId.sol";
7
- import {NftIdLib} from "../types/NftId.sol";
8
-
9
- contract RegistryLinked is IRegistryLinked {
4
+ import {IRegisterable} from "../shared/IRegisterable.sol";
5
+ import {IService} from "../instance/base/IService.sol";
10
6
 
11
- IRegistry internal _registry;
7
+ import {IChainNft} from "./IChainNft.sol";
8
+ import {ChainNft} from "./ChainNft.sol";
9
+ import {IRegistry} from "./IRegistry.sol";
10
+ import {NftId, toNftId, zeroNftId, NftIdLib} from "../types/NftId.sol";
11
+ import {Version, VersionPart, VersionLib} from "../types/Version.sol";
12
+ import {ObjectType, PROTOCOL, REGISTRY, TOKEN, SERVICE, INSTANCE, STAKE, PRODUCT, DISTRIBUTION, ORACLE, POOL, POLICY, BUNDLE} from "../types/ObjectType.sol";
13
+ import {ITransferInterceptor} from "./ITransferInterceptor.sol";
14
+
15
+ import {IOwnable} from "../shared/IOwnable.sol";
16
+ import {ERC165} from "../shared/ERC165.sol";
17
+
18
+
19
+ // IMPORTANT
20
+ // Each NFT minted by registry is accosiated with:
21
+ // 1) NFT owner
22
+ // 2) registred contract OR object stored in registered (parent) contract
23
+ // Four registration flows:
24
+ // 1) non IRegisterable address by registryOwner (TOKEN)
25
+ // 2) IRegisterable address by registryOwner (SERVICE)
26
+ // 3) IRegisterable address by approved service (INSTANCE, COMPONENT)
27
+ // 4) state object by approved service (POLICY, BUNDLE, STAKE)
28
+
29
+ contract Registry is
30
+ ERC165,
31
+ IRegistry
32
+ {
33
+ // register
34
+ error NotRegistryService();
35
+ error ZeroParentAddress();
36
+ error ContractAlreadyRegistered(address objectAddress);
37
+ error InvalidServiceVersion(VersionPart majorVersion);
38
+ error ServiceNameAlreadyRegistered(string name, VersionPart majorVersion);
39
+
40
+ // approve
41
+ error NotOwner();
42
+ error NotRegisteredContract(NftId registrarNftId);
43
+ error NotService(NftId registrarNftId);
44
+ error InvalidTypesCombination(ObjectType objectType, ObjectType parentType);
45
+
46
+ uint256 public constant MAJOR_VERSION_MIN = 3;
12
47
 
13
- constructor(address registry) {
14
- _registry = IRegistry(registry);
15
- }
48
+ string public constant EMPTY_URI = "";
16
49
 
17
- function getRegistry() external view override returns(IRegistry registry) {
18
- return _registry;
19
- }
50
+ address constant public NFT_LOCK_ADDRESS = address(0x1);
20
51
 
21
- }
52
+ mapping(NftId nftId => ObjectInfo info) _info;
53
+ mapping(address object => NftId nftId) _nftIdByAddress;
22
54
 
55
+ mapping(NftId registrator => mapping(
56
+ ObjectType objectType => bool)) _isApproved;
23
57
 
24
- abstract contract Registerable is
25
- RegistryLinked,
26
- IRegisterable
27
- {
28
- using NftIdLib for NftId;
58
+ mapping(ObjectType objectType => mapping(
59
+ ObjectType parentType => bool)) _isValidContractCombination;
29
60
 
30
- address private _initialOwner;
31
-
32
- constructor(address registry)
33
- RegistryLinked(registry)
34
- {
35
- _initialOwner = msg.sender;
36
- }
61
+ mapping(ObjectType objectType => mapping(
62
+ ObjectType parentType => bool)) _isValidObjectCombination;
37
63
 
38
- // getType, getData and register need to be implemented by concrete contract
64
+ mapping(NftId nftId => string name) _string;
65
+ mapping(bytes32 serviceNameHash => mapping(
66
+ VersionPart majorVersion => address service)) _service;
39
67
 
40
- function isRegisterable() external pure override returns(bool) {
41
- return true;
42
- }
68
+ NftId _registryNftId;
69
+ NftId _serviceNftId; // set in stone upon registry creation
70
+ IChainNft _chainNft;
71
+ ChainNft _chainNftInternal;
43
72
 
44
- function getInitialOwner() public view override returns(address deployer) {
45
- return _initialOwner;
46
- }
73
+ /// @dev will own protocol, global registry, registry and registry service nfts minted during creation
74
+ // TODO registry nft can be transfered while protocol, global registry and registry service nfts are not transferable
75
+ // TODO get owner from one place -> nft contract
76
+ address _protocolOwner;
47
77
 
48
- function isRegistered() public view override returns(bool) {
49
- NftId nftId = _registry.getNftId(address(this));
50
- return nftId.gtz();
51
- }
78
+ /*
79
+ modifier onlyInitialOwner() {
80
+ if(
81
+ msg.sender != getOwner() ||
82
+ msg.sender != _info[_registryNftId].initialOwner) {
83
+ revert NotInitialOwner();
84
+ }
85
+ }*/
52
86
 
53
- function getNftId() public view override returns(NftId nftId) {
54
- return _registry.getNftId(address(this));
87
+ modifier onlyOwner() {
88
+ if(msg.sender != getOwner()) {
89
+ revert NotOwner();
90
+ }
91
+ _;
55
92
  }
56
93
 
57
- function getOwner() public view override returns(address owner) {
58
- NftId id = _registry.getNftId(address(this));
59
- owner = _registry.getOwner(id);
60
- return owner != address(0) ? owner : _initialOwner;
94
+ modifier onlyRegistryService() {
95
+
96
+ if(msg.sender != _info[_serviceNftId].objectAddress) {
97
+ revert NotRegistryService();
98
+ }
99
+ _;
61
100
  }
62
101
 
63
- }
102
+ constructor(address protocolOwner, VersionPart majorVersion)
103
+ {
104
+ require(protocolOwner > address(0), "Registry: protocol owner is 0");
105
+ require(majorVersion.toInt() == MAJOR_VERSION_MIN, "Registry: initial major version of registry service is not MAJOR_VERSION_MIN");
64
106
 
65
- contract Registry is IRegistry {
66
- using NftIdLib for NftId;
67
- string public constant EMPTY_URI = "";
107
+ // TODO registry owner can change, while protocol is not?
108
+ _protocolOwner = protocolOwner;
68
109
 
69
- mapping(NftId nftId => RegistryInfo info) private _info;
70
- mapping(NftId nftId => address owner) private _owner;
71
- mapping(address object => NftId nftId) private _nftIdByAddress;
110
+ // deploy NFT
111
+ _chainNftInternal = new ChainNft(address(this));// adds 10kb to deployment size
112
+ _chainNft = IChainNft(_chainNftInternal);
72
113
 
73
- IChainNft private _chainNft;
114
+ // initial registry setup
115
+ _registerProtocol();
74
116
 
75
- function initialize(address chainNft) external {
76
- require(address(_chainNft) == address(0), "ERROR:REG-001:ALREADY_INITIALIZED");
77
- _chainNft = IChainNft(chainNft);
78
- }
117
+ _registerRegistry();
79
118
 
80
- function TOKEN() public pure override returns(uint256) { return 30; }
81
- function INSTANCE() public pure override returns(uint256) { return 40; }
82
- function PRODUCT() public pure override returns(uint256) { return 50; }
83
- function ORACLE() public pure override returns(uint256) { return 60; }
84
- function POOL() public pure override returns(uint256) { return 70; }
85
- function POLICY() public pure override returns(uint256) { return 80; }
86
- function BUNDLE() public pure override returns(uint256) { return 90; }
119
+ _registerRegistryService();
87
120
 
88
- function register(address objectAddress) external override returns(NftId nftId) {
89
- require(_nftIdByAddress[objectAddress].eqz(), "ERROR:REG-002:ALREADY_REGISTERED");
121
+ // set object parent relations
122
+ _setupValidObjectParentCombinations();
90
123
 
91
- IRegisterable registerable = IRegisterable(objectAddress);
92
- require(registerable.isRegisterable(), "ERROR:REG-003:NOT_REGISTERABLE");
124
+ _registerInterface(type(IRegistry).interfaceId);
125
+ _registerInterface(type(IOwnable).interfaceId);
126
+ }
93
127
 
94
- // check parent exists (for objects not instances)
95
- if(registerable.getType() != INSTANCE()) {
96
- RegistryInfo memory parentInfo = _info[registerable.getParentNftId()];
97
- require(parentInfo.nftId.gtz(), "ERROR:REG-004:PARENT_NOT_FOUND");
98
- // check validity of parent relation, valid relations are
99
- // policy -> product, bundle -> pool, product -> instance, pool -> instance
128
+ /// @dev registry protects only from tampering existing records and invalid types pairs
129
+ // IMPORTANT: rare case when parentNftId is not registered and == next nftId -> technincally this is ZeroParentAddress error
130
+ // to catch this check parent address before minting !!!!
131
+ // TODO service registration means its approval for some type?
132
+ function register(ObjectInfo memory info)
133
+ external
134
+ onlyRegistryService
135
+ returns(NftId nftId)
136
+ {
137
+ ObjectType objectType = info.objectType;
138
+ NftId parentNftId = info.parentNftId;
139
+ ObjectInfo memory parentInfo = _info[parentNftId];
140
+ ObjectType parentType = parentInfo.objectType; // see function header
141
+ address parentAddress = parentInfo.objectAddress;
142
+
143
+ // parent is contract -> need to check? -> check before minting
144
+ // special case: global registry nft as parent when not on mainnet -> global registry address is 0
145
+ // special case: when parentNftId == _chainNft.mint(), check for zero parent address before mint
146
+ // special case: when parentNftId == _chainNft.mint() && objectAddress == initialOwner
147
+ if(parentAddress == address(0)) {
148
+ revert ZeroParentAddress();
100
149
  }
101
150
 
151
+ address interceptor = _getInterceptor(info.isInterceptor, info.objectAddress, parentInfo.isInterceptor, parentAddress);
152
+
102
153
  uint256 mintedTokenId = _chainNft.mint(
103
- registerable.getInitialOwner(),
154
+ info.initialOwner,
155
+ interceptor,
104
156
  EMPTY_URI);
105
157
  nftId = toNftId(mintedTokenId);
106
-
107
- RegistryInfo memory info = RegistryInfo(
108
- nftId,
109
- registerable.getParentNftId(),
110
- registerable.getType(),
111
- objectAddress,
112
- registerable.getInitialOwner()
113
- );
114
158
 
159
+ // TODO move nftId out of info struct
160
+ // getters by nftId -> return struct without nftId
161
+ // getters by address -> return nftId AND struct
162
+ info.nftId = nftId;
115
163
  _info[nftId] = info;
116
- _nftIdByAddress[objectAddress] = nftId;
117
164
 
118
- // add logging
165
+ if(info.objectAddress > address(0))
166
+ {
167
+ // TODO if need to add types latter -> at least call this check from registry service
168
+ // parent is registered + object-parent types are valid
169
+ if(_isValidContractCombination[objectType][parentType] == false) {
170
+ revert InvalidTypesCombination(objectType, parentType);
171
+ }
172
+
173
+ address contractAddress = info.objectAddress;
174
+
175
+ if(_nftIdByAddress[contractAddress].gtz()) {
176
+ revert ContractAlreadyRegistered(contractAddress);
177
+ }
178
+
179
+ _nftIdByAddress[contractAddress] = nftId;
180
+
181
+ // special case
182
+ if(objectType == SERVICE())
183
+ {
184
+ (
185
+ string memory serviceName,
186
+ VersionPart majorVersion
187
+ ) = abi.decode(info.data, (string, VersionPart));
188
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
189
+
190
+ // TODO MUST guarantee consistency of registerable.getVersion() and majorVersion here
191
+ // TODO update _serviceNftId when registryService with new major version is registered? -> it is fixed in current setup
192
+ // TODO do not use names -> each object type is registered by corresponding service -> conflicting with approve()
193
+ if(
194
+ majorVersion.toInt() < MAJOR_VERSION_MIN ||
195
+ (majorVersion.toInt() > MAJOR_VERSION_MIN &&
196
+ _service[serviceNameHash][VersionLib.toVersionPart(majorVersion.toInt() - 1)] == address(0) )
197
+ ) {
198
+ revert InvalidServiceVersion(majorVersion);
199
+ }
200
+
201
+ if(_service[serviceNameHash][majorVersion] != address(0)) {
202
+ revert ServiceNameAlreadyRegistered(serviceName, majorVersion);
203
+ }
204
+
205
+ _string[nftId] = serviceName;
206
+ _service[serviceNameHash][majorVersion] = contractAddress;
207
+
208
+ emit LogServiceNameRegistration(serviceName, majorVersion);
209
+ }
210
+ }
211
+ else
212
+ {
213
+ if(_isValidObjectCombination[objectType][parentType] == false) {
214
+ revert InvalidTypesCombination(objectType, parentType);
215
+ }
216
+ }
217
+
218
+ emit LogRegistration(nftId, info.parentNftId, info.objectType, info.objectAddress, info.initialOwner);
119
219
  }
120
220
 
221
+ function registerFrom(
222
+ address from,
223
+ ObjectInfo memory info
224
+ ) external returns (NftId nftId)
225
+ {
226
+ revert();
227
+ }
228
+
121
229
 
122
- function registerObjectForInstance(
123
- NftId parentNftId,
124
- uint256 objectType,
125
- address initialOwner
126
- )
127
- external
128
- override
129
- // TODO add onlyRegisteredInstance
130
- returns(NftId nftId)
230
+ /// @dev
231
+ // msg.sender - registry owner
232
+ // CAN approve only registered service contract
233
+ // CAN approve any combination specified in _isValidCombination
234
+ // CAN NOT approve itself
235
+ // TODO in case where exists exactly one registered service per objectType (and major version):
236
+ // - registration and approve is a single operation, no need for separate approve() function
237
+ // - then approve can be used to adding new valid object-parent combinations???
238
+ function approve(
239
+ NftId serviceNftId,
240
+ ObjectType objectType,
241
+ ObjectType parentType
242
+ )
243
+ public
244
+ onlyOwner()
131
245
  {
132
- // TODO add more validation
133
- require(
134
- objectType == POLICY() || objectType == BUNDLE(),
135
- "ERROR:REG-005:TYPE_INVALID");
246
+ address serviceAddress = _info[serviceNftId].objectAddress;
247
+
248
+ if(_nftIdByAddress[serviceAddress].eqz()) {
249
+ revert NotRegisteredContract(serviceNftId);
250
+ }
136
251
 
137
- uint256 mintedTokenId = _chainNft.mint(
138
- initialOwner,
139
- EMPTY_URI);
140
- nftId = toNftId(mintedTokenId);
252
+ if(_info[serviceNftId].objectType != SERVICE()) {
253
+ revert NotService(serviceNftId);
254
+ }
141
255
 
142
- RegistryInfo memory info = RegistryInfo(
143
- nftId,
144
- parentNftId,
145
- objectType,
146
- address(0),
147
- initialOwner
148
- );
256
+ if(
257
+ _isValidContractCombination[objectType][parentType] == false &&
258
+ _isValidObjectCombination[objectType][parentType] == false) {
259
+ revert InvalidTypesCombination(objectType, parentType);
260
+ }
149
261
 
150
- _info[nftId] = info;
262
+ _isApproved[serviceNftId][objectType] = true;
151
263
 
152
- // add logging
264
+ emit LogApproval(serviceNftId, objectType);
153
265
  }
154
266
 
267
+ /// @dev returns false for registry owner nft
268
+ // TODO allowance by address?
269
+ // TODO checked by registry service -> but registry owner can upgrade registry service not to check allowance....
270
+ function allowance(
271
+ NftId nftId,
272
+ ObjectType object
273
+ )
274
+ public
275
+ view
276
+ returns (bool)
277
+ {
278
+ return _isApproved[nftId][object];
279
+ }
155
280
 
156
- function getObjectCount() external view override returns(uint256) {
281
+ // from IRegistry
282
+ function getObjectCount() external view override returns (uint256) {
283
+
157
284
  return _chainNft.totalSupply();
158
285
  }
159
286
 
160
-
161
- function getNftId(address object) external view override returns(NftId id) {
287
+ function getNftId(address object) external view override returns (NftId id) {
162
288
  return _nftIdByAddress[object];
163
289
  }
164
290
 
291
+ function ownerOf(NftId nftId) public view override returns (address) {
292
+ return _chainNft.ownerOf(nftId.toInt());
293
+ }
294
+
295
+ function ownerOf(address contractAddress) public view returns (address) {
296
+
297
+ return _chainNft.ownerOf(_nftIdByAddress[contractAddress].toInt());
298
+ }
299
+
300
+ function getObjectInfo(NftId nftId) external view override returns (ObjectInfo memory) {
301
+ return _info[nftId];
302
+ }
303
+
304
+ function getObjectInfo(address object) external view override returns (ObjectInfo memory) {
305
+
306
+ return _info[_nftIdByAddress[object]];
307
+ }
308
+
309
+ function isRegistered(NftId nftId) public view override returns (bool) {
310
+ return _info[nftId].objectType.gtz();
311
+ }
165
312
 
166
- function isRegistered(address object) external view override returns(bool) {
313
+ function isRegistered(address object) external view override returns (bool) {
167
314
  return _nftIdByAddress[object].gtz();
168
315
  }
169
316
 
317
+ function getServiceName(NftId nftId) external view returns (string memory) {
318
+ return _string[nftId];
319
+ }
170
320
 
171
- function getInfo(NftId nftId) external view override returns(RegistryInfo memory info) {
172
- return _info[nftId];
321
+ // special case to retrive a gif service
322
+ function getServiceAddress(
323
+ string memory serviceName,
324
+ VersionPart majorVersion
325
+ ) external view returns (address)
326
+ {
327
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
328
+ return _service[serviceNameHash][majorVersion];
173
329
  }
174
330
 
175
- function getOwner(NftId nftId) external view override returns(address) {
176
- return _chainNft.ownerOf(nftId.toInt());
331
+ function getProtocolOwner() external view override returns (address) {
332
+ return _protocolOwner;
333
+ }
334
+
335
+ function getChainNft() external view override returns (IChainNft) {
336
+ return _chainNft;
337
+ }
338
+
339
+ // from IOwnable
340
+ function getOwner() public view returns (address owner) {
341
+ return ownerOf(address(this));
342
+ }
343
+
344
+ // Internals, called only in constructor
345
+
346
+ /// @dev protocol registration used to anchor the dip ecosystem relations
347
+ function _registerProtocol()
348
+ internal
349
+ {
350
+ uint256 protocolId = _chainNftInternal.PROTOCOL_NFT_ID();
351
+ NftId protocolNftId = toNftId(protocolId);
352
+
353
+ _chainNftInternal.mint(NFT_LOCK_ADDRESS, protocolId);
354
+
355
+ _info[protocolNftId] = ObjectInfo(
356
+ protocolNftId,
357
+ zeroNftId(), // parent
358
+ PROTOCOL(),
359
+ false, // isInterceptor
360
+ address(0), // objectAddress
361
+ NFT_LOCK_ADDRESS,// initialOwner
362
+ ""
363
+ );
364
+ }
365
+
366
+ /// @dev registry registration
367
+ /// might also register the global registry when not on mainnet
368
+ function _registerRegistry()
369
+ internal
370
+ {
371
+ uint256 registryId = _chainNftInternal.calculateTokenId(2);
372
+ NftId registryNftId = toNftId(registryId);
373
+
374
+ NftId parentNftId;
375
+
376
+ if(registryId != _chainNftInternal.GLOBAL_REGISTRY_ID())
377
+ {// we're not the global registry
378
+ _registerGlobalRegistry();
379
+ parentNftId = toNftId(_chainNftInternal.GLOBAL_REGISTRY_ID());
380
+ }
381
+ else
382
+ {// we are global registry
383
+ parentNftId = toNftId(_chainNftInternal.PROTOCOL_NFT_ID());
384
+ }
385
+
386
+ _chainNftInternal.mint(_protocolOwner, registryId);
387
+
388
+ _info[registryNftId] = ObjectInfo(
389
+ registryNftId,
390
+ parentNftId,
391
+ REGISTRY(),
392
+ false, // isInterceptor
393
+ address(this),
394
+ _protocolOwner,
395
+ ""
396
+ );
397
+ _nftIdByAddress[address(this)] = registryNftId;
398
+ _registryNftId = registryNftId;
177
399
  }
178
400
 
179
- function getNftAddress() external view override returns(address nft) {
180
- return address(_chainNft);
401
+
402
+ /// @dev global registry registration for non mainnet registries
403
+ function _registerGlobalRegistry()
404
+ internal
405
+ {
406
+ uint256 globalRegistryId = _chainNftInternal.GLOBAL_REGISTRY_ID();
407
+
408
+ _chainNftInternal.mint(NFT_LOCK_ADDRESS, globalRegistryId);
409
+
410
+ NftId globalRegistryNftId = toNftId(globalRegistryId);
411
+
412
+ _info[globalRegistryNftId] = ObjectInfo(
413
+ globalRegistryNftId,
414
+ toNftId(_chainNftInternal.PROTOCOL_NFT_ID()), // parent
415
+ REGISTRY(),
416
+ false, // isInterceptor
417
+ address(0), // objectAddress
418
+ NFT_LOCK_ADDRESS, // initialOwner
419
+ "" // data
420
+ );
421
+ }
422
+
423
+ function _registerRegistryService()
424
+ internal
425
+ {
426
+ uint256 serviceId = _chainNftInternal.calculateTokenId(3);
427
+ NftId serviceNftId = toNftId(serviceId);
428
+
429
+ _chainNftInternal.mint(NFT_LOCK_ADDRESS, serviceId);
430
+
431
+ _info[serviceNftId] = ObjectInfo(
432
+ serviceNftId,
433
+ _registryNftId,
434
+ SERVICE(),
435
+ false, // isInterceptor
436
+ msg.sender, // service deploys registry
437
+ NFT_LOCK_ADDRESS, // initialOwner,
438
+ ""
439
+ );
440
+
441
+ _nftIdByAddress[msg.sender] = serviceNftId;
442
+
443
+ string memory serviceName = "RegistryService";
444
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
445
+ _service[serviceNameHash][VersionLib.toVersionPart(MAJOR_VERSION_MIN)] = msg.sender;
446
+ _string[serviceNftId] = serviceName;
447
+ _serviceNftId = serviceNftId;
448
+ }
449
+
450
+ /// @dev obtain interceptor address for this nft if applicable, address(0) otherwise
451
+ function _getInterceptor(
452
+ bool isInterceptor,
453
+ address objectAddress,
454
+ bool parentIsInterceptor,
455
+ address parentObjectAddress
456
+ )
457
+ internal
458
+ view
459
+ returns (address interceptor)
460
+ {
461
+ if (objectAddress == address(0)) {
462
+ if (parentIsInterceptor) {
463
+ return parentObjectAddress;
464
+ } else {
465
+ return address(0);
466
+ }
467
+ }
468
+
469
+ if (isInterceptor) {
470
+ return objectAddress;
471
+ }
472
+
473
+ return address(0);
474
+ }
475
+
476
+ /// @dev defines which object - parent types relations are allowed to register
477
+ // IMPORTANT:
478
+ // 1) EACH object type MUST have only one parent type across ALL mappings
479
+ // 2) DO NOT use object type (e.g. POLCY, BUNDLE, STAKE) as parent type
480
+ // 3) DO NOT use REGISTRY as object type
481
+ // 2) DO NOT use PROTOCOL and "zeroObjectType"
482
+ function _setupValidObjectParentCombinations()
483
+ internal
484
+ {
485
+ // registry as parent, ONLY registry owner
486
+ _isValidContractCombination[TOKEN()][REGISTRY()] = true;
487
+ _isValidContractCombination[SERVICE()][REGISTRY()] = true;
488
+
489
+ // registry as parent, ONLY approved
490
+ _isValidContractCombination[INSTANCE()][REGISTRY()] = true;
491
+
492
+ // instance as parent, ONLY approved
493
+ _isValidContractCombination[PRODUCT()][INSTANCE()] = true;
494
+ _isValidContractCombination[DISTRIBUTION()][INSTANCE()] = true;
495
+ _isValidContractCombination[ORACLE()][INSTANCE()] = true;
496
+ _isValidContractCombination[POOL()][INSTANCE()] = true;
497
+
498
+ // product as parent, ONLY approved
499
+ _isValidObjectCombination[POLICY()][PRODUCT()] = true;
500
+
501
+ // pool as parent, ONLY approved
502
+ _isValidObjectCombination[BUNDLE()][POOL()] = true;
503
+ _isValidObjectCombination[STAKE()][POOL()] = true;
181
504
  }
182
505
  }