@etherisc/gif-next 0.0.2-8872ac5 → 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 (375) hide show
  1. package/README.md +170 -7
  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 +1 -1
  197. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
  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 +1 -1
  219. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +64 -2
  220. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  221. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +88 -62
  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 +236 -12
  233. package/contracts/components/Product.sol +268 -24
  234. package/contracts/experiment/statemachine/Dummy.sol +27 -0
  235. package/contracts/experiment/statemachine/ISM.sol +25 -0
  236. package/contracts/experiment/statemachine/SM.sol +57 -0
  237. package/contracts/experiment/statemachine/SimpleStateMachine.sol +31 -0
  238. package/contracts/instance/IInstance.sol +44 -8
  239. package/contracts/instance/IInstanceLinked.sol +8 -0
  240. package/contracts/instance/Instance.sol +60 -39
  241. package/contracts/instance/base/ComponentServiceBase.sol +49 -0
  242. package/contracts/instance/base/IInstanceBase.sol +23 -0
  243. package/contracts/instance/base/IKeyValueStore.sol +50 -0
  244. package/contracts/instance/base/ILifecycle.sol +30 -0
  245. package/contracts/instance/base/IService.sol +15 -0
  246. package/contracts/instance/base/InstanceBase.sol +89 -0
  247. package/contracts/instance/base/KeyValueStore.sol +161 -0
  248. package/contracts/instance/base/Lifecycle.sol +100 -0
  249. package/contracts/instance/base/ModuleBase.sol +57 -0
  250. package/contracts/instance/base/ServiceBase.sol +43 -0
  251. package/contracts/instance/module/access/Access.sol +149 -0
  252. package/contracts/instance/module/access/IAccess.sol +53 -0
  253. package/contracts/instance/module/bundle/BundleModule.sol +134 -0
  254. package/contracts/instance/module/bundle/IBundle.sol +53 -0
  255. package/contracts/instance/module/component/ComponentModule.sol +71 -0
  256. package/contracts/instance/module/component/IComponent.sol +28 -0
  257. package/contracts/instance/module/distribution/DistributionModule.sol +17 -0
  258. package/contracts/instance/module/distribution/IDistribution.sol +10 -0
  259. package/contracts/instance/module/policy/IPolicy.sol +63 -0
  260. package/contracts/instance/module/policy/PolicyModule.sol +91 -0
  261. package/contracts/instance/module/pool/IPoolModule.sol +41 -0
  262. package/contracts/instance/module/pool/PoolModule.sol +95 -0
  263. package/contracts/instance/module/risk/IRisk.sol +26 -0
  264. package/contracts/instance/module/risk/RiskModule.sol +62 -0
  265. package/contracts/instance/module/treasury/ITreasury.sol +84 -0
  266. package/contracts/instance/module/treasury/TokenHandler.sol +48 -0
  267. package/contracts/instance/module/treasury/TreasuryModule.sol +131 -0
  268. package/contracts/instance/service/ComponentOwnerService.sol +272 -0
  269. package/contracts/instance/service/DistributionService.sol +54 -0
  270. package/contracts/instance/service/IComponentOwnerService.sol +20 -0
  271. package/contracts/instance/service/IDistributionService.sol +12 -0
  272. package/contracts/instance/service/IPoolService.sol +37 -0
  273. package/contracts/instance/service/IProductService.sol +107 -0
  274. package/contracts/instance/service/PoolService.sol +149 -0
  275. package/contracts/instance/service/ProductService.sol +509 -0
  276. package/contracts/registry/ChainNft.sol +94 -42
  277. package/contracts/registry/IChainNft.sol +3 -2
  278. package/contracts/registry/IRegistry.sol +51 -56
  279. package/contracts/registry/IRegistryLinked.sol +8 -0
  280. package/contracts/registry/IRegistryService.sol +29 -0
  281. package/contracts/registry/ITransferInterceptor.sol +6 -0
  282. package/contracts/registry/Registry.sol +436 -140
  283. package/contracts/registry/RegistryInstaller.sol +100 -0
  284. package/contracts/registry/RegistryService.sol +383 -0
  285. package/contracts/shared/ERC165.sol +21 -0
  286. package/contracts/shared/IOwnable.sol +6 -0
  287. package/contracts/shared/IRegisterable.sol +22 -0
  288. package/contracts/shared/IVersionable.sol +96 -0
  289. package/contracts/shared/ProxyManager.sol +115 -0
  290. package/contracts/shared/Registerable.sol +117 -0
  291. package/contracts/shared/UpgradableProxyWithAdmin.sol +16 -0
  292. package/contracts/shared/Versionable.sol +147 -0
  293. package/contracts/test/TestDistribution.sol +22 -0
  294. package/contracts/test/TestFee.sol +25 -0
  295. package/contracts/test/TestPool.sol +27 -0
  296. package/contracts/test/TestProduct.sol +74 -0
  297. package/contracts/test/TestRegisterable.sol +18 -0
  298. package/contracts/test/TestRoleId.sol +14 -0
  299. package/contracts/test/TestService.sol +26 -0
  300. package/contracts/test/TestToken.sol +26 -0
  301. package/contracts/test/TestVersion.sol +44 -0
  302. package/contracts/test/TestVersionable.sol +17 -0
  303. package/contracts/test/Usdc.sol +26 -0
  304. package/contracts/types/AddressSet.sol +58 -0
  305. package/contracts/types/Fee.sol +56 -0
  306. package/contracts/types/Key32.sol +45 -0
  307. package/contracts/types/NftId.sol +22 -1
  308. package/contracts/types/NftIdSet.sol +60 -0
  309. package/contracts/types/ObjectType.sol +131 -0
  310. package/contracts/types/ReferralId.sol +48 -0
  311. package/contracts/types/RiskId.sol +43 -0
  312. package/contracts/types/RoleId.sol +38 -0
  313. package/contracts/types/StateId.sol +101 -0
  314. package/contracts/types/Timestamp.sol +22 -1
  315. package/contracts/types/UFixed.sol +26 -22
  316. package/contracts/types/Version.sol +104 -0
  317. package/package.json +15 -5
  318. package/artifacts/contracts/components/Component.sol/Component.dbg.json +0 -4
  319. package/artifacts/contracts/components/Component.sol/Component.json +0 -179
  320. package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +0 -4
  321. package/artifacts/contracts/components/Component.sol/InstanceLinked.json +0 -35
  322. package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +0 -4
  323. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +0 -4
  324. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +0 -4
  325. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +0 -4
  326. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +0 -4
  327. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +0 -35
  328. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +0 -4
  329. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +0 -50
  330. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +0 -4
  331. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +0 -4
  332. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +0 -4
  333. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +0 -147
  334. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +0 -4
  335. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +0 -4
  336. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +0 -179
  337. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +0 -4
  338. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +0 -245
  339. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +0 -4
  340. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +0 -94
  341. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +0 -4
  342. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +0 -4
  343. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +0 -4
  344. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +0 -4
  345. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +0 -4
  346. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +0 -4
  347. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +0 -4
  348. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +0 -4
  349. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +0 -75
  350. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +0 -4
  351. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +0 -4
  352. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +0 -75
  353. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +0 -4
  354. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +0 -167
  355. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +0 -4
  356. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +0 -4
  357. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +0 -166
  358. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +0 -4
  359. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +0 -49
  360. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +0 -4
  361. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +0 -4
  362. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +0 -60
  363. package/contracts/components/Component.sol +0 -60
  364. package/contracts/components/IPool.sol +0 -9
  365. package/contracts/components/IProduct.sol +0 -9
  366. package/contracts/instance/access/Access.sol +0 -165
  367. package/contracts/instance/access/IAccess.sol +0 -63
  368. package/contracts/instance/component/ComponentModule.sol +0 -213
  369. package/contracts/instance/component/IComponent.sol +0 -73
  370. package/contracts/instance/policy/IPolicy.sol +0 -51
  371. package/contracts/instance/policy/PolicyModule.sol +0 -91
  372. package/contracts/instance/pool/IPoolModule.sol +0 -29
  373. package/contracts/instance/pool/PoolModule.sol +0 -73
  374. package/contracts/instance/product/IProductService.sol +0 -36
  375. package/contracts/instance/product/ProductService.sol +0 -112
@@ -1,209 +1,505 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {IRegisterable} from "../shared/IRegisterable.sol";
5
+ import {IService} from "../instance/base/IService.sol";
3
6
 
4
7
  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
+ 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;
47
+
48
+ string public constant EMPTY_URI = "";
49
+
50
+ address constant public NFT_LOCK_ADDRESS = address(0x1);
51
+
52
+ mapping(NftId nftId => ObjectInfo info) _info;
53
+ mapping(address object => NftId nftId) _nftIdByAddress;
54
+
55
+ mapping(NftId registrator => mapping(
56
+ ObjectType objectType => bool)) _isApproved;
57
+
58
+ mapping(ObjectType objectType => mapping(
59
+ ObjectType parentType => bool)) _isValidContractCombination;
60
+
61
+ mapping(ObjectType objectType => mapping(
62
+ ObjectType parentType => bool)) _isValidObjectCombination;
8
63
 
9
- contract RegistryLinked is IRegistryLinked {
10
- IRegistry internal _registry;
64
+ mapping(NftId nftId => string name) _string;
65
+ mapping(bytes32 serviceNameHash => mapping(
66
+ VersionPart majorVersion => address service)) _service;
11
67
 
12
- constructor(address registry) {
13
- _registry = IRegistry(registry);
68
+ NftId _registryNftId;
69
+ NftId _serviceNftId; // set in stone upon registry creation
70
+ IChainNft _chainNft;
71
+ ChainNft _chainNftInternal;
72
+
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;
77
+
78
+ /*
79
+ modifier onlyInitialOwner() {
80
+ if(
81
+ msg.sender != getOwner() ||
82
+ msg.sender != _info[_registryNftId].initialOwner) {
83
+ revert NotInitialOwner();
84
+ }
85
+ }*/
86
+
87
+ modifier onlyOwner() {
88
+ if(msg.sender != getOwner()) {
89
+ revert NotOwner();
90
+ }
91
+ _;
14
92
  }
15
93
 
16
- function getRegistry() external view override returns (IRegistry registry) {
17
- return _registry;
94
+ modifier onlyRegistryService() {
95
+
96
+ if(msg.sender != _info[_serviceNftId].objectAddress) {
97
+ revert NotRegistryService();
98
+ }
99
+ _;
18
100
  }
19
- }
20
101
 
21
- abstract contract Registerable is RegistryLinked, IRegisterable {
22
- using NftIdLib for NftId;
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");
106
+
107
+ // TODO registry owner can change, while protocol is not?
108
+ _protocolOwner = protocolOwner;
109
+
110
+ // deploy NFT
111
+ _chainNftInternal = new ChainNft(address(this));// adds 10kb to deployment size
112
+ _chainNft = IChainNft(_chainNftInternal);
113
+
114
+ // initial registry setup
115
+ _registerProtocol();
116
+
117
+ _registerRegistry();
23
118
 
24
- address private _initialOwner;
119
+ _registerRegistryService();
25
120
 
26
- constructor(address registry) RegistryLinked(registry) {
27
- _initialOwner = msg.sender;
121
+ // set object parent relations
122
+ _setupValidObjectParentCombinations();
123
+
124
+ _registerInterface(type(IRegistry).interfaceId);
125
+ _registerInterface(type(IOwnable).interfaceId);
28
126
  }
29
127
 
30
- // getType, getData and register need to be implemented by concrete contract
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();
149
+ }
150
+
151
+ address interceptor = _getInterceptor(info.isInterceptor, info.objectAddress, parentInfo.isInterceptor, parentAddress);
31
152
 
32
- function isRegisterable() external pure override returns (bool) {
33
- return true;
153
+ uint256 mintedTokenId = _chainNft.mint(
154
+ info.initialOwner,
155
+ interceptor,
156
+ EMPTY_URI);
157
+ nftId = toNftId(mintedTokenId);
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;
163
+ _info[nftId] = info;
164
+
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);
34
219
  }
35
220
 
36
- function getInitialOwner() public view override returns (address deployer) {
37
- return _initialOwner;
221
+ function registerFrom(
222
+ address from,
223
+ ObjectInfo memory info
224
+ ) external returns (NftId nftId)
225
+ {
226
+ revert();
38
227
  }
228
+
229
+
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()
245
+ {
246
+ address serviceAddress = _info[serviceNftId].objectAddress;
247
+
248
+ if(_nftIdByAddress[serviceAddress].eqz()) {
249
+ revert NotRegisteredContract(serviceNftId);
250
+ }
251
+
252
+ if(_info[serviceNftId].objectType != SERVICE()) {
253
+ revert NotService(serviceNftId);
254
+ }
39
255
 
40
- function isRegistered() public view override returns (bool) {
41
- NftId nftId = _registry.getNftId(address(this));
42
- return nftId.gtz();
256
+ if(
257
+ _isValidContractCombination[objectType][parentType] == false &&
258
+ _isValidObjectCombination[objectType][parentType] == false) {
259
+ revert InvalidTypesCombination(objectType, parentType);
260
+ }
261
+
262
+ _isApproved[serviceNftId][objectType] = true;
263
+
264
+ emit LogApproval(serviceNftId, objectType);
43
265
  }
44
266
 
45
- function getNftId() public view override returns (NftId nftId) {
46
- return _registry.getNftId(address(this));
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];
47
279
  }
48
280
 
49
- function getOwner() public view override returns (address owner) {
50
- NftId id = _registry.getNftId(address(this));
51
- owner = _registry.getOwner(id);
52
- return owner != address(0) ? owner : _initialOwner;
281
+ // from IRegistry
282
+ function getObjectCount() external view override returns (uint256) {
283
+
284
+ return _chainNft.totalSupply();
53
285
  }
54
- }
55
286
 
56
- contract Registry is IRegistry {
57
- using NftIdLib for NftId;
58
- string public constant EMPTY_URI = "";
287
+ function getNftId(address object) external view override returns (NftId id) {
288
+ return _nftIdByAddress[object];
289
+ }
59
290
 
60
- mapping(NftId nftId => RegistryInfo info) private _info;
61
- mapping(NftId nftId => address owner) private _owner;
62
- mapping(address object => NftId nftId) private _nftIdByAddress;
291
+ function ownerOf(NftId nftId) public view override returns (address) {
292
+ return _chainNft.ownerOf(nftId.toInt());
293
+ }
63
294
 
64
- IChainNft private _chainNft;
295
+ function ownerOf(address contractAddress) public view returns (address) {
296
+
297
+ return _chainNft.ownerOf(_nftIdByAddress[contractAddress].toInt());
298
+ }
65
299
 
66
- function initialize(address chainNft) external {
67
- require(
68
- address(_chainNft) == address(0),
69
- "ERROR:REG-001:ALREADY_INITIALIZED"
70
- );
71
- _chainNft = IChainNft(chainNft);
300
+ function getObjectInfo(NftId nftId) external view override returns (ObjectInfo memory) {
301
+ return _info[nftId];
72
302
  }
73
303
 
74
- function TOKEN() public pure override returns (uint256) {
75
- return 30;
304
+ function getObjectInfo(address object) external view override returns (ObjectInfo memory) {
305
+
306
+ return _info[_nftIdByAddress[object]];
76
307
  }
77
308
 
78
- function INSTANCE() public pure override returns (uint256) {
79
- return 40;
309
+ function isRegistered(NftId nftId) public view override returns (bool) {
310
+ return _info[nftId].objectType.gtz();
80
311
  }
81
312
 
82
- function PRODUCT() public pure override returns (uint256) {
83
- return 50;
313
+ function isRegistered(address object) external view override returns (bool) {
314
+ return _nftIdByAddress[object].gtz();
84
315
  }
85
316
 
86
- function ORACLE() public pure override returns (uint256) {
87
- return 60;
317
+ function getServiceName(NftId nftId) external view returns (string memory) {
318
+ return _string[nftId];
88
319
  }
89
320
 
90
- function POOL() public pure override returns (uint256) {
91
- return 70;
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];
92
329
  }
93
330
 
94
- function POLICY() public pure override returns (uint256) {
95
- return 80;
331
+ function getProtocolOwner() external view override returns (address) {
332
+ return _protocolOwner;
96
333
  }
97
334
 
98
- function BUNDLE() public pure override returns (uint256) {
99
- return 90;
335
+ function getChainNft() external view override returns (IChainNft) {
336
+ return _chainNft;
100
337
  }
101
338
 
102
- function register(
103
- address objectAddress
104
- ) external override returns (NftId nftId) {
105
- require(
106
- _nftIdByAddress[objectAddress].eqz(),
107
- "ERROR:REG-002:ALREADY_REGISTERED"
108
- );
339
+ // from IOwnable
340
+ function getOwner() public view returns (address owner) {
341
+ return ownerOf(address(this));
342
+ }
343
+
344
+ // Internals, called only in constructor
109
345
 
110
- IRegisterable registerable = IRegisterable(objectAddress);
111
- require(
112
- registerable.isRegisterable(),
113
- "ERROR:REG-003:NOT_REGISTERABLE"
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
+ ""
114
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);
115
373
 
116
- // check parent exists (for objects not instances)
117
- if (registerable.getType() != INSTANCE()) {
118
- RegistryInfo memory parentInfo = _info[
119
- registerable.getParentNftId()
120
- ];
121
- require(parentInfo.nftId.gtz(), "ERROR:REG-004:PARENT_NOT_FOUND");
122
- // check validity of parent relation, valid relations are
123
- // policy -> product, bundle -> pool, product -> instance, pool -> instance
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());
124
384
  }
125
385
 
126
- uint256 mintedTokenId = _chainNft.mint(
127
- registerable.getInitialOwner(),
128
- EMPTY_URI
129
- );
130
- nftId = toNftId(mintedTokenId);
386
+ _chainNftInternal.mint(_protocolOwner, registryId);
131
387
 
132
- RegistryInfo memory info = RegistryInfo(
133
- nftId,
134
- registerable.getParentNftId(),
135
- registerable.getType(),
136
- objectAddress,
137
- registerable.getInitialOwner()
388
+ _info[registryNftId] = ObjectInfo(
389
+ registryNftId,
390
+ parentNftId,
391
+ REGISTRY(),
392
+ false, // isInterceptor
393
+ address(this),
394
+ _protocolOwner,
395
+ ""
138
396
  );
397
+ _nftIdByAddress[address(this)] = registryNftId;
398
+ _registryNftId = registryNftId;
399
+ }
139
400
 
140
- _info[nftId] = info;
141
- _nftIdByAddress[objectAddress] = nftId;
142
401
 
143
- // add logging
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
+ );
144
421
  }
145
422
 
146
- function registerObjectForInstance(
147
- NftId parentNftId,
148
- uint256 objectType,
149
- address initialOwner
150
- )
151
- external
152
- override
153
- returns (
154
- // TODO add onlyRegisteredInstance
155
- NftId nftId
156
- )
423
+ function _registerRegistryService()
424
+ internal
157
425
  {
158
- // TODO add more validation
159
- require(
160
- objectType == POLICY() || objectType == BUNDLE(),
161
- "ERROR:REG-005:TYPE_INVALID"
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
+ ""
162
439
  );
163
440
 
164
- uint256 mintedTokenId = _chainNft.mint(initialOwner, EMPTY_URI);
165
- nftId = toNftId(mintedTokenId);
441
+ _nftIdByAddress[msg.sender] = serviceNftId;
166
442
 
167
- RegistryInfo memory info = RegistryInfo(
168
- nftId,
169
- parentNftId,
170
- objectType,
171
- address(0),
172
- initialOwner
173
- );
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
+ }
174
449
 
175
- _info[nftId] = info;
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
+ }
176
468
 
177
- // add logging
178
- }
469
+ if (isInterceptor) {
470
+ return objectAddress;
471
+ }
179
472
 
180
- function getObjectCount() external view override returns (uint256) {
181
- return _chainNft.totalSupply();
473
+ return address(0);
182
474
  }
183
475
 
184
- function getNftId(
185
- address object
186
- ) external view override returns (NftId id) {
187
- return _nftIdByAddress[object];
188
- }
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;
189
488
 
190
- function isRegistered(
191
- address object
192
- ) external view override returns (bool) {
193
- return _nftIdByAddress[object].gtz();
194
- }
489
+ // registry as parent, ONLY approved
490
+ _isValidContractCombination[INSTANCE()][REGISTRY()] = true;
195
491
 
196
- function getInfo(
197
- NftId nftId
198
- ) external view override returns (RegistryInfo memory info) {
199
- return _info[nftId];
200
- }
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;
201
497
 
202
- function getOwner(NftId nftId) external view override returns (address) {
203
- return _chainNft.ownerOf(nftId.toInt());
204
- }
498
+ // product as parent, ONLY approved
499
+ _isValidObjectCombination[POLICY()][PRODUCT()] = true;
205
500
 
206
- function getNftAddress() external view override returns (address nft) {
207
- return address(_chainNft);
501
+ // pool as parent, ONLY approved
502
+ _isValidObjectCombination[BUNDLE()][POOL()] = true;
503
+ _isValidObjectCombination[STAKE()][POOL()] = true;
208
504
  }
209
505
  }