@etherisc/gif-next 0.0.2-a4b0112-987 → 0.0.2-a84e908-436

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 (366) hide show
  1. package/README.md +145 -6
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +4 -0
  3. package/artifacts/contracts/components/{Component.sol/Component.json → BaseComponent.sol/BaseComponent.json} +26 -57
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +4 -0
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +405 -0
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +4 -0
  7. package/artifacts/contracts/{instance/component/IComponent.sol/IComponentContract.json → components/IBaseComponent.sol/IBaseComponent.json} +26 -57
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/{IPool.sol/IPoolComponent.json → IDistributionComponent.sol/IDistributionComponent.json} +162 -77
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +4 -0
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +487 -0
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +4 -0
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +370 -0
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +290 -40
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +167 -69
  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 +1 -1
  33. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +2 -2
  34. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  35. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  36. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  37. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +2 -2
  38. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  39. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
  40. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  41. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +2 -2
  42. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  43. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +2 -2
  44. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  45. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1177 -608
  46. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +4 -0
  47. package/artifacts/contracts/instance/{component/IComponent.sol → IInstanceLinked.sol}/IInstanceLinked.json +1 -1
  48. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  49. package/artifacts/contracts/instance/Instance.sol/Instance.json +1501 -773
  50. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +4 -0
  51. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +364 -0
  52. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
  53. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +113 -0
  54. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +4 -0
  55. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.json +560 -0
  56. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +4 -0
  57. package/artifacts/contracts/instance/{lifecycle/ILifecycle.sol/ILifecycleModule.json → base/ILifecycle.sol/ILifecycle.json} +10 -77
  58. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +4 -0
  59. package/artifacts/contracts/instance/{component/ComponentModule.sol/ComponentModule.json → base/IService.sol/IService.json} +167 -125
  60. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +4 -0
  61. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.json +440 -0
  62. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +4 -0
  63. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +710 -0
  64. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +4 -0
  65. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +169 -0
  66. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +4 -0
  67. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.json +10 -0
  68. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +4 -0
  69. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.json +364 -0
  70. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +4 -0
  71. package/artifacts/contracts/instance/{access → module/access}/Access.sol/AccessModule.json +85 -152
  72. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +4 -0
  73. package/artifacts/contracts/instance/{access → module/access}/IAccess.sol/IAccess.json +1 -1
  74. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +4 -0
  75. package/artifacts/contracts/instance/{access → module/access}/IAccess.sol/IAccessModule.json +96 -99
  76. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +4 -0
  77. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.json +297 -0
  78. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +4 -0
  79. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.json +10 -0
  80. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +4 -0
  81. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.json +297 -0
  82. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
  83. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.json +117 -0
  84. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +4 -0
  85. package/artifacts/contracts/instance/{component → module/component}/IComponent.sol/IComponent.json +1 -1
  86. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +4 -0
  87. package/artifacts/contracts/instance/{product/IProductService.sol/IProductService.json → module/component/IComponent.sol/IComponentModule.json} +51 -61
  88. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +4 -0
  89. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.json +10 -0
  90. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +4 -0
  91. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.json +10 -0
  92. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +4 -0
  93. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.json +10 -0
  94. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  95. package/artifacts/contracts/instance/{policy → module/policy}/IPolicy.sol/IPolicy.json +1 -1
  96. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  97. package/artifacts/contracts/instance/{policy → module/policy}/IPolicy.sol/IPolicyModule.json +147 -117
  98. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  99. package/artifacts/contracts/instance/{policy → module/policy}/PolicyModule.sol/PolicyModule.json +148 -118
  100. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  101. package/artifacts/contracts/instance/{pool → module/pool}/IPoolModule.sol/IPool.json +1 -1
  102. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  103. package/artifacts/contracts/instance/{pool → module/pool}/IPoolModule.sol/IPoolModule.json +67 -52
  104. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  105. package/artifacts/contracts/instance/{pool → module/pool}/PoolModule.sol/PoolModule.json +51 -62
  106. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +4 -0
  107. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.json +10 -0
  108. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +4 -0
  109. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.json +113 -0
  110. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +4 -0
  111. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +131 -0
  112. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +4 -0
  113. package/artifacts/contracts/instance/{treasury → module/treasury}/ITreasury.sol/ITreasury.json +1 -1
  114. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +4 -0
  115. package/artifacts/contracts/instance/{treasury → module/treasury}/ITreasury.sol/ITreasuryModule.json +278 -257
  116. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +4 -0
  117. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +76 -0
  118. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +4 -0
  119. package/artifacts/contracts/instance/{treasury → module/treasury}/TreasuryModule.sol/TreasuryModule.json +278 -257
  120. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +4 -0
  121. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +595 -0
  122. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  123. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +484 -0
  124. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +4 -0
  125. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +405 -0
  126. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +4 -0
  127. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +366 -0
  128. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +4 -0
  129. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +481 -0
  130. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +4 -0
  131. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +671 -0
  132. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  133. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +607 -0
  134. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  135. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +922 -0
  136. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  137. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +65 -2
  138. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  139. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  140. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +134 -30
  141. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +4 -0
  142. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.json +24 -0
  143. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  144. package/artifacts/contracts/registry/Registry.sol/Registry.json +493 -25
  145. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +4 -0
  146. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +35 -0
  147. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +4 -0
  148. package/artifacts/contracts/{registry/IRegistry.sol → shared/IOwnable.sol}/IOwnable.json +1 -1
  149. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +4 -0
  150. package/artifacts/contracts/{registry/IRegistry.sol → shared/IRegisterable.sol}/IRegisterable.json +16 -61
  151. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +4 -0
  152. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +205 -0
  153. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.dbg.json +4 -0
  154. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.json +248 -0
  155. package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.dbg.json +4 -0
  156. package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.json +129 -0
  157. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +4 -0
  158. package/artifacts/contracts/{registry/Registry.sol → shared/Registerable.sol}/Registerable.json +16 -61
  159. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +4 -0
  160. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +228 -0
  161. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +4 -0
  162. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +405 -0
  163. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +4 -0
  164. package/artifacts/contracts/test/TestFee.sol/TestFee.json +119 -0
  165. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +4 -0
  166. package/artifacts/contracts/test/TestPool.sol/TestPool.json +578 -0
  167. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +4 -0
  168. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +575 -0
  169. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +4 -0
  170. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +137 -0
  171. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +4 -0
  172. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +116 -0
  173. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +4 -0
  174. package/artifacts/contracts/test/TestService.sol/TestService.json +443 -0
  175. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +4 -0
  176. package/artifacts/contracts/test/TestToken.sol/TestUsdc.json +338 -0
  177. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +4 -0
  178. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +218 -0
  179. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +4 -0
  180. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +270 -0
  181. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +4 -0
  182. package/artifacts/contracts/test/Usdc.sol/USDC.json +338 -0
  183. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +4 -0
  184. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.json +10 -0
  185. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  186. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
  187. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  188. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +2 -2
  189. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +4 -0
  190. package/artifacts/contracts/types/Fee.sol/FeeLib.json +257 -0
  191. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +4 -0
  192. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +111 -0
  193. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  194. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +65 -4
  195. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +4 -0
  196. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +10 -0
  197. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  198. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
  199. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +4 -0
  200. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.json +99 -0
  201. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +4 -0
  202. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +86 -0
  203. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +4 -0
  204. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +30 -0
  205. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  206. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  207. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  208. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +64 -2
  209. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  210. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +88 -62
  211. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +4 -0
  212. package/artifacts/contracts/types/Version.sol/VersionLib.json +177 -0
  213. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +4 -0
  214. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +30 -0
  215. package/contracts/components/BaseComponent.sol +94 -0
  216. package/contracts/components/Distribution.sol +132 -0
  217. package/contracts/components/IBaseComponent.sol +19 -0
  218. package/contracts/components/IDistributionComponent.sol +47 -0
  219. package/contracts/components/IPoolComponent.sol +71 -0
  220. package/contracts/components/IProductComponent.sol +38 -0
  221. package/contracts/components/Pool.sol +199 -16
  222. package/contracts/components/Product.sol +169 -31
  223. package/contracts/instance/IInstance.sol +39 -11
  224. package/contracts/instance/IInstanceLinked.sol +8 -0
  225. package/contracts/instance/Instance.sol +51 -49
  226. package/contracts/instance/base/ComponentServiceBase.sol +42 -0
  227. package/contracts/instance/base/IInstanceBase.sol +22 -0
  228. package/contracts/instance/base/IKeyValueStore.sol +50 -0
  229. package/contracts/instance/{lifecycle → base}/ILifecycle.sol +4 -21
  230. package/contracts/instance/base/IService.sol +15 -0
  231. package/contracts/instance/base/InstanceBase.sol +91 -0
  232. package/contracts/instance/base/KeyValueStore.sol +161 -0
  233. package/contracts/instance/base/Lifecycle.sol +100 -0
  234. package/contracts/instance/base/ModuleBase.sol +57 -0
  235. package/contracts/instance/base/ServiceBase.sol +37 -0
  236. package/contracts/instance/module/access/Access.sol +149 -0
  237. package/contracts/instance/module/access/IAccess.sol +53 -0
  238. package/contracts/instance/module/bundle/BundleModule.sol +134 -0
  239. package/contracts/instance/module/bundle/IBundle.sol +53 -0
  240. package/contracts/instance/module/component/ComponentModule.sol +70 -0
  241. package/contracts/instance/module/component/IComponent.sol +28 -0
  242. package/contracts/instance/module/distribution/DistributionModule.sol +17 -0
  243. package/contracts/instance/module/distribution/IDistribution.sol +10 -0
  244. package/contracts/instance/module/policy/IPolicy.sol +63 -0
  245. package/contracts/instance/module/policy/PolicyModule.sol +91 -0
  246. package/contracts/instance/module/pool/IPoolModule.sol +40 -0
  247. package/contracts/instance/module/pool/PoolModule.sol +90 -0
  248. package/contracts/instance/module/risk/IRisk.sol +26 -0
  249. package/contracts/instance/module/risk/RiskModule.sol +62 -0
  250. package/contracts/instance/module/treasury/ITreasury.sol +82 -0
  251. package/contracts/instance/module/treasury/TokenHandler.sol +48 -0
  252. package/contracts/instance/module/treasury/TreasuryModule.sol +138 -0
  253. package/contracts/instance/service/ComponentOwnerService.sol +157 -0
  254. package/contracts/instance/service/DistributionService.sol +59 -0
  255. package/contracts/instance/service/IComponentOwnerService.sol +22 -0
  256. package/contracts/instance/service/IDistributionService.sol +12 -0
  257. package/contracts/instance/service/IPoolService.sol +37 -0
  258. package/contracts/instance/service/IProductService.sol +107 -0
  259. package/contracts/instance/service/PoolService.sol +149 -0
  260. package/contracts/instance/service/ProductService.sol +509 -0
  261. package/contracts/registry/ChainNft.sol +61 -37
  262. package/contracts/registry/IRegistry.sol +25 -38
  263. package/contracts/registry/IRegistryLinked.sol +8 -0
  264. package/contracts/registry/Registry.sol +384 -110
  265. package/contracts/shared/ERC165.sol +21 -0
  266. package/contracts/shared/IOwnable.sol +6 -0
  267. package/contracts/shared/IRegisterable.sol +24 -0
  268. package/contracts/shared/IVersionable.sol +94 -0
  269. package/contracts/shared/Proxy.sol +94 -0
  270. package/contracts/shared/Registerable.sol +86 -0
  271. package/contracts/shared/Versionable.sol +145 -0
  272. package/contracts/test/TestDistribution.sol +21 -0
  273. package/contracts/test/TestFee.sol +25 -0
  274. package/contracts/test/TestPool.sol +25 -0
  275. package/contracts/test/TestProduct.sol +72 -0
  276. package/contracts/test/TestRegisterable.sol +19 -0
  277. package/contracts/test/TestRoleId.sol +14 -0
  278. package/contracts/test/TestService.sol +32 -0
  279. package/contracts/test/TestToken.sol +26 -0
  280. package/contracts/test/TestVersion.sol +44 -0
  281. package/contracts/test/TestVersionable.sol +17 -0
  282. package/contracts/test/Usdc.sol +26 -0
  283. package/contracts/types/AddressSet.sol +58 -0
  284. package/contracts/types/Fee.sol +44 -20
  285. package/contracts/types/Key32.sol +45 -0
  286. package/contracts/types/NftId.sol +22 -1
  287. package/contracts/types/NftIdSet.sol +60 -0
  288. package/contracts/types/ObjectType.sol +37 -13
  289. package/contracts/types/ReferralId.sol +48 -0
  290. package/contracts/types/RiskId.sol +43 -0
  291. package/contracts/types/RoleId.sol +38 -0
  292. package/contracts/types/StateId.sol +13 -3
  293. package/contracts/types/Timestamp.sol +22 -1
  294. package/contracts/types/UFixed.sol +26 -23
  295. package/contracts/types/Version.sol +103 -0
  296. package/package.json +12 -4
  297. package/artifacts/contracts/components/Component.sol/Component.dbg.json +0 -4
  298. package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +0 -4
  299. package/artifacts/contracts/components/Component.sol/InstanceLinked.json +0 -35
  300. package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +0 -4
  301. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +0 -4
  302. package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +0 -74
  303. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +0 -4
  304. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +0 -4
  305. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +0 -4
  306. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +0 -35
  307. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +0 -4
  308. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +0 -50
  309. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +0 -4
  310. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +0 -4
  311. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +0 -4
  312. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +0 -202
  313. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +0 -4
  314. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +0 -4
  315. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +0 -4
  316. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +0 -217
  317. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +0 -4
  318. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +0 -141
  319. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +0 -4
  320. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.dbg.json +0 -4
  321. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.json +0 -134
  322. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.dbg.json +0 -4
  323. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.dbg.json +0 -4
  324. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.json +0 -221
  325. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +0 -4
  326. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +0 -4
  327. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +0 -4
  328. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +0 -4
  329. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +0 -4
  330. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +0 -4
  331. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +0 -4
  332. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +0 -75
  333. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +0 -4
  334. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +0 -4
  335. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +0 -75
  336. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +0 -4
  337. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +0 -196
  338. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.dbg.json +0 -4
  339. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.dbg.json +0 -4
  340. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.dbg.json +0 -4
  341. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.json +0 -45
  342. package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +0 -4
  343. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +0 -4
  344. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +0 -4
  345. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +0 -4
  346. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +0 -49
  347. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +0 -4
  348. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +0 -4
  349. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +0 -60
  350. package/contracts/components/Component.sol +0 -77
  351. package/contracts/components/IPool.sol +0 -15
  352. package/contracts/components/IProduct.sol +0 -16
  353. package/contracts/instance/access/Access.sol +0 -165
  354. package/contracts/instance/access/IAccess.sol +0 -63
  355. package/contracts/instance/component/ComponentModule.sol +0 -274
  356. package/contracts/instance/component/IComponent.sol +0 -74
  357. package/contracts/instance/lifecycle/LifecycleModule.sol +0 -88
  358. package/contracts/instance/policy/IPolicy.sol +0 -50
  359. package/contracts/instance/policy/PolicyModule.sol +0 -114
  360. package/contracts/instance/pool/IPoolModule.sol +0 -23
  361. package/contracts/instance/pool/PoolModule.sol +0 -81
  362. package/contracts/instance/product/IProductService.sol +0 -36
  363. package/contracts/instance/product/ProductService.sol +0 -136
  364. package/contracts/instance/treasury/ITreasury.sol +0 -91
  365. package/contracts/instance/treasury/TokenHandler.sol +0 -24
  366. package/contracts/instance/treasury/TreasuryModule.sol +0 -168
@@ -1,125 +1,135 @@
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, NftIdLib} from "../types/NftId.sol";
7
- import {ObjectType, INSTANCE, POLICY, BUNDLE} from "../types/ObjectType.sol";
8
-
9
- contract RegistryLinked is IRegistryLinked {
10
- IRegistry internal _registry;
11
-
12
- constructor(address registry) {
13
- _registry = IRegistry(registry);
14
- }
15
-
16
- function getRegistry() external view override returns (IRegistry registry) {
17
- return _registry;
18
- }
19
- }
20
-
21
- abstract contract Registerable is RegistryLinked, IRegisterable {
22
- using NftIdLib for NftId;
23
-
24
- address private _initialOwner;
25
-
26
- constructor(address registry) RegistryLinked(registry) {
27
- _initialOwner = msg.sender;
28
- }
29
-
30
- // getType, getData and register need to be implemented by concrete contract
31
-
32
- function isRegisterable() external pure override returns (bool) {
33
- return true;
34
- }
35
-
36
- function getInitialOwner() public view override returns (address deployer) {
37
- return _initialOwner;
38
- }
4
+ import {IRegisterable} from "../shared/IRegisterable.sol";
5
+ import {IService} from "../instance/base/IService.sol";
39
6
 
40
- function isRegistered() public view override returns (bool) {
41
- NftId nftId = _registry.getNftId(address(this));
42
- return nftId.gtz();
43
- }
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";
44
13
 
45
- function getNftId() public view override returns (NftId nftId) {
46
- return _registry.getNftId(address(this));
47
- }
14
+ import {Versionable} from "../shared/Versionable.sol";
48
15
 
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;
53
- }
54
- }
55
16
 
56
- contract Registry is IRegistry {
17
+ contract Registry is
18
+ Versionable,
19
+ IRegisterable,
20
+ IRegistry
21
+ {
57
22
  using NftIdLib for NftId;
58
23
 
59
24
  string public constant EMPTY_URI = "";
60
25
 
61
- mapping(NftId nftId => RegistryInfo info) private _info;
62
- mapping(NftId nftId => address owner) private _owner;
63
- mapping(address object => NftId nftId) private _nftIdByAddress;
64
-
65
- IChainNft private _chainNft;
66
-
67
- function initialize(address chainNft) external {
68
- require(
69
- address(_chainNft) == address(0),
70
- "ERROR:REG-001:ALREADY_INITIALIZED"
71
- );
72
- _chainNft = IChainNft(chainNft);
26
+ // TODO do not use gif-next in namespace id
27
+ // TODO ask openzeppelin about public location
28
+ // keccak256(abi.encode(uint256(keccak256("gif-next.contracts.registry.Registry.sol")) - 1)) & ~bytes32(uint256(0xff));
29
+ bytes32 public constant REGISTRY_LOCATION_V1 = 0x6548007c3f4340f82f348c576c0ff69f4f529cadd5ad41f96aae61abceeaa300;
30
+
31
+ // IMPORTANT Every new version with storage changes must implement its own struct
32
+ // copy paste previous version and add changes
33
+ // @custom:storage-location erc7201:gif-next.contracts.registry.Registry.sol
34
+ struct StorageV1 {
35
+
36
+ mapping(NftId nftId => ObjectInfo info) _info;
37
+ mapping(address object => NftId nftId) _nftIdByAddress;
38
+ mapping(ObjectType objectType => bool) _isValidType;
39
+ mapping(ObjectType objectType => mapping(ObjectType objectParentType => bool)) _isValidParentType;
40
+
41
+ mapping(NftId nftId => string stringValue) _string;
42
+ mapping(bytes32 serviceNameHash => mapping(VersionPart majorVersion => address service)) _service;
43
+
44
+ NftId _nftId;
45
+ IChainNft _chainNft;
46
+ ChainNft _chainNftInternal;
47
+ address _initialOwner;
48
+
49
+ /// @dev will own protocol nft and registry nft(s) minted during initialize
50
+ address _protocolOwner;
51
+ // if struct goes here
52
+ // then you cannot add new vars after
73
53
  }
74
54
 
75
55
  function register(
76
56
  address objectAddress
77
- ) external override returns (NftId nftId) {
57
+ )
58
+ // TODO add authz (only services may register components etc)
59
+ // we have to check how we do authz for registring services (just restrict to protocol owner/registry owner)
60
+ external override returns (NftId nftId) {
61
+ StorageV1 storage $ = _getStorage();
62
+
78
63
  require(
79
- _nftIdByAddress[objectAddress].eqz(),
64
+ $._nftIdByAddress[objectAddress].eqz(),
80
65
  "ERROR:REG-002:ALREADY_REGISTERED"
81
66
  );
82
67
 
83
68
  IRegisterable registerable = IRegisterable(objectAddress);
84
69
  require(
85
- registerable.isRegisterable(),
70
+ registerable.supportsInterface(type(IRegisterable).interfaceId),
86
71
  "ERROR:REG-003:NOT_REGISTERABLE"
87
72
  );
88
73
 
89
- // check parent exists (for objects not instances)
90
- if (registerable.getType() != INSTANCE()) {
91
- RegistryInfo memory parentInfo = _info[
92
- registerable.getParentNftId()
93
- ];
94
- require(parentInfo.nftId.gtz(), "ERROR:REG-004:PARENT_NOT_FOUND");
95
- // check validity of parent relation, valid relations are
96
- // policy -> product, bundle -> pool, product -> instance, pool -> instance
97
- }
74
+ ObjectType objectType = registerable.getType();
75
+ require(
76
+ $._isValidType[objectType],
77
+ "ERROR:REG-004:TYPE_INVALID"
78
+ );
98
79
 
99
- uint256 mintedTokenId = _chainNft.mint(
100
- registerable.getInitialOwner(),
101
- EMPTY_URI
80
+ NftId parentNftId = registerable.getParentNftId();
81
+ require(
82
+ isRegistered(parentNftId),
83
+ "ERROR:REG-005:PARENT_NOT_REGISTERED"
102
84
  );
103
- nftId = toNftId(mintedTokenId);
104
85
 
105
- RegistryInfo memory info = RegistryInfo(
106
- nftId,
107
- registerable.getParentNftId(),
108
- registerable.getType(),
109
- objectAddress,
110
- registerable.getInitialOwner()
86
+ require(
87
+ $._isValidParentType[objectType][$._info[parentNftId].objectType],
88
+ "ERROR:REG-006:PARENT_TYPE_INVALID"
111
89
  );
112
90
 
113
- _info[nftId] = info;
114
- _nftIdByAddress[objectAddress] = nftId;
91
+ // also check that nftId and parentNFtId are on the same chain if applicable
115
92
 
116
- // add logging
93
+ // nft minting
94
+ uint256 mintedTokenId = $._chainNft.mint(
95
+ registerable.getOwner(),
96
+ EMPTY_URI
97
+ );
98
+
99
+ nftId = toNftId(mintedTokenId);
100
+
101
+ // special case services
102
+ if(registerable.getType() == SERVICE()) {
103
+ IService service = IService(objectAddress);
104
+ require(
105
+ service.supportsInterface(type(IService).interfaceId),
106
+ "ERROR:REG-007:NOT_SERVICE"
107
+ );
108
+
109
+ string memory serviceName = service.getName();
110
+ VersionPart majorVersion = service.getMajorVersion();
111
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
112
+
113
+ // service specific state
114
+ $._string[nftId] = serviceName;
115
+
116
+ require(
117
+ $._service[serviceNameHash][majorVersion] == address(0),
118
+ "ERROR:REG-008:ALREADY_REGISTERED"
119
+ );
120
+ $._service[serviceNameHash][majorVersion] = objectAddress;
121
+ }
122
+
123
+ // create object info and link nft id with it
124
+ _registerObjectInfo(registerable, nftId);
117
125
  }
118
126
 
127
+
119
128
  function registerObjectForInstance(
120
129
  NftId parentNftId,
121
130
  ObjectType objectType,
122
- address initialOwner
131
+ address initialOwner,
132
+ bytes memory data
123
133
  )
124
134
  external
125
135
  override
@@ -128,55 +138,319 @@ contract Registry is IRegistry {
128
138
  NftId nftId
129
139
  )
130
140
  {
141
+ StorageV1 storage $ = _getStorage();
142
+
131
143
  // TODO add more validation
132
144
  require(
133
145
  objectType == POLICY() || objectType == BUNDLE(),
134
- "ERROR:REG-005:TYPE_INVALID"
146
+ "ERROR:REG-010:TYPE_INVALID"
135
147
  );
136
148
 
137
- uint256 mintedTokenId = _chainNft.mint(initialOwner, EMPTY_URI);
149
+ uint256 mintedTokenId = $._chainNft.mint(initialOwner, EMPTY_URI);
138
150
  nftId = toNftId(mintedTokenId);
139
151
 
140
- RegistryInfo memory info = RegistryInfo(
152
+ ObjectInfo memory info = ObjectInfo(
141
153
  nftId,
142
154
  parentNftId,
143
155
  objectType,
144
156
  address(0),
145
- initialOwner
157
+ initialOwner,
158
+ data
146
159
  );
147
160
 
148
- _info[nftId] = info;
161
+ $._info[nftId] = info;
149
162
 
150
163
  // add logging
151
164
  }
152
165
 
166
+ // from IRegistry
153
167
  function getObjectCount() external view override returns (uint256) {
154
- return _chainNft.totalSupply();
168
+ return _getStorage()._chainNft.totalSupply();
169
+ }
170
+
171
+ function getNftId(address object) external view override returns (NftId id) {
172
+ return _getStorage()._nftIdByAddress[object];
173
+ }
174
+
175
+ function getOwner(NftId nftId) external view override returns (address) {
176
+ return _getStorage()._chainNft.ownerOf(nftId.toInt());
177
+ }
178
+
179
+ function getName(NftId nftId) external view returns (string memory name) {
180
+ return _getStorage()._string[nftId];
181
+ }
182
+
183
+ function getObjectInfo(NftId nftId) external view override returns (ObjectInfo memory info) {
184
+ return _getStorage()._info[nftId];
185
+ }
186
+
187
+ function isRegistered(NftId nftId) public view override returns (bool) {
188
+ return _getStorage()._info[nftId].objectType.gtz();
189
+ }
190
+
191
+ function isRegistered(address object) external view override returns (bool) {
192
+ return _getStorage()._nftIdByAddress[object].gtz();
193
+ }
194
+
195
+ // special case to retrive a gif service
196
+ function getServiceAddress(
197
+ string memory serviceName,
198
+ VersionPart majorVersion
199
+ ) external view override returns (address serviceAddress)
200
+ {
201
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
202
+ return _getStorage()._service[serviceNameHash][majorVersion];
203
+ }
204
+
205
+ function getProtocolOwner() external view override returns (address) {
206
+ return _getStorage()._protocolOwner;
207
+ }
208
+
209
+ function getChainNft() external view override returns (IChainNft) {
210
+ return _getStorage()._chainNft;
211
+ }
212
+
213
+ // from IERC165
214
+ function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {
215
+ return interfaceId == type(IRegistry).interfaceId;
216
+ }
217
+
218
+ // from IVersionable
219
+ function getVersion() public pure virtual override returns (Version) {
220
+ return VersionLib.toVersion(1, 0, 0);
221
+ }
222
+
223
+ // from IOwnable
224
+ function getOwner() public view override returns (address owner) {
225
+ StorageV1 storage $ = _getStorage();
226
+ return $._nftId.gtz() ? this.getOwner($._nftId) : $._initialOwner;
227
+ }
228
+
229
+ // from IRegisterable
230
+ function getRegistry() external view override returns (IRegistry registry) {
231
+ return this;
232
+ }
233
+ // TODO
234
+ // 1) Registerable can not register itself -> otherwise register have to trust owner address provided by registerable
235
+ // registerable owner MUST call register and provide registerable address
236
+ // 2) Who is msg.sender here???
237
+ function register() external pure override returns (NftId nftId) {
238
+ return zeroNftId();
239
+ }
240
+
241
+ function getType() external pure override returns (ObjectType objectType) {
242
+ return REGISTRY();
243
+ }
244
+
245
+ function getNftId() public view override returns (NftId nftId) {
246
+ return _getStorage()._nftId;
247
+ }
248
+
249
+ function getParentNftId() public view returns (NftId nftId) {
250
+ StorageV1 storage $ = _getStorage();
251
+ nftId = $._info[$._nftId].parentNftId;
252
+ }
253
+
254
+ function getData() public pure returns (bytes memory data) {
255
+ return "";
256
+ }
257
+
258
+ // registry specific functions
259
+
260
+ /// @dev defines which types are allowed to register
261
+ function _setupValidTypes() internal onlyInitializing {
262
+ StorageV1 storage $ = _getStorage();
263
+ $._isValidType[REGISTRY()] = true; // only for global registry
264
+ $._isValidType[TOKEN()] = true;
265
+ $._isValidType[SERVICE()] = true;
266
+ $._isValidType[INSTANCE()] = true;
267
+ $._isValidType[STAKE()] = true;
268
+ $._isValidType[PRODUCT()] = true;
269
+ $._isValidType[ORACLE()] = true;
270
+ $._isValidType[POOL()] = true;
271
+ $._isValidType[DISTRIBUTION()] = true;
272
+ $._isValidType[POLICY()] = true;
273
+ $._isValidType[BUNDLE()] = true;
274
+ }
275
+
276
+ /// @dev defines which types - parent type relations are allowed to register
277
+ function _setupValidParentTypes() internal onlyInitializing {
278
+ StorageV1 storage $ = _getStorage();
279
+ // registry as parent
280
+ $._isValidParentType[TOKEN()][REGISTRY()] = true;
281
+ $._isValidParentType[SERVICE()][REGISTRY()] = true;
282
+ $._isValidParentType[INSTANCE()][REGISTRY()] = true;
283
+
284
+ // instance as parent
285
+ $._isValidParentType[PRODUCT()][INSTANCE()] = true;
286
+ $._isValidParentType[DISTRIBUTION()][INSTANCE()] = true;
287
+ $._isValidParentType[ORACLE()][INSTANCE()] = true;
288
+ $._isValidParentType[POOL()][INSTANCE()] = true;
289
+
290
+ // product as parent
291
+ $._isValidParentType[POLICY()][PRODUCT()] = true;
292
+
293
+ // pool as parent
294
+ $._isValidParentType[BUNDLE()][POOL()] = true;
295
+ $._isValidParentType[STAKE()][POOL()] = true;
296
+ }
297
+
298
+ /// @dev protocol registration used to anchor the dip ecosystem relations
299
+ function _registerProtocol()
300
+ internal
301
+ onlyInitializing
302
+ virtual // TODO virtual?
303
+ {
304
+ StorageV1 storage $ = _getStorage();
305
+
306
+ uint256 protocolId = $._chainNftInternal.PROTOCOL_NFT_ID();
307
+ $._chainNftInternal.mint($._protocolOwner, protocolId);
308
+
309
+ NftId protocolNftid = toNftId(protocolId);
310
+ ObjectInfo memory protocolInfo = ObjectInfo(
311
+ protocolNftid,
312
+ zeroNftId(), // parent nft id
313
+ PROTOCOL(),
314
+ address(0), // contract address
315
+ $._protocolOwner,
316
+ "" // data
317
+ );
318
+
319
+ $._info[protocolNftid] = protocolInfo;
155
320
  }
156
321
 
157
- function getNftId(
158
- address object
159
- ) external view override returns (NftId id) {
160
- return _nftIdByAddress[object];
322
+ /// @dev registry registration
323
+ /// might also register the global registry when not on mainnet
324
+ function _registerRegistry()
325
+ internal
326
+ onlyInitializing
327
+ virtual
328
+ returns (NftId registryNftId)
329
+ {
330
+ StorageV1 storage $ = _getStorage();
331
+
332
+ uint256 registryId = $._chainNftInternal.calculateTokenId(2);
333
+ registryNftId = toNftId(registryId);
334
+
335
+ // we're not the global registry
336
+ if(registryId != $._chainNftInternal.GLOBAL_REGISTRY_ID()) {
337
+ _registerGlobalRegistry();
338
+ }
339
+
340
+ $._chainNftInternal.mint($._protocolOwner, registryId);
341
+
342
+ NftId parentNftId;
343
+ // we're the global registry
344
+ if(block.chainid == 1) {
345
+ parentNftId = toNftId($._chainNftInternal.PROTOCOL_NFT_ID());
346
+ }
347
+ else {
348
+ parentNftId = toNftId($._chainNftInternal.GLOBAL_REGISTRY_ID());
349
+ }
350
+
351
+ ObjectInfo memory registryInfo = ObjectInfo(
352
+ registryNftId,
353
+ parentNftId,
354
+ REGISTRY(),
355
+ address(this), // proxy address
356
+ $._protocolOwner, // registry owner is different from proxy owner
357
+ ""
358
+ );
359
+
360
+ $._info[registryNftId] = registryInfo;
361
+ $._nftIdByAddress[address(this)] = registryNftId;
362
+
363
+ // add logging
161
364
  }
162
365
 
163
- function isRegistered(
164
- address object
165
- ) external view override returns (bool) {
166
- return _nftIdByAddress[object].gtz();
366
+
367
+ /// @dev global registry registration for non mainnet registries
368
+ function _registerGlobalRegistry()
369
+ internal
370
+ onlyInitializing
371
+ virtual
372
+ {
373
+ StorageV1 storage $ = _getStorage();
374
+
375
+ uint256 globalRegistryId = $._chainNftInternal.GLOBAL_REGISTRY_ID();
376
+ $._chainNftInternal.mint($._protocolOwner, globalRegistryId);
377
+
378
+ NftId globalRegistryNftId = toNftId(globalRegistryId);
379
+ ObjectInfo memory globalRegistryInfo = ObjectInfo(
380
+ globalRegistryNftId,
381
+ toNftId($._chainNftInternal.PROTOCOL_NFT_ID()),
382
+ REGISTRY(),
383
+ address(0), // contract address
384
+ $._protocolOwner,
385
+ "" // data
386
+ );
387
+
388
+ $._info[globalRegistryNftId] = globalRegistryInfo;
167
389
  }
168
390
 
169
- function getInfo(
391
+ function _registerObjectInfo(
392
+ IRegisterable registerable,
170
393
  NftId nftId
171
- ) external view override returns (RegistryInfo memory info) {
172
- return _info[nftId];
394
+ )
395
+ internal
396
+ virtual
397
+ {
398
+ address objectAddress = address(registerable);
399
+ ObjectInfo memory info = ObjectInfo(
400
+ nftId,
401
+ registerable.getParentNftId(),
402
+ registerable.getType(),
403
+ objectAddress,
404
+ registerable.getOwner(),
405
+ registerable.getData()
406
+ );
407
+
408
+ StorageV1 storage $ = _getStorage();
409
+ $._info[nftId] = info;
410
+ $._nftIdByAddress[objectAddress] = nftId;
411
+
412
+ // add logging
173
413
  }
174
414
 
175
- function getOwner(NftId nftId) external view override returns (address) {
176
- return _chainNft.ownerOf(nftId.toInt());
415
+ // TODO check how usage of "$.data" influences gas costs
416
+ // IMPORTANT Every new version must implement this function
417
+ // keep it private -> if unreachable from the next version then not included in its byte code
418
+ // each version MUST use the same REGISTRY_LOCATION_V1, just change return type
419
+ function _getStorage() private pure returns (StorageV1 storage $) {
420
+ assembly {
421
+ $.slot := REGISTRY_LOCATION_V1
422
+ }
177
423
  }
178
424
 
179
- function getNftAddress() external view override returns (address nft) {
180
- return address(_chainNft);
425
+ // from Versionable
426
+
427
+ /// @dev the protocol owner will get ownership of the
428
+ // protocol nft and the global registry nft minted in this
429
+ // initializer function
430
+ function _initialize(bytes memory data)
431
+ internal
432
+ onlyInitializing
433
+ virtual override
434
+ {
435
+ address protocolOwner = abi.decode(data, (address));
436
+ StorageV1 storage $ = _getStorage();
437
+
438
+ // TODO here delegate call from proxy constructor, msg.sender is proxy deployer -> Proxy.sol
439
+ $._initialOwner = msg.sender;
440
+ $._protocolOwner = protocolOwner;
441
+
442
+ // TODO deployment size is too big, call another contract which keeps and deploys ChainNft byte code
443
+ // deploy NFT
444
+ $._chainNftInternal = new ChainNft(address(this));// adds 10kb to deployment size
445
+ $._chainNft = IChainNft($._chainNftInternal);
446
+
447
+ // initial registry setup
448
+ _registerProtocol();
449
+ $._nftId = _registerRegistry();
450
+
451
+ // setup rules for further registrations
452
+ _setupValidTypes();
453
+ _setupValidParentTypes();
181
454
  }
182
- }
455
+
456
+ }
@@ -0,0 +1,21 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
5
+
6
+ contract ERC165 is IERC165 {
7
+ mapping(bytes4 => bool) private _isSupported;
8
+
9
+ constructor() {
10
+ // register support for ERC165
11
+ _registerInterface(type(IERC165).interfaceId);
12
+ }
13
+
14
+ function supportsInterface(bytes4 interfaceId) external view override returns (bool) {
15
+ return _isSupported[interfaceId];
16
+ }
17
+
18
+ function _registerInterface(bytes4 interfaceId) internal {
19
+ _isSupported[interfaceId] = true;
20
+ }
21
+ }
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ interface IOwnable {
5
+ function getOwner() external view returns (address owner);
6
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
5
+
6
+ import {IRegistry} from "../registry/IRegistry.sol";
7
+ import {NftId} from "../types/NftId.sol";
8
+ import {ObjectType} from "../types/ObjectType.sol";
9
+
10
+ import {IOwnable} from "./IOwnable.sol";
11
+
12
+ interface IRegisterable is IERC165, IOwnable {
13
+ function getRegistry() external view returns (IRegistry registry);
14
+
15
+ function register() external returns (NftId nftId);
16
+
17
+ function getType() external pure returns (ObjectType objectType);
18
+
19
+ function getNftId() external view returns (NftId nftId);
20
+
21
+ function getParentNftId() external view returns (NftId nftId);
22
+
23
+ function getData() external view returns (bytes memory data);
24
+ }