@etherisc/gif-next 0.0.2-770fd3b-604 → 0.0.2-77a1ccf-469

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 (300) hide show
  1. package/README.md +8 -8
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
  3. package/artifacts/contracts/components/Component.sol/Component.json +22 -145
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +79 -233
  6. package/artifacts/contracts/components/IComponent.sol/IComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IComponent.sol/IComponent.json +19 -92
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +57 -178
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +239 -104
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +23 -164
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +240 -155
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +27 -218
  18. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +1 -1
  19. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +2 -2
  20. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +1 -1
  21. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  22. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +343 -308
  23. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  24. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +19 -184
  25. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  26. package/artifacts/contracts/instance/Instance.sol/Instance.json +469 -466
  27. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  28. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +2 -2
  29. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  30. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +79 -110
  31. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  32. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +70 -284
  33. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  34. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +196 -113
  35. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +1 -1
  36. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +2 -2
  37. package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.dbg.json +1 -1
  38. package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.json +18 -220
  39. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  40. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  41. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  42. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +2 -2
  43. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  44. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
  45. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  46. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  47. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  48. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  49. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  50. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  51. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  52. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.dbg.json +1 -1
  53. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.json +182 -331
  54. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +4 -0
  55. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.json +665 -0
  56. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +1 -1
  57. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +54 -276
  58. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
  59. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +182 -107
  60. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.dbg.json +4 -0
  61. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.json +754 -0
  62. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +4 -0
  63. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.json +637 -0
  64. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  65. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +645 -268
  66. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  67. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +300 -109
  68. package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.dbg.json +1 -1
  69. package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.json +124 -206
  70. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +1 -1
  71. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +26 -191
  72. package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.dbg.json +4 -0
  73. package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.json +409 -0
  74. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  75. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +369 -167
  76. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +1 -1
  77. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +25 -290
  78. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  79. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +12 -177
  80. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +12 -177
  82. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +1 -1
  83. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +65 -443
  84. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
  85. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +188 -141
  86. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  87. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +42 -272
  88. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  89. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +179 -104
  90. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  91. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +42 -272
  92. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +1 -1
  93. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +179 -104
  94. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  95. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  96. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  97. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +71 -180
  98. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  99. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  100. package/artifacts/contracts/registry/Registry.sol/Registry.json +7 -7
  101. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.dbg.json +1 -1
  102. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.json +2 -2
  103. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  104. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +90 -264
  105. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  106. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +182 -113
  107. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +1 -1
  108. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +11 -11
  109. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  110. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +34 -67
  111. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  112. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  113. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  114. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  115. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +4 -30
  116. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.dbg.json +1 -1
  117. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  118. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +4 -30
  119. package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
  120. package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.json +0 -21
  121. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  122. package/artifacts/contracts/shared/IService.sol/IService.json +12 -177
  123. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  124. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +0 -150
  125. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  126. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +10 -62
  127. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +1 -1
  128. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.json +2 -23
  129. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  130. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +171 -88
  131. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  132. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +11 -74
  133. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +1 -1
  134. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.json +2 -23
  135. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  136. package/artifacts/contracts/shared/Service.sol/Service.json +13 -215
  137. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  138. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  139. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
  140. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  141. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +0 -150
  142. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  143. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  144. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +11 -74
  145. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  146. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  147. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  148. package/artifacts/contracts/test/TestService.sol/TestService.json +31 -269
  149. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  150. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  151. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  152. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +6 -188
  153. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  154. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  155. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  156. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  157. package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.dbg.json +4 -0
  158. package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.json +100 -0
  159. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  160. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.json +2 -2
  161. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  162. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  163. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +2 -2
  164. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  165. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +2 -2
  166. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  167. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +2 -2
  168. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  169. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  170. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
  171. package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.dbg.json +4 -0
  172. package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.json +100 -0
  173. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  174. package/artifacts/contracts/types/Referral.sol/ReferralLib.json +2 -2
  175. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  176. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +2 -2
  177. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  178. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  179. package/artifacts/contracts/types/Seconds.sol/SecondsLib.dbg.json +4 -0
  180. package/artifacts/contracts/types/Seconds.sol/SecondsLib.json +124 -0
  181. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  182. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  183. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +25 -7
  184. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  185. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  186. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  187. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  188. package/contracts/components/Component.sol +69 -84
  189. package/contracts/components/Distribution.sol +26 -31
  190. package/contracts/components/IComponent.sol +34 -16
  191. package/contracts/components/IDistributionComponent.sol +1 -22
  192. package/contracts/components/IPoolComponent.sol +89 -25
  193. package/contracts/components/IProductComponent.sol +3 -2
  194. package/contracts/components/Pool.sol +216 -92
  195. package/contracts/components/Product.sol +36 -25
  196. package/contracts/instance/BundleManager.sol +1 -1
  197. package/contracts/instance/IInstance.sol +7 -1
  198. package/contracts/instance/Instance.sol +17 -7
  199. package/contracts/instance/InstanceService.sol +67 -10
  200. package/contracts/instance/InstanceServiceManager.sol +1 -1
  201. package/contracts/instance/module/IBundle.sol +2 -1
  202. package/contracts/instance/module/IDistribution.sol +2 -0
  203. package/contracts/instance/module/IPolicy.sol +30 -3
  204. package/contracts/instance/module/ISetup.sol +5 -6
  205. package/contracts/instance/service/ApplicationService.sol +138 -57
  206. package/contracts/instance/service/ApplicationServiceManager.sol +35 -0
  207. package/contracts/instance/service/BundleService.sol +4 -3
  208. package/contracts/instance/service/BundleServiceManager.sol +1 -1
  209. package/contracts/instance/service/ClaimService.sol +151 -0
  210. package/contracts/instance/service/ClaimServiceManager.sol +35 -0
  211. package/contracts/instance/service/DistributionService.sol +146 -26
  212. package/contracts/instance/service/DistributionServiceManager.sol +1 -1
  213. package/contracts/instance/service/IApplicationService.sol +9 -9
  214. package/contracts/instance/service/IBundleService.sol +3 -2
  215. package/contracts/instance/service/IClaimService.sol +61 -0
  216. package/contracts/instance/service/IDistributionService.sol +23 -2
  217. package/contracts/instance/service/IPolicyService.sol +17 -35
  218. package/contracts/instance/service/PolicyService.sol +47 -169
  219. package/contracts/instance/service/PolicyServiceManager.sol +2 -2
  220. package/contracts/instance/service/PoolServiceManager.sol +1 -1
  221. package/contracts/instance/service/ProductServiceManager.sol +2 -2
  222. package/contracts/registry/IRegistryService.sol +10 -8
  223. package/contracts/registry/Registry.sol +3 -1
  224. package/contracts/registry/RegistryService.sol +62 -40
  225. package/contracts/registry/RegistryServiceManager.sol +13 -13
  226. package/contracts/registry/ReleaseManager.sol +18 -28
  227. package/contracts/registry/TokenRegistry.sol +13 -10
  228. package/contracts/shared/ERC165.sol +2 -1
  229. package/contracts/shared/INftOwnable.sol +4 -9
  230. package/contracts/shared/IRegistryLinked.sol +0 -3
  231. package/contracts/shared/IService.sol +2 -0
  232. package/contracts/shared/IVersionable.sol +4 -47
  233. package/contracts/shared/NftOwnable.sol +10 -80
  234. package/contracts/shared/ProxyManager.sol +98 -24
  235. package/contracts/shared/Registerable.sol +3 -10
  236. package/contracts/shared/RegistryLinked.sol +10 -26
  237. package/contracts/shared/Service.sol +10 -12
  238. package/contracts/shared/Versionable.sol +1 -90
  239. package/contracts/types/ClaimId.sol +52 -0
  240. package/contracts/types/ObjectType.sol +4 -4
  241. package/contracts/types/PayoutId.sol +54 -0
  242. package/contracts/types/RoleId.sol +10 -5
  243. package/contracts/types/Seconds.sol +54 -0
  244. package/contracts/types/Timestamp.sol +12 -13
  245. package/package.json +1 -1
  246. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +0 -4
  247. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.json +0 -66
  248. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +0 -4
  249. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.json +0 -24
  250. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +0 -4
  251. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.json +0 -42
  252. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +0 -4
  253. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +0 -105
  254. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +0 -4
  255. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +0 -105
  256. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +0 -4
  257. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +0 -128
  258. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +0 -4
  259. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +0 -42
  260. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +0 -4
  261. package/artifacts/contracts/experiment/inheritance/B.sol/B.json +0 -76
  262. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +0 -4
  263. package/artifacts/contracts/experiment/inheritance/C.sol/C.json +0 -89
  264. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +0 -4
  265. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.json +0 -128
  266. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +0 -4
  267. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.json +0 -37
  268. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +0 -4
  269. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.json +0 -50
  270. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +0 -4
  271. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.json +0 -63
  272. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +0 -4
  273. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +0 -59
  274. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +0 -4
  275. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.json +0 -124
  276. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +0 -4
  277. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.json +0 -74
  278. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +0 -4
  279. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +0 -124
  280. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +0 -4
  281. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +0 -207
  282. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +0 -4
  283. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +0 -10
  284. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +0 -4
  285. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +0 -10
  286. package/contracts/experiment/cloning/Cloner.sol +0 -47
  287. package/contracts/experiment/errors/Require.sol +0 -38
  288. package/contracts/experiment/errors/Revert.sol +0 -44
  289. package/contracts/experiment/inheritance/A.sol +0 -53
  290. package/contracts/experiment/inheritance/B.sol +0 -28
  291. package/contracts/experiment/inheritance/C.sol +0 -34
  292. package/contracts/experiment/inheritance/IA.sol +0 -13
  293. package/contracts/experiment/inheritance/IB.sol +0 -10
  294. package/contracts/experiment/inheritance/IC.sol +0 -12
  295. package/contracts/experiment/statemachine/Dummy.sol +0 -27
  296. package/contracts/experiment/statemachine/ISM.sol +0 -25
  297. package/contracts/experiment/statemachine/SM.sol +0 -57
  298. package/contracts/experiment/statemachine/SimpleStateMachine.sol +0 -31
  299. package/contracts/experiment/types/TypeA.sol +0 -47
  300. package/contracts/experiment/types/TypeB.sol +0 -29
@@ -41,7 +41,7 @@ contract ReleaseManager is AccessManaged
41
41
  error SelfRegistration();
42
42
  error RegisterableOwnerIsRegistered();
43
43
 
44
- // _verifyServiceInfo
44
+ // _verifyService
45
45
  error UnexpectedServiceVersion(VersionPart expected, VersionPart found);
46
46
  error UnexpectedServiceDomain(ObjectType expected, ObjectType found);
47
47
 
@@ -61,7 +61,7 @@ contract ReleaseManager is AccessManaged
61
61
 
62
62
  mapping(VersionPart version => IRegistry.ReleaseInfo info) _release;
63
63
 
64
- mapping(VersionPart version => mapping(ObjectType serviceDomain => bytes4)) _selector; // registry service function selector assigned to domain
64
+ mapping(VersionPart version => mapping(ObjectType serviceDomain => bytes4[])) _selectors; // registry service function selector assigned to domain
65
65
 
66
66
  uint _awaitingRegistration; // "services left to register" counter
67
67
 
@@ -148,12 +148,8 @@ contract ReleaseManager is AccessManaged
148
148
 
149
149
  VersionPart version = _next;
150
150
  ObjectType domain = REGISTRY();
151
- _verifyServiceInfo(info, version, domain);
152
-
153
- // data: config bytes
151
+ _verifyService(service, version, domain);
154
152
  _createRelease(service.getFunctionConfigs());
155
-
156
- //setTargetClosed(service, true);
157
153
 
158
154
  nftId = _registry.registerService(info, version, domain);
159
155
 
@@ -175,17 +171,16 @@ contract ReleaseManager is AccessManaged
175
171
  IRegistry.ObjectInfo memory info = _getAndVerifyContractInfo(service, SERVICE(), msg.sender);
176
172
  VersionPart version = getNextVersion();
177
173
  ObjectType domain = _release[version].domains[_awaitingRegistration];// reversed registration order of services specified in RegistryService config
178
- _verifyServiceInfo(info, version, domain);
174
+ _verifyService(service, version, domain);
179
175
 
180
176
  // setup and grant unique role if service does registrations
181
- bytes4[] memory selector = new bytes4[](1);
182
- selector[0] = _selector[version][domain];
177
+ bytes4[] memory selectors = _selectors[version][domain];
183
178
  address registryService = _registry.getServiceAddress(REGISTRY(), version);
184
- if(selector[0] != 0) {
179
+ if(selectors.length > 0) {
185
180
  _accessManager.setAndGrantUniqueRole(
186
181
  address(service),
187
182
  registryService,
188
- selector);
183
+ selectors);
189
184
  }
190
185
 
191
186
  _awaitingRegistration--;
@@ -267,8 +262,8 @@ contract ReleaseManager is AccessManaged
267
262
  }
268
263
  }
269
264
 
270
- function _verifyServiceInfo(
271
- IRegistry.ObjectInfo memory info,
265
+ function _verifyService(
266
+ IService service,
272
267
  VersionPart expectedVersion,
273
268
  ObjectType expectedDomain
274
269
  )
@@ -276,20 +271,15 @@ contract ReleaseManager is AccessManaged
276
271
  view
277
272
  returns(ObjectType)
278
273
  {
279
- (
280
- ObjectType domain,
281
- VersionPart version
282
- ) = abi.decode(info.data, (ObjectType, VersionPart));
283
-
284
- if(version != expectedVersion) {
285
- revert UnexpectedServiceVersion(expectedVersion, version);
274
+ if(service.getMajorVersion() != expectedVersion) {
275
+ revert UnexpectedServiceVersion(expectedVersion, service.getMajorVersion());
286
276
  }
287
277
 
288
- if(domain != expectedDomain) {
289
- revert UnexpectedServiceDomain(expectedDomain, domain);
278
+ if(service.getDomain() != expectedDomain) {
279
+ revert UnexpectedServiceDomain(expectedDomain, service.getDomain());
290
280
  }
291
281
 
292
- return domain;
282
+ return expectedDomain;
293
283
  }
294
284
 
295
285
  // TODO check if registry supports types specified in the config array
@@ -306,21 +296,21 @@ contract ReleaseManager is AccessManaged
306
296
  for(uint idx = 0; idx < config.length; idx++)
307
297
  {
308
298
  ObjectType domain = config[idx].serviceDomain;
309
- bytes4 selector = config[idx].selector;
310
-
311
299
  // not "registry service" / zero domain
312
300
  if(
313
301
  domain == REGISTRY() ||
314
302
  domain.eqz()
315
303
  ) { revert ConfigServiceDomainInvalid(idx, domain); }
316
304
 
305
+ bytes4[] memory selectors = config[idx].selectors;
306
+
317
307
  // TODO can be zero -> e.g. duplicate domain, first with zero selector, second with non zero selector -> need to check _release[version].domains.contains(domain) instead
318
308
  // no overwrite
319
- if(_selector[version][domain] > 0) {
309
+ if(_selectors[version][domain].length > 0) {
320
310
  revert SelectorAlreadyExists(version, domain);
321
311
  }
322
312
 
323
- _selector[version][domain] = selector;
313
+ _selectors[version][domain] = selectors;
324
314
  _release[version].domains.push(domain);
325
315
  }
326
316
  // TODO set when activated?
@@ -26,9 +26,18 @@ contract TokenRegistry is
26
26
  mapping(address token => bool registered) internal _registered;
27
27
  mapping(address token => mapping(VersionPart majorVersion => bool isActive)) internal _active;
28
28
 
29
- constructor()
29
+ constructor(
30
+ address registry
31
+ )
30
32
  {
31
- initializeOwner(msg.sender);
33
+ initialize(registry);
34
+ }
35
+
36
+ function initialize(address registry)
37
+ public
38
+ initializer()
39
+ {
40
+ initializeNftOwnable(msg.sender, registry);
32
41
  }
33
42
 
34
43
 
@@ -41,9 +50,8 @@ contract TokenRegistry is
41
50
  IRegistry registry = IRegistry(registryAddress);
42
51
  // TODO use _latest instead of _initial -> but _latest is 0 before first release activation
43
52
  address registryServiceAddress = registry.getServiceAddress(REGISTRY(), registry.getNextVersion());
44
- //address registryServiceAddress = registry.getServiceAddress(REGISTRY(), registry.getInitialVersion());
45
53
 
46
- _linkToNftOwnable(registryAddress, registryServiceAddress);
54
+ _linkToNftOwnable(registryServiceAddress);
47
55
  }
48
56
 
49
57
  /// @dev token state is informative, registry have no clue about used tokens
@@ -94,12 +102,7 @@ contract TokenRegistry is
94
102
  revert NotContract(token);
95
103
  }
96
104
 
97
- // MUST not be GIF registerable
98
- if(ERC165Checker.supportsInterface(token, type(IRegisterable).interfaceId)) {
99
- revert NotToken(token);
100
- }
101
-
102
- // MUST have decimals > 0
105
+ // MUST have decimals > 0 (indicator that this is in fact an erc20 token)
103
106
  IERC20Metadata erc20 = IERC20Metadata(token);
104
107
  if(erc20.decimals() == 0) {
105
108
  revert TokenDecimalsZero();
@@ -10,12 +10,13 @@ contract ERC165 is
10
10
  {
11
11
  mapping(bytes4 => bool) private _isSupported;
12
12
 
13
- // @dev register support for ERC165 itself
13
+ // @dev initializes with support for ERC165
14
14
  function initializeERC165() public onlyInitializing() {
15
15
  _isSupported[type(IERC165).interfaceId] = true;
16
16
  }
17
17
 
18
18
  // @dev register support for provided interfaceId
19
+ // includes initialization for ERC165_ID if not yet done
19
20
  function registerInterface(bytes4 interfaceId) public onlyInitializing() {
20
21
  _isSupported[interfaceId] = true;
21
22
  }
@@ -3,7 +3,6 @@ pragma solidity ^0.8.20;
3
3
 
4
4
  import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
5
5
 
6
- import {IRegistry} from "../registry/IRegistry.sol";
7
6
  import {IRegistryLinked} from "./IRegistryLinked.sol";
8
7
  import {NftId} from "../types/NftId.sol";
9
8
 
@@ -11,15 +10,11 @@ interface INftOwnable is
11
10
  IERC165,
12
11
  IRegistryLinked
13
12
  {
14
- error ErrorInitialOwnerZero();
15
- error ErrorNotOwner(address account);
13
+ error ErrorNftOwnableInitialOwnerZero();
14
+ error ErrorNftOwnableNotOwner(address account);
16
15
 
17
- error ErrorAlreadyLinked(address registry, NftId nftId);
18
- // error ErrorRegistryAlreadyInitialized(address registry);
19
- // error ErrorRegistryNotInitialized();
20
- // error ErrorRegistryAddressZero();
21
- // error ErrorNotRegistry(address registryAddress);
22
- error ErrorContractNotRegistered(address contractAddress);
16
+ error ErrorNftOwnableAlreadyLinked(NftId nftId);
17
+ error ErrorNftOwnableContractNotRegistered(address contractAddress);
23
18
 
24
19
  function linkToRegisteredNftId() external;
25
20
 
@@ -5,9 +5,6 @@ import {IRegistry} from "../registry/IRegistry.sol";
5
5
 
6
6
  interface IRegistryLinked {
7
7
 
8
- error ErrorRegistryAlreadyInitialized(address registry);
9
- error ErrorRegistryNotInitialized();
10
- error ErrorRegistryAddressZero();
11
8
  error ErrorNotRegistry(address registryAddress);
12
9
 
13
10
  function getRegistry() external view returns (IRegistry);
@@ -11,6 +11,8 @@ interface IService is
11
11
  IRegisterable,
12
12
  IVersionable
13
13
  {
14
+ error ErrorIServiceCallerUnknown(address caller);
15
+
14
16
  function getDomain() external pure returns(ObjectType serviceDomain);
15
17
  function getMajorVersion() external view returns(VersionPart majorVersion);
16
18
  }
@@ -1,11 +1,8 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.20;
3
3
 
4
- import {Blocknumber} from "../types/Blocknumber.sol";
5
- import {Timestamp} from "../types/Timestamp.sol";
6
4
  import {Version} from "../types/Version.sol";
7
5
 
8
-
9
6
  /// IMPORTANT
10
7
  // Upgradeable contract MUST:
11
8
  // 1) inherit from Versionable
@@ -14,7 +11,7 @@ import {Version} from "../types/Version.sol";
14
11
  // 4) implement internal _upgrade() function with onlyInitializing modifier (1st version MUST revert)
15
12
  // 5) have onlyInitialising modifier for each function callable inside _initialize()/_upgrade() (MUST use different functions for initialization/upgrade and normal operations)
16
13
  // 6) use default empty constructor -> _disableInitializer() is called from Versionable contructor
17
- // 7) use namespace storage
14
+ // 7) use namespace storage (should this be needed)
18
15
  // 8) since now inheritance is used for upgradability, contract MUST BE inherited ONLY by the next version
19
16
  // Upgradeable contract SHOULD:
20
17
  // 9) define all non private methods as virtual (in order to be able to upgrade them latter)
@@ -22,48 +19,29 @@ import {Version} from "../types/Version.sol";
22
19
  // in some cases this ok but not in the others...
23
20
  //
24
21
  // IMPORTANT
25
- // Each version MUST:
22
+ // If introducting/amending storage related to Versionable version MUST:
26
23
  // 1) define namespace storage struct if accessing storage
27
24
  // - DO NOT use structs inside, except
28
25
  // - CAN use structs ONLY inside mappings
29
26
  // 2) ALWAYS define private getter if accessing storage
30
27
  // - MUST use default implementation, CAN change ONLY return type
31
- // - MUST use the same "LOCATION_V1"
32
28
 
33
29
  interface IVersionable {
34
30
 
35
- struct VersionInfo {
36
- Version version;
37
- address implementation;
38
- address activatedBy;
39
- Timestamp activatedAt;
40
- Blocknumber activatedIn;
41
- }
42
-
43
- event LogVersionableInitialized(Version version, address implementation, address activatedBy);
44
-
45
- // TODO uncomment when all implementations are ready
46
31
  /**
47
32
  * @dev IMPORTANT
48
33
  * implementation MUST be guarded by initializer modifier
49
- * implementation MUST call internal function Versionable._updateVersionHistory
50
34
  * new version MUST inherit from previous version
51
35
  */
52
- function initializeVersionable(address implementation, address activatedBy, bytes memory activationData) external;
36
+ function initializeVersionable(address activatedBy, bytes memory activationData) external;
53
37
 
54
38
  /**
55
39
  * @dev
56
40
  * implementation MUST be guarded by reinitializer(version().toUint64()) modifier
57
- * implementation MUST call internal function Versionable._updateVersionHistory
58
41
  * new version MUST inherit from previous version
59
42
  * the first verion MUST revert
60
43
  */
61
- function upgradeVersionable(address implementation, address activatedBy, bytes memory upgradeData) external;
62
-
63
- /**
64
- * @dev returns true if the specified version has been activated for the current contract
65
- */
66
- function isInitialized(Version version) external view returns(bool);
44
+ function upgradeVersionable(bytes memory upgradeData) external;
67
45
 
68
46
  /**
69
47
  * @dev returns version of this contract
@@ -72,25 +50,4 @@ interface IVersionable {
72
50
  */
73
51
  function getVersion() external pure returns(Version);
74
52
 
75
- /**
76
- * @dev returns the number of all deployed versions of this contract
77
- */
78
- function getVersionCount() external view returns(uint256 numberOfVersions);
79
-
80
- /**
81
- * @dev returns the i-th (index) version of this contract
82
- */
83
- function getVersion(uint256 index) external view returns(Version version);
84
-
85
- /**
86
- * @dev returns the i-th (index) version info of this contract
87
- */
88
- function getVersionInfo(Version version) external view returns(VersionInfo memory versionInfo);
89
-
90
- // TODO make sure it is needed here
91
- /**
92
- * @dev returns currently active version
93
- */
94
- function getInitializedVersion() external view returns(uint64);
95
-
96
53
  }
@@ -5,8 +5,7 @@ pragma solidity ^0.8.20;
5
5
 
6
6
  import {ERC165} from "./ERC165.sol";
7
7
  import {INftOwnable} from "./INftOwnable.sol";
8
- import {IRegistry} from "../registry/IRegistry.sol";
9
- import {NftId, zeroNftId} from "../types/NftId.sol";
8
+ import {NftId} from "../types/NftId.sol";
10
9
  import {RegistryLinked} from "./RegistryLinked.sol";
11
10
 
12
11
  contract NftOwnable is
@@ -18,7 +17,6 @@ contract NftOwnable is
18
17
  bytes32 public constant NFT_OWNABLE_STORAGE_LOCATION_V1 = 0x07ebcf49758b6ed3af50fa146bec0abe157c0218fe65dc0874c286e9d5da4f00;
19
18
 
20
19
  struct NftOwnableStorage {
21
- // IRegistry _registry;
22
20
  NftId _nftId;
23
21
  address _initialOwner;
24
22
  }
@@ -26,7 +24,7 @@ contract NftOwnable is
26
24
  /// @dev enforces msg.sender is owner of nft (or initial owner of nft ownable)
27
25
  modifier onlyOwner() {
28
26
  if (msg.sender != getOwner()) {
29
- revert ErrorNotOwner(msg.sender);
27
+ revert ErrorNftOwnableNotOwner(msg.sender);
30
28
  }
31
29
  _;
32
30
  }
@@ -42,21 +40,14 @@ contract NftOwnable is
42
40
  virtual
43
41
  onlyInitializing()
44
42
  {
45
- _setInitialOwner(initialOwner);
46
-
47
43
  initializeRegistryLinked(registryAddress);
48
44
  initializeERC165();
49
- registerInterface(type(INftOwnable).interfaceId);
50
- }
51
45
 
46
+ if(initialOwner == address(0)) {
47
+ revert ErrorNftOwnableInitialOwnerZero();
48
+ }
52
49
 
53
- function initializeOwner(address initialOwner)
54
- public
55
- initializer()
56
- {
57
- _setInitialOwner(initialOwner);
58
- initializeERC165();
59
- registerInterface(type(INftOwnable).interfaceId);
50
+ _getNftOwnableStorage()._initialOwner = initialOwner;
60
51
  }
61
52
 
62
53
 
@@ -71,35 +62,22 @@ contract NftOwnable is
71
62
  NftOwnableStorage storage $ = _getNftOwnableStorage();
72
63
 
73
64
  if ($._nftId.gtz()) {
74
- revert ErrorAlreadyLinked(address(getRegistry()), $._nftId);
75
- }
76
-
77
- if (address(getRegistry()) == address(0)) {
78
- revert ErrorRegistryNotInitialized();
65
+ revert ErrorNftOwnableAlreadyLinked($._nftId);
79
66
  }
80
67
 
81
68
  address contractAddress = address(this);
82
69
 
83
70
  if (!getRegistry().isRegistered(contractAddress)) {
84
- revert ErrorContractNotRegistered(contractAddress);
71
+ revert ErrorNftOwnableContractNotRegistered(contractAddress);
85
72
  }
86
73
 
87
74
  $._nftId = getRegistry().getNftId(contractAddress);
88
75
  }
89
76
 
90
-
91
- // function getRegistry() public view virtual override returns (IRegistry) {
92
- // return _getNftOwnableStorage()._registry;
93
- // }
94
-
95
77
  function getNftId() public view virtual override returns (NftId) {
96
78
  return _getNftOwnableStorage()._nftId;
97
79
  }
98
80
 
99
- function getInitialOwner() public view returns (address) {
100
- return _getNftOwnableStorage()._initialOwner;
101
- }
102
-
103
81
  function getOwner() public view virtual override returns (address) {
104
82
  NftOwnableStorage storage $ = _getNftOwnableStorage();
105
83
 
@@ -110,41 +88,22 @@ contract NftOwnable is
110
88
  return $._initialOwner;
111
89
  }
112
90
 
113
- /// @dev set initialOwner
114
- /// initial owner may only be set during initialization
115
- function _setInitialOwner(address initialOwner)
116
- internal
117
- virtual
118
- onlyInitializing()
119
- {
120
- if(initialOwner == address(0)) {
121
- revert ErrorInitialOwnerZero();
122
- }
123
-
124
- _getNftOwnableStorage()._initialOwner = initialOwner;
125
- }
126
-
127
- // TODO check if function can be refactored to work with a registry address set in an initializer
128
91
  /// @dev used in constructor of registry service manager
129
92
  // links ownership of registry service manager ot nft owner of registry service
130
93
  function _linkToNftOwnable(
131
- address registryAddress,
132
94
  address nftOwnableAddress
133
95
  )
134
96
  internal
135
- onlyOwner()
136
97
  returns (NftId)
137
98
  {
138
99
  NftOwnableStorage storage $ = _getNftOwnableStorage();
139
100
 
140
101
  if ($._nftId.gtz()) {
141
- revert ErrorAlreadyLinked(address(getRegistry()), $._nftId);
102
+ revert ErrorNftOwnableAlreadyLinked($._nftId);
142
103
  }
143
104
 
144
- _setRegistry(registryAddress);
145
-
146
105
  if (!getRegistry().isRegistered(nftOwnableAddress)) {
147
- revert ErrorContractNotRegistered(nftOwnableAddress);
106
+ revert ErrorNftOwnableContractNotRegistered(nftOwnableAddress);
148
107
  }
149
108
 
150
109
  $._nftId = getRegistry().getNftId(nftOwnableAddress);
@@ -153,35 +112,6 @@ contract NftOwnable is
153
112
  }
154
113
 
155
114
 
156
- // function _setRegistry(address registryAddress)
157
- // private
158
- // {
159
- // NftOwnableStorage storage $ = _getNftOwnableStorage();
160
-
161
- // if (address($._registry) != address(0)) {
162
- // revert ErrorRegistryAlreadyInitialized(address($._registry));
163
- // }
164
-
165
- // if (registryAddress == address(0)) {
166
- // revert ErrorRegistryAddressZero();
167
- // }
168
-
169
- // if (registryAddress.code.length == 0) {
170
- // revert ErrorNotRegistry(registryAddress);
171
- // }
172
-
173
- // $._registry = IRegistry(registryAddress);
174
-
175
- // try $._registry.supportsInterface(type(IRegistry).interfaceId) returns (bool isRegistry) {
176
- // if (!isRegistry) {
177
- // revert ErrorNotRegistry(registryAddress);
178
- // }
179
- // } catch {
180
- // revert ErrorNotRegistry(registryAddress);
181
- // }
182
- // }
183
-
184
-
185
115
  function _getNftOwnableStorage() private pure returns (NftOwnableStorage storage $) {
186
116
  assembly {
187
117
  $.slot := NFT_OWNABLE_STORAGE_LOCATION_V1
@@ -1,34 +1,56 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.20;
3
3
 
4
- import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
5
- import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
6
4
  import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
7
5
 
6
+ import {Blocknumber, blockNumber} from "../types/Blocknumber.sol";
8
7
  import {IVersionable} from "./IVersionable.sol";
9
8
  import {NftOwnable} from "./NftOwnable.sol";
9
+ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
10
+ import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
11
+ import {Timestamp, TimestampLib} from "../types/Timestamp.sol";
10
12
  import {UpgradableProxyWithAdmin} from "./UpgradableProxyWithAdmin.sol";
13
+ import {Version, VersionLib} from "../types/Version.sol";
11
14
 
12
15
  /// @dev manages proxy deployments for upgradable contracs of type IVersionable
13
16
  contract ProxyManager is
14
17
  NftOwnable
15
18
  {
16
19
 
17
- event LogProxyDeployed(address indexed proxy, address initialImplementation);
18
- event LogProxyDeployedWithSalt(address indexed proxy, address initialImplementation);
19
- event LogProxyUpgraded(address indexed proxy, address upgradedImplementation);
20
+ struct VersionInfo {
21
+ Version version;
22
+ address implementation;
23
+ address activatedBy;
24
+ Timestamp activatedAt;
25
+ Blocknumber activatedIn;
26
+ }
27
+
28
+ event LogProxyManagerVersionableDeployed(address indexed proxy, address initialImplementation);
29
+ event LogProxyManagerVersionableUpgraded(address indexed proxy, address upgradedImplementation);
20
30
 
21
- error ErrorAlreadyDeployed();
22
- error ErrorAlreadyDeployedWithSalt();
23
- error ErrorNotYetDeployed();
31
+ error ErrorProxyManagerAlreadyDeployed();
32
+ error ErrorProxyManagerNotYetDeployed();
33
+
34
+ error ErrorProxyManagerZeroVersion();
35
+ error ErrorProxyManagerNextVersionNotIncreasing(Version nextVersion);
24
36
 
25
37
  UpgradableProxyWithAdmin internal _proxy;
26
- bool internal _isDeployed;
38
+
39
+ // state to keep version history
40
+ mapping(Version version => VersionInfo info) _versionHistory;
41
+ Version [] _versions;
27
42
 
28
43
  /// @dev only used to capture proxy owner
29
- constructor()
44
+ constructor(address registry)
30
45
  {
31
- initializeOwner(msg.sender);
46
+ initializeProxyManager(registry);
47
+ }
48
+
49
+ function initializeProxyManager(address registry)
50
+ public
51
+ initializer()
52
+ {
53
+ initializeNftOwnable(msg.sender, registry);
32
54
  }
33
55
 
34
56
  /// @dev deploy initial contract
@@ -38,22 +60,23 @@ contract ProxyManager is
38
60
  onlyOwner()
39
61
  returns (IVersionable versionable)
40
62
  {
41
- if (_isDeployed) { revert ErrorAlreadyDeployed(); }
42
- _isDeployed = true;
63
+ if (_versions.length > 0) {
64
+ revert ErrorProxyManagerAlreadyDeployed();
65
+ }
43
66
 
44
67
  address currentProxyOwner = getOwner(); // used by implementation
45
68
  address initialProxyAdminOwner = address(this); // used by proxy
46
- bytes memory data = getDeployData(initialImplementation, currentProxyOwner, initializationData);
47
69
 
48
70
  _proxy = new UpgradableProxyWithAdmin(
49
71
  initialImplementation,
50
72
  initialProxyAdminOwner,
51
- data
73
+ getDeployData(currentProxyOwner, initializationData)
52
74
  );
53
75
 
54
76
  versionable = IVersionable(address(_proxy));
77
+ _updateVersionHistory(versionable.getVersion(), initialImplementation, currentProxyOwner);
55
78
 
56
- emit LogProxyDeployed(address(_proxy), initialImplementation);
79
+ emit LogProxyManagerVersionableDeployed(address(_proxy), initialImplementation);
57
80
  }
58
81
 
59
82
  /// @dev upgrade existing contract
@@ -63,33 +86,84 @@ contract ProxyManager is
63
86
  onlyOwner()
64
87
  returns (IVersionable versionable)
65
88
  {
66
- if (!_isDeployed) { revert ErrorNotYetDeployed(); }
89
+ if (_versions.length == 0) {
90
+ revert ErrorProxyManagerNotYetDeployed();
91
+ }
67
92
 
68
93
  address currentProxyOwner = getOwner();
69
94
  ProxyAdmin proxyAdmin = getProxy().getProxyAdmin();
70
95
  ITransparentUpgradeableProxy proxy = ITransparentUpgradeableProxy(address(_proxy));
71
- bytes memory data = getUpgradeData(newImplementation, currentProxyOwner, upgradeData);
72
96
 
73
97
  proxyAdmin.upgradeAndCall(
74
98
  proxy,
75
99
  newImplementation,
76
- data);
100
+ getUpgradeData(upgradeData));
77
101
 
78
102
  versionable = IVersionable(address(_proxy));
103
+ _updateVersionHistory(versionable.getVersion(), newImplementation, currentProxyOwner);
79
104
 
80
- emit LogProxyUpgraded(address(_proxy), newImplementation);
105
+ emit LogProxyManagerVersionableUpgraded(address(_proxy), newImplementation);
81
106
 
82
107
  }
83
108
 
84
- function getDeployData(address implementation, address proxyOwner, bytes memory deployData) public pure returns (bytes memory data) {
85
- return abi.encodeWithSelector(IVersionable.initializeVersionable.selector, implementation, proxyOwner, deployData);
109
+ function getDeployData(address proxyOwner, bytes memory deployData) public pure returns (bytes memory data) {
110
+ return abi.encodeWithSelector(
111
+ IVersionable.initializeVersionable.selector,
112
+ proxyOwner,
113
+ deployData);
86
114
  }
87
115
 
88
- function getUpgradeData(address implementation, address proxyOwner, bytes memory upgradeData) public pure returns (bytes memory data) {
89
- return abi.encodeWithSelector(IVersionable.upgradeVersionable.selector, implementation, proxyOwner, upgradeData);
116
+ function getUpgradeData(bytes memory upgradeData) public pure returns (bytes memory data) {
117
+ return abi.encodeWithSelector(
118
+ IVersionable.upgradeVersionable.selector,
119
+ upgradeData);
90
120
  }
91
121
 
92
122
  function getProxy() public returns (UpgradableProxyWithAdmin) {
93
123
  return _proxy;
94
124
  }
125
+
126
+ function getVersion() external view virtual returns(Version) {
127
+ return IVersionable(address(_proxy)).getVersion();
128
+ }
129
+
130
+ function getVersionCount() external view returns(uint256) {
131
+ return _versions.length;
132
+ }
133
+
134
+ function getVersion(uint256 idx) external view returns(Version) {
135
+ return _versions[idx];
136
+ }
137
+
138
+ function getVersionInfo(Version _version) external view returns(VersionInfo memory) {
139
+ return _versionHistory[_version];
140
+ }
141
+
142
+ function _updateVersionHistory(
143
+ Version newVersion,
144
+ address implementation,
145
+ address activatedBy
146
+ )
147
+ private
148
+ {
149
+ if(newVersion == VersionLib.zeroVersion()) {
150
+ revert ErrorProxyManagerZeroVersion();
151
+ }
152
+
153
+ if(_versions.length > 0) {
154
+ if(newVersion.toInt() <= _versions[_versions.length-1].toInt()) {
155
+ revert ErrorProxyManagerNextVersionNotIncreasing(newVersion);
156
+ }
157
+ }
158
+
159
+ // update version history
160
+ _versions.push(newVersion);
161
+ _versionHistory[newVersion] = VersionInfo(
162
+ newVersion,
163
+ implementation,
164
+ activatedBy,
165
+ TimestampLib.blockTimestamp(),
166
+ blockNumber()
167
+ );
168
+ }
95
169
  }