@etherisc/gif-next 0.0.2-a7e19c7 → 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 (373) hide show
  1. package/README.md +178 -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} +48 -53
  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/components/{IPool.sol/IPoolComponent.json → IBaseComponent.sol/IBaseComponent.json} +48 -53
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +340 -0
  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 +405 -40
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +258 -45
  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 +1403 -247
  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 +1769 -383
  52. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +4 -0
  53. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +364 -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} +152 -138
  62. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +4 -0
  63. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.json +440 -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 +364 -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 +57 -62
  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 +50 -68
  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 +511 -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 +511 -0
  122. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +4 -0
  123. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +595 -0
  124. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  125. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +484 -0
  126. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +4 -0
  127. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +405 -0
  128. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +4 -0
  129. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +366 -0
  130. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +4 -0
  131. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +481 -0
  132. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +4 -0
  133. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +671 -0
  134. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  135. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +607 -0
  136. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  137. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +922 -0
  138. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  139. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +65 -2
  140. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  141. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  142. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +98 -85
  143. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +4 -0
  144. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.json +24 -0
  145. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  146. package/artifacts/contracts/registry/Registry.sol/Registry.json +436 -59
  147. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +4 -0
  148. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +35 -0
  149. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +4 -0
  150. package/artifacts/contracts/{registry/IRegistry.sol → shared/IOwnable.sol}/IOwnable.json +1 -1
  151. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +4 -0
  152. package/artifacts/contracts/{registry/IRegistry.sol → shared/IRegisterable.sol}/IRegisterable.json +18 -63
  153. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +4 -0
  154. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +205 -0
  155. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.dbg.json +4 -0
  156. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.json +248 -0
  157. package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.dbg.json +4 -0
  158. package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.json +129 -0
  159. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +4 -0
  160. package/artifacts/contracts/{registry/Registry.sol → shared/Registerable.sol}/Registerable.json +18 -63
  161. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +4 -0
  162. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +228 -0
  163. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +4 -0
  164. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +405 -0
  165. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +4 -0
  166. package/artifacts/contracts/test/TestFee.sol/TestFee.json +119 -0
  167. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +4 -0
  168. package/artifacts/contracts/test/TestPool.sol/TestPool.json +578 -0
  169. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +4 -0
  170. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +575 -0
  171. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +4 -0
  172. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +137 -0
  173. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +4 -0
  174. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +116 -0
  175. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +4 -0
  176. package/artifacts/contracts/test/TestService.sol/TestService.json +443 -0
  177. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +4 -0
  178. package/artifacts/contracts/test/TestToken.sol/TestUsdc.json +338 -0
  179. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +4 -0
  180. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +218 -0
  181. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +4 -0
  182. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +270 -0
  183. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +4 -0
  184. package/artifacts/contracts/test/Usdc.sol/USDC.json +338 -0
  185. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +4 -0
  186. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.json +10 -0
  187. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  188. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
  189. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  190. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +2 -2
  191. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +4 -0
  192. package/artifacts/contracts/types/Fee.sol/FeeLib.json +257 -0
  193. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +4 -0
  194. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +111 -0
  195. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  196. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +65 -4
  197. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +4 -0
  198. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +10 -0
  199. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +4 -0
  200. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +92 -0
  201. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +4 -0
  202. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.json +99 -0
  203. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +4 -0
  204. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +86 -0
  205. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +4 -0
  206. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +30 -0
  207. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +4 -0
  208. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +92 -0
  209. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  210. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +64 -2
  211. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  212. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +98 -59
  213. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +4 -0
  214. package/artifacts/contracts/types/Version.sol/VersionLib.json +177 -0
  215. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +4 -0
  216. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +30 -0
  217. package/contracts/components/BaseComponent.sol +94 -0
  218. package/contracts/components/Distribution.sol +132 -0
  219. package/contracts/components/IBaseComponent.sol +19 -0
  220. package/contracts/components/IDistributionComponent.sol +47 -0
  221. package/contracts/components/IPoolComponent.sol +71 -0
  222. package/contracts/components/IProductComponent.sol +38 -0
  223. package/contracts/components/Pool.sol +222 -16
  224. package/contracts/components/Product.sol +193 -32
  225. package/contracts/experiment/errors/Require.sol +10 -5
  226. package/contracts/experiment/errors/Revert.sol +13 -8
  227. package/contracts/experiment/inheritance/A.sol +8 -11
  228. package/contracts/experiment/inheritance/B.sol +10 -5
  229. package/contracts/experiment/inheritance/C.sol +11 -5
  230. package/contracts/experiment/inheritance/IA.sol +2 -7
  231. package/contracts/experiment/inheritance/IB.sol +3 -2
  232. package/contracts/experiment/inheritance/IC.sol +4 -3
  233. package/contracts/experiment/statemachine/Dummy.sol +27 -0
  234. package/contracts/experiment/statemachine/ISM.sol +25 -0
  235. package/contracts/experiment/statemachine/README.md +112 -0
  236. package/contracts/experiment/statemachine/SM.sol +57 -0
  237. package/contracts/experiment/statemachine/SimpleStateMachine.sol +31 -0
  238. package/contracts/experiment/types/TypeA.sol +14 -9
  239. package/contracts/experiment/types/TypeB.sol +14 -9
  240. package/contracts/instance/IInstance.sol +41 -8
  241. package/contracts/instance/IInstanceLinked.sol +8 -0
  242. package/contracts/instance/Instance.sol +54 -44
  243. package/contracts/instance/base/ComponentServiceBase.sol +42 -0
  244. package/contracts/instance/base/IInstanceBase.sol +22 -0
  245. package/contracts/instance/base/IKeyValueStore.sol +50 -0
  246. package/contracts/instance/base/ILifecycle.sol +30 -0
  247. package/contracts/instance/base/IService.sol +15 -0
  248. package/contracts/instance/base/InstanceBase.sol +91 -0
  249. package/contracts/instance/base/KeyValueStore.sol +161 -0
  250. package/contracts/instance/base/Lifecycle.sol +100 -0
  251. package/contracts/instance/base/ModuleBase.sol +57 -0
  252. package/contracts/instance/base/ServiceBase.sol +37 -0
  253. package/contracts/instance/module/access/Access.sol +149 -0
  254. package/contracts/instance/module/access/IAccess.sol +53 -0
  255. package/contracts/instance/module/bundle/BundleModule.sol +134 -0
  256. package/contracts/instance/module/bundle/IBundle.sol +53 -0
  257. package/contracts/instance/module/component/ComponentModule.sol +70 -0
  258. package/contracts/instance/module/component/IComponent.sol +28 -0
  259. package/contracts/instance/module/distribution/DistributionModule.sol +17 -0
  260. package/contracts/instance/module/distribution/IDistribution.sol +10 -0
  261. package/contracts/instance/module/policy/IPolicy.sol +63 -0
  262. package/contracts/instance/module/policy/PolicyModule.sol +91 -0
  263. package/contracts/instance/module/pool/IPoolModule.sol +40 -0
  264. package/contracts/instance/module/pool/PoolModule.sol +90 -0
  265. package/contracts/instance/module/risk/IRisk.sol +26 -0
  266. package/contracts/instance/module/risk/RiskModule.sol +62 -0
  267. package/contracts/instance/module/treasury/ITreasury.sol +82 -0
  268. package/contracts/instance/module/treasury/TokenHandler.sol +48 -0
  269. package/contracts/instance/module/treasury/TreasuryModule.sol +138 -0
  270. package/contracts/instance/service/ComponentOwnerService.sol +157 -0
  271. package/contracts/instance/service/DistributionService.sol +59 -0
  272. package/contracts/instance/service/IComponentOwnerService.sol +22 -0
  273. package/contracts/instance/service/IDistributionService.sol +12 -0
  274. package/contracts/instance/service/IPoolService.sol +37 -0
  275. package/contracts/instance/service/IProductService.sol +107 -0
  276. package/contracts/instance/service/PoolService.sol +149 -0
  277. package/contracts/instance/service/ProductService.sol +509 -0
  278. package/contracts/registry/ChainNft.sol +80 -94
  279. package/contracts/registry/IChainNft.sol +10 -7
  280. package/contracts/registry/IRegistry.sol +35 -51
  281. package/contracts/registry/IRegistryLinked.sol +8 -0
  282. package/contracts/registry/Registry.sol +394 -120
  283. package/contracts/shared/ERC165.sol +21 -0
  284. package/contracts/shared/IOwnable.sol +6 -0
  285. package/contracts/shared/IRegisterable.sol +24 -0
  286. package/contracts/shared/IVersionable.sol +94 -0
  287. package/contracts/shared/Proxy.sol +94 -0
  288. package/contracts/shared/Registerable.sol +86 -0
  289. package/contracts/shared/Versionable.sol +145 -0
  290. package/contracts/test/TestDistribution.sol +21 -0
  291. package/contracts/test/TestFee.sol +25 -0
  292. package/contracts/test/TestPool.sol +25 -0
  293. package/contracts/test/TestProduct.sol +72 -0
  294. package/contracts/test/TestRegisterable.sol +19 -0
  295. package/contracts/test/TestRoleId.sol +14 -0
  296. package/contracts/test/TestService.sol +32 -0
  297. package/contracts/test/TestToken.sol +26 -0
  298. package/contracts/test/TestVersion.sol +44 -0
  299. package/contracts/test/TestVersionable.sol +17 -0
  300. package/contracts/test/Usdc.sol +26 -0
  301. package/contracts/types/AddressSet.sol +58 -0
  302. package/contracts/types/Blocknumber.sol +76 -18
  303. package/contracts/types/ChainId.sol +18 -10
  304. package/contracts/types/Fee.sol +56 -0
  305. package/contracts/types/Key32.sol +45 -0
  306. package/contracts/types/NftId.sol +48 -11
  307. package/contracts/types/NftIdSet.sol +60 -0
  308. package/contracts/types/ObjectType.sol +131 -0
  309. package/contracts/types/ReferralId.sol +48 -0
  310. package/contracts/types/RiskId.sol +43 -0
  311. package/contracts/types/RoleId.sol +38 -0
  312. package/contracts/types/StateId.sol +101 -0
  313. package/contracts/types/Timestamp.sol +85 -17
  314. package/contracts/types/UFixed.sol +78 -76
  315. package/contracts/types/Version.sol +103 -0
  316. package/package.json +19 -5
  317. package/artifacts/contracts/components/Component.sol/Component.dbg.json +0 -4
  318. package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +0 -4
  319. package/artifacts/contracts/components/Component.sol/InstanceLinked.json +0 -35
  320. package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +0 -4
  321. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +0 -4
  322. package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +0 -192
  323. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +0 -4
  324. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +0 -4
  325. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +0 -4
  326. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +0 -35
  327. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +0 -4
  328. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +0 -50
  329. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +0 -4
  330. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +0 -4
  331. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +0 -4
  332. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +0 -147
  333. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +0 -4
  334. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +0 -4
  335. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +0 -179
  336. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +0 -4
  337. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +0 -245
  338. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +0 -4
  339. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +0 -94
  340. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +0 -4
  341. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +0 -4
  342. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +0 -4
  343. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +0 -4
  344. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +0 -4
  345. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +0 -4
  346. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +0 -4
  347. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +0 -4
  348. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +0 -75
  349. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +0 -4
  350. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +0 -4
  351. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +0 -75
  352. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +0 -4
  353. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +0 -167
  354. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +0 -4
  355. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +0 -4
  356. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +0 -4
  357. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +0 -49
  358. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +0 -4
  359. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +0 -4
  360. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +0 -60
  361. package/contracts/components/Component.sol +0 -62
  362. package/contracts/components/IPool.sol +0 -9
  363. package/contracts/components/IProduct.sol +0 -12
  364. package/contracts/instance/access/Access.sol +0 -218
  365. package/contracts/instance/access/IAccess.sol +0 -83
  366. package/contracts/instance/component/ComponentModule.sol +0 -248
  367. package/contracts/instance/component/IComponent.sol +0 -95
  368. package/contracts/instance/policy/IPolicy.sol +0 -66
  369. package/contracts/instance/policy/PolicyModule.sol +0 -107
  370. package/contracts/instance/pool/IPoolModule.sol +0 -41
  371. package/contracts/instance/pool/PoolModule.sol +0 -86
  372. package/contracts/instance/product/IProductService.sol +0 -46
  373. package/contracts/instance/product/ProductService.sol +0 -108
@@ -1,182 +1,456 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
- import {IChainNft} from "./IChainNft.sol";
5
- import {IRegistry, IRegistryLinked, IRegisterable} from "./IRegistry.sol";
6
- import {NftId, toNftId} from "../types/NftId.sol";
7
- import {NftIdLib} from "../types/NftId.sol";
8
-
9
- contract RegistryLinked is IRegistryLinked {
10
-
11
- IRegistry internal _registry;
12
-
13
- constructor(address registry) {
14
- _registry = IRegistry(registry);
15
- }
4
+ import {IRegisterable} from "../shared/IRegisterable.sol";
5
+ import {IService} from "../instance/base/IService.sol";
16
6
 
17
- function getRegistry() external view override returns(IRegistry registry) {
18
- return _registry;
19
- }
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";
20
13
 
21
- }
14
+ import {Versionable} from "../shared/Versionable.sol";
22
15
 
23
16
 
24
- abstract contract Registerable is
25
- RegistryLinked,
26
- IRegisterable
17
+ contract Registry is
18
+ Versionable,
19
+ IRegisterable,
20
+ IRegistry
27
21
  {
28
22
  using NftIdLib for NftId;
29
23
 
30
- address private _initialOwner;
31
-
32
- constructor(address registry)
33
- RegistryLinked(registry)
34
- {
35
- _initialOwner = msg.sender;
36
- }
37
-
38
- // getType, getData and register need to be implemented by concrete contract
39
-
40
- function isRegisterable() external pure override returns(bool) {
41
- return true;
42
- }
43
-
44
- function getInitialOwner() public view override returns(address deployer) {
45
- return _initialOwner;
46
- }
47
-
48
- function isRegistered() public view override returns(bool) {
49
- NftId nftId = _registry.getNftId(address(this));
50
- return nftId.gtz();
51
- }
52
-
53
- function getNftId() public view override returns(NftId nftId) {
54
- return _registry.getNftId(address(this));
55
- }
24
+ string public constant EMPTY_URI = "";
56
25
 
57
- function getOwner() public view override returns(address owner) {
58
- NftId id = _registry.getNftId(address(this));
59
- owner = _registry.getOwner(id);
60
- return owner != address(0) ? owner : _initialOwner;
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
61
53
  }
62
54
 
63
- }
55
+ function register(
56
+ address objectAddress
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();
64
62
 
65
- contract Registry is IRegistry {
66
- using NftIdLib for NftId;
67
- string public constant EMPTY_URI = "";
63
+ require(
64
+ $._nftIdByAddress[objectAddress].eqz(),
65
+ "ERROR:REG-002:ALREADY_REGISTERED"
66
+ );
68
67
 
69
- mapping(NftId nftId => RegistryInfo info) private _info;
70
- mapping(NftId nftId => address owner) private _owner;
71
- mapping(address object => NftId nftId) private _nftIdByAddress;
68
+ IRegisterable registerable = IRegisterable(objectAddress);
69
+ require(
70
+ registerable.supportsInterface(type(IRegisterable).interfaceId),
71
+ "ERROR:REG-003:NOT_REGISTERABLE"
72
+ );
72
73
 
73
- IChainNft private _chainNft;
74
+ ObjectType objectType = registerable.getType();
75
+ require(
76
+ $._isValidType[objectType],
77
+ "ERROR:REG-004:TYPE_INVALID"
78
+ );
74
79
 
75
- function initialize(address chainNft) external {
76
- require(address(_chainNft) == address(0), "ERROR:REG-001:ALREADY_INITIALIZED");
77
- _chainNft = IChainNft(chainNft);
78
- }
80
+ NftId parentNftId = registerable.getParentNftId();
81
+ require(
82
+ isRegistered(parentNftId),
83
+ "ERROR:REG-005:PARENT_NOT_REGISTERED"
84
+ );
79
85
 
80
- function TOKEN() public pure override returns(uint256) { return 30; }
81
- function INSTANCE() public pure override returns(uint256) { return 40; }
82
- function PRODUCT() public pure override returns(uint256) { return 50; }
83
- function ORACLE() public pure override returns(uint256) { return 60; }
84
- function POOL() public pure override returns(uint256) { return 70; }
85
- function POLICY() public pure override returns(uint256) { return 80; }
86
- function BUNDLE() public pure override returns(uint256) { return 90; }
86
+ require(
87
+ $._isValidParentType[objectType][$._info[parentNftId].objectType],
88
+ "ERROR:REG-006:PARENT_TYPE_INVALID"
89
+ );
87
90
 
88
- function register(address objectAddress) external override returns(NftId nftId) {
89
- require(_nftIdByAddress[objectAddress].eqz(), "ERROR:REG-002:ALREADY_REGISTERED");
91
+ // also check that nftId and parentNFtId are on the same chain if applicable
90
92
 
91
- IRegisterable registerable = IRegisterable(objectAddress);
92
- require(registerable.isRegisterable(), "ERROR:REG-003:NOT_REGISTERABLE");
93
-
94
- // check parent exists (for objects not instances)
95
- if(registerable.getType() != INSTANCE()) {
96
- RegistryInfo memory parentInfo = _info[registerable.getParentNftId()];
97
- require(parentInfo.nftId.gtz(), "ERROR:REG-004:PARENT_NOT_FOUND");
98
- // check validity of parent relation, valid relations are
99
- // policy -> product, bundle -> pool, product -> instance, pool -> instance
100
- }
93
+ // nft minting
94
+ uint256 mintedTokenId = $._chainNft.mint(
95
+ registerable.getOwner(),
96
+ EMPTY_URI
97
+ );
101
98
 
102
- uint256 mintedTokenId = _chainNft.mint(
103
- registerable.getInitialOwner(),
104
- EMPTY_URI);
105
99
  nftId = toNftId(mintedTokenId);
106
-
107
- RegistryInfo memory info = RegistryInfo(
108
- nftId,
109
- registerable.getParentNftId(),
110
- registerable.getType(),
111
- objectAddress,
112
- registerable.getInitialOwner()
113
- );
114
100
 
115
- _info[nftId] = info;
116
- _nftIdByAddress[objectAddress] = nftId;
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
+ }
117
122
 
118
- // add logging
123
+ // create object info and link nft id with it
124
+ _registerObjectInfo(registerable, nftId);
119
125
  }
120
126
 
121
127
 
122
128
  function registerObjectForInstance(
123
129
  NftId parentNftId,
124
- uint256 objectType,
125
- address initialOwner
130
+ ObjectType objectType,
131
+ address initialOwner,
132
+ bytes memory data
126
133
  )
127
- external
134
+ external
128
135
  override
129
- // TODO add onlyRegisteredInstance
130
- returns(NftId nftId)
136
+ returns (
137
+ // TODO add onlyRegisteredInstance
138
+ NftId nftId
139
+ )
131
140
  {
141
+ StorageV1 storage $ = _getStorage();
142
+
132
143
  // TODO add more validation
133
144
  require(
134
145
  objectType == POLICY() || objectType == BUNDLE(),
135
- "ERROR:REG-005:TYPE_INVALID");
146
+ "ERROR:REG-010:TYPE_INVALID"
147
+ );
136
148
 
137
- uint256 mintedTokenId = _chainNft.mint(
138
- initialOwner,
139
- EMPTY_URI);
149
+ uint256 mintedTokenId = $._chainNft.mint(initialOwner, EMPTY_URI);
140
150
  nftId = toNftId(mintedTokenId);
141
151
 
142
- RegistryInfo memory info = RegistryInfo(
152
+ ObjectInfo memory info = ObjectInfo(
143
153
  nftId,
144
154
  parentNftId,
145
155
  objectType,
146
156
  address(0),
147
- initialOwner
157
+ initialOwner,
158
+ data
148
159
  );
149
160
 
150
- _info[nftId] = info;
161
+ $._info[nftId] = info;
151
162
 
152
163
  // add logging
153
164
  }
154
165
 
166
+ // from IRegistry
167
+ function getObjectCount() external view override returns (uint256) {
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
+ );
155
318
 
156
- function getObjectCount() external view override returns(uint256) {
157
- return _chainNft.totalSupply();
319
+ $._info[protocolNftid] = protocolInfo;
158
320
  }
159
321
 
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);
160
334
 
161
- function getNftId(address object) external view override returns(NftId id) {
162
- return _nftIdByAddress[object];
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
163
364
  }
164
365
 
165
366
 
166
- function isRegistered(address object) external view override returns(bool) {
167
- return _nftIdByAddress[object].gtz();
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;
168
389
  }
169
390
 
391
+ function _registerObjectInfo(
392
+ IRegisterable registerable,
393
+ NftId 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;
170
411
 
171
- function getInfo(NftId nftId) external view override returns(RegistryInfo memory info) {
172
- return _info[nftId];
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
+ }