@etherisc/gif-next 0.0.2-81f8acb → 0.0.2-8210648-816

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