@etherisc/gif-next 0.0.2-f99f1d2-109 → 0.0.2-fc8b370-882

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 (335) hide show
  1. package/README.md +90 -7
  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/IBaseComponent.sol/IBaseComponent.dbg.json +4 -0
  5. package/artifacts/contracts/{instance/component/IComponent.sol/IComponentContract.json → components/IBaseComponent.sol/IBaseComponent.json} +26 -57
  6. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +4 -0
  7. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +356 -0
  8. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/{IPool.sol/IPoolComponent.json → IProductComponent.sol/IProductComponent.json} +89 -65
  10. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  11. package/artifacts/contracts/components/Pool.sol/Pool.json +134 -75
  12. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  13. package/artifacts/contracts/components/Product.sol/Product.json +72 -113
  14. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  15. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +2 -2
  16. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +2 -2
  18. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +2 -2
  20. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +2 -2
  22. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +2 -2
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +2 -2
  34. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  35. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
  36. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  37. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +2 -2
  38. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  39. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +2 -2
  40. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  41. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +719 -332
  42. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +4 -0
  43. package/artifacts/contracts/instance/{component/IComponent.sol → IInstanceLinked.sol}/IInstanceLinked.json +1 -1
  44. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  45. package/artifacts/contracts/instance/Instance.sol/Instance.json +998 -527
  46. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +4 -0
  47. package/artifacts/contracts/instance/{component/ComponentModule.sol/ComponentModule.json → base/ComponentServiceBase.sol/ComponentServiceBase.json} +133 -132
  48. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
  49. package/artifacts/contracts/instance/{product/ProductService.sol/ProductModule.json → base/IInstanceBase.sol/IInstanceBase.json} +18 -30
  50. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +4 -0
  51. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.json +511 -0
  52. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +4 -0
  53. package/artifacts/contracts/instance/{lifecycle/ILifecycle.sol/ILifecycleModule.json → base/ILifecycle.sol/ILifecycle.json} +10 -77
  54. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +4 -0
  55. package/artifacts/contracts/instance/base/IService.sol/IService.json +300 -0
  56. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +4 -0
  57. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.json +326 -0
  58. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +4 -0
  59. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +692 -0
  60. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +4 -0
  61. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +169 -0
  62. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +4 -0
  63. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.json +10 -0
  64. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +4 -0
  65. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.json +300 -0
  66. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +4 -0
  67. package/artifacts/contracts/instance/{access → module/access}/Access.sol/AccessModule.json +85 -152
  68. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +4 -0
  69. package/artifacts/contracts/instance/{access → module/access}/IAccess.sol/IAccess.json +1 -1
  70. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +4 -0
  71. package/artifacts/contracts/instance/{access → module/access}/IAccess.sol/IAccessModule.json +96 -99
  72. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +4 -0
  73. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.json +296 -0
  74. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +4 -0
  75. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.json +10 -0
  76. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +4 -0
  77. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.json +296 -0
  78. package/artifacts/contracts/instance/module/compensation/CompensationModule.sol/CompensationModule.dbg.json +4 -0
  79. package/artifacts/contracts/instance/module/compensation/CompensationModule.sol/CompensationModule.json +10 -0
  80. package/artifacts/contracts/instance/module/compensation/ICompensation.sol/ICompensation.dbg.json +4 -0
  81. package/artifacts/contracts/instance/module/compensation/ICompensation.sol/ICompensation.json +10 -0
  82. package/artifacts/contracts/instance/module/compensation/ICompensation.sol/ICompensationModule.dbg.json +4 -0
  83. package/artifacts/contracts/instance/module/compensation/ICompensation.sol/ICompensationModule.json +10 -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 +188 -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/{component → module/component}/IComponent.sol/IComponentModule.json +33 -62
  90. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  91. package/artifacts/contracts/instance/{policy → module/policy}/IPolicy.sol/IPolicy.json +1 -1
  92. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  93. package/artifacts/contracts/instance/{policy → module/policy}/IPolicy.sol/IPolicyModule.json +132 -125
  94. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  95. package/artifacts/contracts/instance/{policy → module/policy}/PolicyModule.sol/PolicyModule.json +132 -125
  96. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  97. package/artifacts/contracts/instance/{pool → module/pool}/IPoolModule.sol/IPool.json +1 -1
  98. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  99. package/artifacts/contracts/instance/{pool → module/pool}/IPoolModule.sol/IPoolModule.json +67 -47
  100. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  101. package/artifacts/contracts/instance/{pool → module/pool}/PoolModule.sol/PoolModule.json +51 -57
  102. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +4 -0
  103. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.json +10 -0
  104. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +4 -0
  105. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.json +10 -0
  106. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +4 -0
  107. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +10 -0
  108. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +4 -0
  109. package/artifacts/contracts/instance/{treasury → module/treasury}/ITreasury.sol/ITreasury.json +1 -1
  110. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +4 -0
  111. package/artifacts/contracts/instance/{treasury → module/treasury}/ITreasury.sol/ITreasuryModule.json +100 -57
  112. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +4 -0
  113. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +76 -0
  114. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +4 -0
  115. package/artifacts/contracts/instance/{treasury → module/treasury}/TreasuryModule.sol/TreasuryModule.json +100 -57
  116. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +4 -0
  117. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +523 -0
  118. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +4 -0
  119. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +364 -0
  120. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +4 -0
  121. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +376 -0
  122. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +4 -0
  123. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +477 -0
  124. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  125. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +471 -0
  126. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  127. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +673 -0
  128. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  129. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +65 -2
  130. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  131. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  132. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +147 -30
  133. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +4 -0
  134. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.json +24 -0
  135. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  136. package/artifacts/contracts/registry/Registry.sol/Registry.json +241 -25
  137. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +4 -0
  138. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +35 -0
  139. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +4 -0
  140. package/artifacts/contracts/{registry/IRegistry.sol → shared/IOwnable.sol}/IOwnable.json +1 -1
  141. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +4 -0
  142. package/artifacts/contracts/{registry/IRegistry.sol → shared/IRegisterable.sol}/IRegisterable.json +16 -61
  143. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +4 -0
  144. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +164 -0
  145. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +4 -0
  146. package/artifacts/contracts/{registry/Registry.sol → shared/Registerable.sol}/Registerable.json +16 -61
  147. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +4 -0
  148. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +164 -0
  149. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +4 -0
  150. package/artifacts/contracts/test/TestFee.sol/TestFee.json +119 -0
  151. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +4 -0
  152. package/artifacts/contracts/test/TestPool.sol/TestPool.json +387 -0
  153. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +4 -0
  154. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +393 -0
  155. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +4 -0
  156. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +137 -0
  157. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +4 -0
  158. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +116 -0
  159. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +4 -0
  160. package/artifacts/contracts/test/TestService.sol/TestService.json +379 -0
  161. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +4 -0
  162. package/artifacts/contracts/test/TestToken.sol/TestUsdc.json +338 -0
  163. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +4 -0
  164. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +218 -0
  165. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +4 -0
  166. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +206 -0
  167. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +4 -0
  168. package/artifacts/contracts/test/Usdc.sol/USDC.json +338 -0
  169. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +4 -0
  170. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.json +10 -0
  171. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  172. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
  173. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  174. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +2 -2
  175. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +4 -0
  176. package/artifacts/contracts/types/Fee.sol/FeeLib.json +218 -0
  177. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +4 -0
  178. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +111 -0
  179. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  180. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +65 -4
  181. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +4 -0
  182. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +10 -0
  183. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  184. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
  185. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +4 -0
  186. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +30 -0
  187. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  188. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  189. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  190. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +64 -2
  191. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  192. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +88 -62
  193. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +4 -0
  194. package/artifacts/contracts/types/Version.sol/VersionLib.json +139 -0
  195. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +4 -0
  196. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +30 -0
  197. package/contracts/components/BaseComponent.sol +88 -0
  198. package/contracts/components/IBaseComponent.sol +19 -0
  199. package/contracts/components/IPoolComponent.sol +57 -0
  200. package/contracts/components/{IProduct.sol → IProductComponent.sol} +9 -6
  201. package/contracts/components/Pool.sol +140 -18
  202. package/contracts/components/Product.sol +53 -25
  203. package/contracts/instance/IInstance.sol +38 -11
  204. package/contracts/instance/IInstanceLinked.sol +8 -0
  205. package/contracts/instance/Instance.sol +44 -48
  206. package/contracts/instance/base/ComponentServiceBase.sol +42 -0
  207. package/contracts/instance/base/IInstanceBase.sol +14 -0
  208. package/contracts/instance/base/IKeyValueStore.sol +49 -0
  209. package/contracts/instance/{lifecycle → base}/ILifecycle.sol +4 -21
  210. package/contracts/instance/base/IService.sol +15 -0
  211. package/contracts/instance/base/InstanceBase.sol +80 -0
  212. package/contracts/instance/base/KeyValueStore.sol +156 -0
  213. package/contracts/instance/{lifecycle/LifecycleModule.sol → base/Lifecycle.sol} +36 -29
  214. package/contracts/instance/base/ModuleBase.sol +52 -0
  215. package/contracts/instance/base/ServiceBase.sol +37 -0
  216. package/contracts/instance/module/access/Access.sol +149 -0
  217. package/contracts/instance/module/access/IAccess.sol +53 -0
  218. package/contracts/instance/module/bundle/BundleModule.sol +136 -0
  219. package/contracts/instance/module/bundle/IBundle.sol +58 -0
  220. package/contracts/instance/module/compensation/CompensationModule.sol +8 -0
  221. package/contracts/instance/module/compensation/ICompensation.sol +10 -0
  222. package/contracts/instance/module/component/ComponentModule.sol +95 -0
  223. package/contracts/instance/module/component/IComponent.sol +53 -0
  224. package/contracts/instance/module/policy/IPolicy.sol +60 -0
  225. package/contracts/instance/module/policy/PolicyModule.sol +76 -0
  226. package/contracts/instance/module/pool/IPoolModule.sol +41 -0
  227. package/contracts/instance/module/pool/PoolModule.sol +87 -0
  228. package/contracts/instance/module/risk/IRisk.sol +10 -0
  229. package/contracts/instance/module/risk/RiskModule.sol +8 -0
  230. package/contracts/instance/{treasury → module/treasury}/ITreasury.sol +27 -15
  231. package/contracts/instance/module/treasury/TokenHandler.sol +48 -0
  232. package/contracts/instance/{treasury → module/treasury}/TreasuryModule.sol +43 -59
  233. package/contracts/instance/service/ComponentOwnerService.sol +170 -0
  234. package/contracts/instance/service/IComponentOwnerService.sol +22 -0
  235. package/contracts/instance/service/IPoolService.sol +30 -0
  236. package/contracts/instance/service/IProductService.sol +58 -0
  237. package/contracts/instance/service/PoolService.sol +123 -0
  238. package/contracts/instance/service/ProductService.sol +354 -0
  239. package/contracts/registry/ChainNft.sol +61 -37
  240. package/contracts/registry/IRegistry.sol +24 -34
  241. package/contracts/registry/IRegistryLinked.sol +8 -0
  242. package/contracts/registry/Registry.sol +284 -85
  243. package/contracts/shared/ERC165.sol +21 -0
  244. package/contracts/shared/IOwnable.sol +6 -0
  245. package/contracts/shared/IRegisterable.sol +24 -0
  246. package/contracts/shared/IVersionable.sol +52 -0
  247. package/contracts/shared/Registerable.sol +86 -0
  248. package/contracts/shared/Versionable.sol +89 -0
  249. package/contracts/test/TestFee.sol +25 -0
  250. package/contracts/test/TestPool.sol +22 -0
  251. package/contracts/test/TestProduct.sol +44 -0
  252. package/contracts/test/TestRegisterable.sol +19 -0
  253. package/contracts/test/TestRoleId.sol +14 -0
  254. package/contracts/test/TestService.sol +32 -0
  255. package/contracts/test/TestToken.sol +26 -0
  256. package/contracts/test/TestVersion.sol +44 -0
  257. package/contracts/test/TestVersionable.sol +17 -0
  258. package/contracts/test/Usdc.sol +26 -0
  259. package/contracts/types/AddressSet.sol +58 -0
  260. package/contracts/types/Fee.sol +39 -20
  261. package/contracts/types/Key32.sol +45 -0
  262. package/contracts/types/NftId.sol +22 -1
  263. package/contracts/types/NftIdSet.sol +60 -0
  264. package/contracts/types/ObjectType.sol +22 -14
  265. package/contracts/types/RoleId.sol +38 -0
  266. package/contracts/types/StateId.sol +13 -3
  267. package/contracts/types/Timestamp.sol +22 -1
  268. package/contracts/types/UFixed.sol +26 -23
  269. package/contracts/types/Version.sol +95 -0
  270. package/package.json +9 -3
  271. package/artifacts/contracts/components/Component.sol/Component.dbg.json +0 -4
  272. package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +0 -4
  273. package/artifacts/contracts/components/Component.sol/InstanceLinked.json +0 -35
  274. package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +0 -4
  275. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +0 -4
  276. package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +0 -74
  277. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +0 -4
  278. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +0 -4
  279. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +0 -4
  280. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +0 -35
  281. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +0 -4
  282. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +0 -50
  283. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +0 -4
  284. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +0 -4
  285. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +0 -4
  286. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +0 -202
  287. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +0 -4
  288. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +0 -4
  289. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +0 -4
  290. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +0 -4
  291. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +0 -141
  292. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +0 -4
  293. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.dbg.json +0 -4
  294. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.json +0 -134
  295. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.dbg.json +0 -4
  296. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.dbg.json +0 -4
  297. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.json +0 -221
  298. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +0 -4
  299. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +0 -4
  300. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +0 -4
  301. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +0 -4
  302. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +0 -4
  303. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +0 -4
  304. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +0 -4
  305. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +0 -75
  306. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +0 -4
  307. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +0 -127
  308. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +0 -4
  309. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +0 -4
  310. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +0 -196
  311. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.dbg.json +0 -4
  312. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.dbg.json +0 -4
  313. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.dbg.json +0 -4
  314. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.json +0 -45
  315. package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +0 -4
  316. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +0 -4
  317. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +0 -4
  318. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +0 -4
  319. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +0 -49
  320. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +0 -4
  321. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +0 -4
  322. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +0 -60
  323. package/contracts/components/Component.sol +0 -77
  324. package/contracts/components/IPool.sol +0 -15
  325. package/contracts/instance/access/Access.sol +0 -165
  326. package/contracts/instance/access/IAccess.sol +0 -63
  327. package/contracts/instance/component/ComponentModule.sol +0 -274
  328. package/contracts/instance/component/IComponent.sol +0 -74
  329. package/contracts/instance/policy/IPolicy.sol +0 -50
  330. package/contracts/instance/policy/PolicyModule.sol +0 -114
  331. package/contracts/instance/pool/IPoolModule.sol +0 -23
  332. package/contracts/instance/pool/PoolModule.sol +0 -81
  333. package/contracts/instance/product/IProductService.sol +0 -36
  334. package/contracts/instance/product/ProductService.sol +0 -136
  335. package/contracts/instance/treasury/TokenHandler.sol +0 -24
@@ -8,6 +8,9 @@ contract ChainNft is ERC721Enumerable, IChainNft {
8
8
  string public constant NAME = "Dezentralized Insurance Protocol Registry";
9
9
  string public constant SYMBOL = "DIPR";
10
10
 
11
+ uint256 public constant PROTOCOL_NFT_ID = 1101;
12
+ uint256 public constant GLOBAL_REGISTRY_ID = 2101;
13
+
11
14
  // remember token uri
12
15
  mapping(uint256 tokenId => string uri) private _uri;
13
16
 
@@ -34,27 +37,34 @@ contract ChainNft is ERC721Enumerable, IChainNft {
34
37
  _chainIdInt = block.chainid;
35
38
  _chainIdDigits = _countDigits(_chainIdInt);
36
39
  _chainIdMultiplier = 10 ** _chainIdDigits;
37
-
38
- // on mainnet/goerli start /1 (reserved for protocol nft) on other chains with 2
39
- if (block.chainid == 1 || block.chainid == 5) {
40
- _idNext = 1;
41
- } else {
42
- _idNext = 2;
43
- }
40
+ _idNext = 3;
44
41
  }
45
42
 
43
+ /**
44
+ * @dev mints the next token to register new objects
45
+ */
46
46
  function mint(
47
47
  address to,
48
48
  string memory uri
49
49
  ) external override onlyRegistry returns (uint256 tokenId) {
50
50
  tokenId = _getNextTokenId();
51
- _totalMinted++;
52
-
53
- _safeMint(to, tokenId);
54
51
 
55
52
  if (bytes(uri).length > 0) {
56
53
  _uri[tokenId] = uri;
57
54
  }
55
+
56
+ _safeMint(to, tokenId);
57
+ _totalMinted++;
58
+ }
59
+
60
+ /**
61
+ * @dev mints a token for a specified token id
62
+ * not part of the IRegistry interface only needed for
63
+ * initial registry setup (protocol and global registry objects)
64
+ */
65
+ function mint(address to, uint256 tokenId) external onlyRegistry {
66
+ _totalMinted++;
67
+ _safeMint(to, tokenId);
58
68
  }
59
69
 
60
70
  function burn(uint256 tokenId) external override onlyRegistry {
@@ -92,36 +102,50 @@ contract ChainNft is ERC721Enumerable, IChainNft {
92
102
  return _totalMinted;
93
103
  }
94
104
 
95
- // requirement: each chain registry produces token ids that
96
- // are guaranteed to not collide with any token id genereated
97
- // on a different chain
98
- //
99
- // format concat(counter,chainid,2 digits for len-of-chain-id)
100
- // restriction chainid up to 99 digits
101
- // decode: from right to left:
102
- // - 2 right most digits encode length of chainid
103
- // - move number of digits to left as determined above (-> chainid)
104
- // - the reminder to the left is the counter
105
- // examples
106
- // 1101
107
- // ^^ ^
108
- // || +- 1-digit chain id
109
- // |+-- chain id = 1 (mainnet)
110
- // +-- 1st token id on mainnet
111
- // (1 * 10 ** 1 + 1) * 100 + 1
112
- // 42987654321010
113
- // ^ ^ ^
114
- // | | +- 10-digit chain id
115
- // | +-- chain id = 9876543210 (hypothetical chainid)
116
- // +-- 42nd token id on this chain
117
- // (42 * 10 ** 10 + 9876543210) * 100 + 10
118
- // (index * 10 ** digits + chainid) * 100 + digits (1 < digits < 100)
119
-
120
- function _getNextTokenId() private returns (uint256 id) {
105
+ /**
106
+ * @dev token id calculation based on an index value that is supposed
107
+ * to increase with every minted token
108
+ *
109
+ * requirement: each chain registry produces token ids that
110
+ * are guaranteed to not collide with any token id genereated
111
+ * on a different chain
112
+ *
113
+ * format concat(counter,chainid,2 digits for len-of-chain-id)
114
+ * restriction chainid up to 99 digits
115
+ * decode: from right to left:
116
+ * - 2 right most digits encode length of chainid
117
+ * - move number of digits to left as determined above (-> chainid)
118
+ * - the reminder to the left is the counter
119
+ *
120
+ * special cases
121
+ * 1101 -> decentralized insurance protocol
122
+ * 2102 -> global registry
123
+ * 2xxxxx -> chain registry, where xxxxx = <chain-part>
124
+ *
125
+ * examples
126
+ * 1101
127
+ * ^^ ^
128
+ * || +- 1-digit chain id
129
+ * |+-- chain id = 1 (mainnet)
130
+ * +-- 1st token id on mainnet
131
+ * (1 * 10 ** 1 + 1) * 100 + 1
132
+ * 42987654321010
133
+ * ^ ^ ^
134
+ * | | +- 10-digit chain id
135
+ * | +-- chain id = 9876543210 (hypothetical chainid)
136
+ * +-- 42nd token id on this chain
137
+ * (42 * 10 ** 10 + 9876543210) * 100 + 10
138
+ * (index * 10 ** digits + chainid) * 100 + digits (1 < digits < 100)
139
+ */
140
+ function calculateTokenId(uint256 idIndex) public view returns (uint256 id) {
121
141
  id =
122
- (_idNext * _chainIdMultiplier + _chainIdInt) *
142
+ (idIndex * _chainIdMultiplier + _chainIdInt) *
123
143
  100 +
124
144
  _chainIdDigits;
145
+ }
146
+
147
+ function _getNextTokenId() private returns (uint256 id) {
148
+ id = calculateTokenId(_idNext);
125
149
  _idNext++;
126
150
  }
127
151
 
@@ -1,44 +1,21 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.19;
3
3
 
4
+ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
5
+
4
6
  import {NftId} from "../types/NftId.sol";
5
7
  import {ObjectType} from "../types/ObjectType.sol";
8
+ import {VersionPart} from "../types/Version.sol";
9
+ import {IChainNft} from "./IChainNft.sol";
6
10
 
7
- interface IOwnable {
8
- function getOwner() external view returns (address owner);
9
- }
10
-
11
- interface IRegistryLinked {
12
- event LogDebug(uint256 idx, address module, string comment);
13
-
14
- function getRegistry() external view returns (IRegistry registry);
15
- }
16
-
17
- interface IRegisterable is IOwnable, IRegistryLinked {
18
- function register() external returns (NftId nftId);
19
-
20
- function getNftId() external view returns (NftId nftId);
21
-
22
- function getParentNftId() external view returns (NftId parentNftId);
23
-
24
- function getType() external view returns (ObjectType objectType);
25
-
26
- function getData() external view returns (bytes memory data);
27
-
28
- function isRegisterable() external pure returns (bool);
29
-
30
- function getInitialOwner() external view returns (address initialOwner);
31
-
32
- function isRegistered() external view returns (bool);
33
- }
34
-
35
- interface IRegistry {
36
- struct RegistryInfo {
11
+ interface IRegistry is IERC165 {
12
+ struct ObjectInfo {
37
13
  NftId nftId;
38
14
  NftId parentNftId;
39
15
  ObjectType objectType;
40
16
  address objectAddress;
41
17
  address initialOwner;
18
+ bytes data;
42
19
  }
43
20
 
44
21
  function register(address objectAddress) external returns (NftId nftId);
@@ -46,22 +23,35 @@ interface IRegistry {
46
23
  function registerObjectForInstance(
47
24
  NftId parentNftid,
48
25
  ObjectType objectType,
49
- address initialOwner
26
+ address initialOwner,
27
+ bytes memory data
50
28
  ) external returns (NftId nftId);
51
29
 
30
+ function getServiceAddress(string memory serviceName, VersionPart majorVersion) external view returns (address serviceAddress);
31
+
52
32
  function getObjectCount() external view returns (uint256);
53
33
 
34
+ function getNftId() external view returns (NftId nftId);
35
+
54
36
  function getNftId(
55
37
  address objectAddress
56
38
  ) external view returns (NftId nftId);
57
39
 
58
- function getInfo(
40
+ function getObjectInfo(
41
+ NftId nftId
42
+ ) external view returns (ObjectInfo memory info);
43
+
44
+ function getName(
59
45
  NftId nftId
60
- ) external view returns (RegistryInfo memory info);
46
+ ) external view returns (string memory name);
47
+
48
+ function getProtocolOwner() external view returns (address);
61
49
 
62
50
  function getOwner(NftId nftId) external view returns (address ownerAddress);
63
51
 
52
+ function isRegistered(NftId nftId) external view returns (bool);
53
+
64
54
  function isRegistered(address objectAddress) external view returns (bool);
65
55
 
66
- function getNftAddress() external view returns (address nft);
56
+ function getChainNft() external view returns (IChainNft);
67
57
  }
@@ -0,0 +1,8 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IRegistry} from "../registry/IRegistry.sol";
5
+
6
+ interface IRegistryLinked {
7
+ function getRegistry() external view returns (IRegistry registry);
8
+ }
@@ -1,80 +1,79 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.19;
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;
4
+ import {IRegisterable} from "../shared/IRegisterable.sol";
5
+ import {IService} from "../instance/base/IService.sol";
11
6
 
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
- }
39
-
40
- function isRegistered() public view override returns (bool) {
41
- NftId nftId = _registry.getNftId(address(this));
42
- return nftId.gtz();
43
- }
44
-
45
- function getNftId() public view override returns (NftId nftId) {
46
- return _registry.getNftId(address(this));
47
- }
48
-
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
-
56
- contract Registry is IRegistry {
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 {VersionPart} from "../types/Version.sol";
12
+ import {ObjectType, PROTOCOL, REGISTRY, TOKEN, SERVICE, INSTANCE, STAKE, PRODUCT, DISTRIBUTOR, ORACLE, POOL, POLICY, BUNDLE} from "../types/ObjectType.sol";
13
+
14
+ // TODO make registry upgradable
15
+ contract Registry is
16
+ IRegisterable,
17
+ IRegistry
18
+ {
57
19
  using NftIdLib for NftId;
58
20
 
59
21
  string public constant EMPTY_URI = "";
60
22
 
61
- mapping(NftId nftId => RegistryInfo info) private _info;
23
+ mapping(NftId nftId => ObjectInfo info) private _info;
62
24
  mapping(NftId nftId => address owner) private _owner;
63
25
  mapping(address object => NftId nftId) private _nftIdByAddress;
26
+ mapping(ObjectType objectType => bool) private _isValidType;
27
+ mapping(ObjectType objectType => mapping(ObjectType objectParentType => bool)) private _isValidParentType;
64
28
 
29
+ mapping(NftId nftId => string stringValue) private _string;
30
+ mapping(bytes32 serviceNameHash => mapping(VersionPart majorVersion => address service)) _service;
31
+
32
+ NftId private _nftId;
65
33
  IChainNft private _chainNft;
34
+ ChainNft private _chainNftInternal;
35
+ address private _initialOwner;
66
36
 
67
- function initialize(address chainNft) external {
37
+ // @dev will own protocol nft and registry nft(s) minted during initialize
38
+ address private _protocolOwner;
39
+
40
+ // TODO refactor once registry becomes upgradable
41
+ // @Dev the protocol owner will get ownership of the
42
+ // protocol nft and the global registry nft minted in this
43
+ // initializer function
44
+ function initialize(
45
+ address chainNft,
46
+ address protocolOwner
47
+ )
48
+ public
49
+ {
68
50
  require(
69
51
  address(_chainNft) == address(0),
70
52
  "ERROR:REG-001:ALREADY_INITIALIZED"
71
53
  );
54
+
55
+ _initialOwner = msg.sender;
56
+ _protocolOwner = protocolOwner;
57
+
72
58
  _chainNft = IChainNft(chainNft);
59
+ _chainNftInternal = ChainNft(chainNft);
60
+
61
+ // initial registry setup
62
+ _registerProtocol();
63
+ _nftId = _registerRegistry();
64
+
65
+ // setup rules for further registrations
66
+ _setupValidTypes();
67
+ _setupValidParentTypes();
73
68
  }
74
69
 
70
+
75
71
  function register(
76
72
  address objectAddress
77
- ) external override returns (NftId nftId) {
73
+ )
74
+ // TODO add authz (only services may register components etc)
75
+ // we have to check how we do authz for registring services (just restrict to protocol owner/registry owner)
76
+ external override returns (NftId nftId) {
78
77
  require(
79
78
  _nftIdByAddress[objectAddress].eqz(),
80
79
  "ERROR:REG-002:ALREADY_REGISTERED"
@@ -82,44 +81,69 @@ contract Registry is IRegistry {
82
81
 
83
82
  IRegisterable registerable = IRegisterable(objectAddress);
84
83
  require(
85
- registerable.isRegisterable(),
84
+ registerable.supportsInterface(type(IRegisterable).interfaceId),
86
85
  "ERROR:REG-003:NOT_REGISTERABLE"
87
86
  );
88
87
 
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
- }
88
+ ObjectType objectType = registerable.getType();
89
+ require(
90
+ _isValidType[objectType],
91
+ "ERROR:REG-004:TYPE_INVALID"
92
+ );
93
+
94
+ NftId parentNftId = registerable.getParentNftId();
95
+ require(
96
+ isRegistered(parentNftId),
97
+ "ERROR:REG-005:PARENT_NOT_REGISTERED"
98
+ );
99
+
100
+ require(
101
+ _isValidParentType[objectType][_info[parentNftId].objectType],
102
+ "ERROR:REG-006:PARENT_TYPE_INVALID"
103
+ );
104
+
105
+ // also check that nftId and parentNFtId are on the same chain if applicable
98
106
 
107
+ // nft minting
99
108
  uint256 mintedTokenId = _chainNft.mint(
100
- registerable.getInitialOwner(),
109
+ registerable.getOwner(),
101
110
  EMPTY_URI
102
111
  );
103
- nftId = toNftId(mintedTokenId);
104
112
 
105
- RegistryInfo memory info = RegistryInfo(
106
- nftId,
107
- registerable.getParentNftId(),
108
- registerable.getType(),
109
- objectAddress,
110
- registerable.getInitialOwner()
111
- );
113
+ nftId = toNftId(mintedTokenId);
112
114
 
113
- _info[nftId] = info;
114
- _nftIdByAddress[objectAddress] = nftId;
115
+ // special case services
116
+ if(registerable.getType() == SERVICE()) {
117
+ IService service = IService(objectAddress);
118
+ require(
119
+ service.supportsInterface(type(IService).interfaceId),
120
+ "ERROR:REG-007:NOT_SERVICE"
121
+ );
122
+
123
+ string memory serviceName = service.getName();
124
+ VersionPart majorVersion = service.getMajorVersion();
125
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
126
+
127
+ // service specific state
128
+ _string[nftId] = serviceName;
129
+
130
+ require(
131
+ _service[serviceNameHash][majorVersion] == address(0),
132
+ "ERROR:REG-008:ALREADY_REGISTERED"
133
+ );
134
+ _service[serviceNameHash][majorVersion] = objectAddress;
135
+ }
115
136
 
116
- // add logging
137
+ // create object info and link nft id with it
138
+ _registerObjectInfo(registerable, nftId);
117
139
  }
118
140
 
141
+
119
142
  function registerObjectForInstance(
120
143
  NftId parentNftId,
121
144
  ObjectType objectType,
122
- address initialOwner
145
+ address initialOwner,
146
+ bytes memory data
123
147
  )
124
148
  external
125
149
  override
@@ -131,18 +155,19 @@ contract Registry is IRegistry {
131
155
  // TODO add more validation
132
156
  require(
133
157
  objectType == POLICY() || objectType == BUNDLE(),
134
- "ERROR:REG-005:TYPE_INVALID"
158
+ "ERROR:REG-010:TYPE_INVALID"
135
159
  );
136
160
 
137
161
  uint256 mintedTokenId = _chainNft.mint(initialOwner, EMPTY_URI);
138
162
  nftId = toNftId(mintedTokenId);
139
163
 
140
- RegistryInfo memory info = RegistryInfo(
164
+ ObjectInfo memory info = ObjectInfo(
141
165
  nftId,
142
166
  parentNftId,
143
167
  objectType,
144
168
  address(0),
145
- initialOwner
169
+ initialOwner,
170
+ data
146
171
  );
147
172
 
148
173
  _info[nftId] = info;
@@ -160,23 +185,197 @@ contract Registry is IRegistry {
160
185
  return _nftIdByAddress[object];
161
186
  }
162
187
 
188
+ function isRegistered(
189
+ NftId nftId
190
+ ) public view override returns (bool) {
191
+ return _info[nftId].objectType.gtz();
192
+ }
193
+
163
194
  function isRegistered(
164
195
  address object
165
196
  ) external view override returns (bool) {
166
197
  return _nftIdByAddress[object].gtz();
167
198
  }
168
199
 
169
- function getInfo(
200
+ function getObjectInfo(
170
201
  NftId nftId
171
- ) external view override returns (RegistryInfo memory info) {
202
+ ) external view override returns (ObjectInfo memory info) {
172
203
  return _info[nftId];
173
204
  }
174
205
 
206
+ function getName(
207
+ NftId nftId
208
+ ) external view returns (string memory name) {
209
+ return _string[nftId];
210
+ }
211
+
175
212
  function getOwner(NftId nftId) external view override returns (address) {
176
213
  return _chainNft.ownerOf(nftId.toInt());
177
214
  }
178
215
 
179
- function getNftAddress() external view override returns (address nft) {
180
- return address(_chainNft);
216
+ function getChainNft() external view override returns (IChainNft) {
217
+ return _chainNft;
218
+ }
219
+
220
+ // special case to retrive a gif service
221
+ function getServiceAddress(string memory serviceName, VersionPart majorVersion) external view override returns (address serviceAddress) {
222
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
223
+ return _service[serviceNameHash][majorVersion];
224
+ }
225
+
226
+ // from IERC165
227
+ function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {
228
+ return interfaceId == type(IRegistry).interfaceId;
229
+ }
230
+
231
+ // from IRegistryLinked
232
+ function getRegistry() external view override returns (IRegistry registry) {
233
+ return this;
234
+ }
235
+
236
+ // from IRegisterable
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
+
246
+ function getOwner() public view override returns (address owner) {
247
+ return _nftId.gtz() ? this.getOwner(_nftId) : _initialOwner;
248
+ }
249
+
250
+ function getNftId() external view override (IRegisterable, IRegistry) returns (NftId nftId) {
251
+ return _nftId;
252
+ }
253
+
254
+ function getParentNftId() external view returns (NftId nftId) {
255
+ // we're the global registry
256
+ if(block.chainid == 1) {
257
+ return toNftId(_chainNftInternal.PROTOCOL_NFT_ID());
258
+ }
259
+ else {
260
+ return toNftId(_chainNftInternal.GLOBAL_REGISTRY_ID());
261
+ }
262
+ }
263
+
264
+ function getData() external pure returns (bytes memory data) {
265
+ return "";
266
+ }
267
+
268
+ // registry specific functions
269
+ function getProtocolOwner() external view override returns (address) {
270
+ return _protocolOwner;
271
+ }
272
+
273
+ /// @dev defines which types are allowed to register
274
+ function _setupValidTypes() internal {
275
+ _isValidType[REGISTRY()] = true; // only for global registry
276
+ _isValidType[TOKEN()] = true;
277
+ _isValidType[SERVICE()] = true;
278
+ _isValidType[INSTANCE()] = true;
279
+ _isValidType[STAKE()] = true;
280
+ _isValidType[PRODUCT()] = true;
281
+ _isValidType[ORACLE()] = true;
282
+ _isValidType[POOL()] = true;
283
+ _isValidType[POLICY()] = true;
284
+ _isValidType[BUNDLE()] = true;
181
285
  }
286
+
287
+ /// @dev defines which types - parent type relations are allowed to register
288
+ function _setupValidParentTypes() internal {
289
+ // registry as parent
290
+ _isValidParentType[TOKEN()][REGISTRY()] = true;
291
+ _isValidParentType[SERVICE()][REGISTRY()] = true;
292
+ _isValidParentType[INSTANCE()][REGISTRY()] = true;
293
+
294
+ // instance as parent
295
+ _isValidParentType[PRODUCT()][INSTANCE()] = true;
296
+ _isValidParentType[DISTRIBUTOR()][INSTANCE()] = true;
297
+ _isValidParentType[ORACLE()][INSTANCE()] = true;
298
+ _isValidParentType[POOL()][INSTANCE()] = true;
299
+
300
+ // product as parent
301
+ _isValidParentType[POLICY()][PRODUCT()] = true;
302
+
303
+ // pool as parent
304
+ _isValidParentType[BUNDLE()][POOL()] = true;
305
+ _isValidParentType[STAKE()][POOL()] = true;
306
+ }
307
+
308
+ /// @dev protocol registration used to anchor the dip ecosystem relations
309
+ function _registerProtocol() virtual internal {
310
+ uint256 protocolId = _chainNftInternal.PROTOCOL_NFT_ID();
311
+ _chainNftInternal.mint(_protocolOwner, protocolId);
312
+
313
+ NftId protocolNftid = toNftId(protocolId);
314
+ ObjectInfo memory protocolInfo = ObjectInfo(
315
+ protocolNftid,
316
+ zeroNftId(), // parent nft id
317
+ PROTOCOL(),
318
+ address(0), // contract address
319
+ _protocolOwner,
320
+ "" // data
321
+ );
322
+
323
+ _info[protocolNftid] = protocolInfo;
324
+ }
325
+
326
+ /// @dev registry registration
327
+ /// might also register the global registry when not on mainnet
328
+ function _registerRegistry() virtual internal returns (NftId registryNftId) {
329
+ uint256 registryId = _chainNftInternal.calculateTokenId(2);
330
+ registryNftId = toNftId(registryId);
331
+
332
+ // we're not the global registry
333
+ if(registryId != _chainNftInternal.GLOBAL_REGISTRY_ID()) {
334
+ _registerGlobalRegistry();
335
+ }
336
+
337
+ _chainNftInternal.mint(_protocolOwner, registryId);
338
+ _registerObjectInfo(this, registryNftId);
339
+ }
340
+
341
+
342
+ /// @dev global registry registration for non mainnet registries
343
+ function _registerGlobalRegistry() virtual internal {
344
+ uint256 globalRegistryId = _chainNftInternal.GLOBAL_REGISTRY_ID();
345
+ _chainNftInternal.mint(_protocolOwner, globalRegistryId);
346
+
347
+ NftId globalRegistryNftId = toNftId(globalRegistryId);
348
+ ObjectInfo memory globalRegistryInfo = ObjectInfo(
349
+ globalRegistryNftId,
350
+ toNftId(_chainNftInternal.PROTOCOL_NFT_ID()),
351
+ REGISTRY(),
352
+ address(0), // contract address
353
+ _protocolOwner,
354
+ "" // data
355
+ );
356
+
357
+ _info[globalRegistryNftId] = globalRegistryInfo;
358
+ }
359
+
360
+
361
+ function _registerObjectInfo(
362
+ IRegisterable registerable,
363
+ NftId nftId
364
+ ) internal virtual {
365
+ address objectAddress = address(registerable);
366
+ ObjectInfo memory info = ObjectInfo(
367
+ nftId,
368
+ registerable.getParentNftId(),
369
+ registerable.getType(),
370
+ objectAddress,
371
+ registerable.getOwner(),
372
+ registerable.getData()
373
+ );
374
+
375
+ _info[nftId] = info;
376
+ _nftIdByAddress[objectAddress] = nftId;
377
+
378
+ // add logging
379
+ }
380
+
182
381
  }