@etherisc/gif-next 0.0.2-de0a1d3-009 → 0.0.2-e37834a-021

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 (237) hide show
  1. package/README.md +40 -25
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +80 -41
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +101 -61
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +43 -40
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +0 -163
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +6 -185
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +0 -163
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +150 -126
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +110 -52
  18. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  35. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  36. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +198 -74
  37. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +1 -1
  38. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  39. package/artifacts/contracts/instance/Instance.sol/Instance.json +285 -178
  40. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  41. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +59 -53
  42. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  43. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +1 -1
  44. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  45. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  46. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +1 -1
  47. package/artifacts/contracts/instance/base/IService.sol/IService.json +45 -42
  48. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +1 -1
  49. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.json +62 -69
  50. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  51. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  52. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +1 -1
  53. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +1 -1
  54. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.json +55 -62
  55. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +1 -1
  56. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +1 -1
  57. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +1 -1
  58. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +1 -1
  59. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +1 -1
  60. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +1 -1
  61. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +1 -1
  62. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +1 -1
  63. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +1 -1
  64. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +1 -1
  65. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.json +2 -2
  66. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +1 -1
  67. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +1 -1
  68. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +1 -1
  69. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +1 -1
  70. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
  71. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +1 -1
  72. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +1 -1
  73. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.json +29 -9
  74. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
  75. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.json +28 -8
  76. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +1 -1
  77. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +1 -1
  78. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +1 -1
  79. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +2 -2
  80. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +1 -1
  81. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +1 -1
  82. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.json +138 -11
  83. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  84. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +2 -2
  85. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +1 -1
  86. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.json +138 -11
  87. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  88. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +165 -93
  89. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  90. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +87 -68
  91. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  92. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +45 -61
  93. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  94. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +45 -42
  95. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  96. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +45 -42
  97. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  98. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +45 -42
  99. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  100. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +89 -70
  101. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  102. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +117 -98
  103. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  104. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +141 -12
  105. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  106. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +5 -0
  107. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  108. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +293 -40
  109. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +4 -0
  110. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +668 -0
  111. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +4 -0
  112. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +34 -0
  113. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  114. package/artifacts/contracts/registry/Registry.sol/Registry.json +483 -120
  115. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +4 -0
  116. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +885 -0
  117. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +4 -0
  118. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +460 -0
  119. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +4 -0
  120. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.json +107 -0
  121. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  122. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  123. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +1 -1
  124. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  125. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +43 -40
  126. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  127. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +2 -2
  128. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +4 -0
  129. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +132 -0
  130. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  131. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +344 -0
  132. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  133. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +76 -37
  134. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  135. package/artifacts/contracts/shared/{Proxy.sol/ProxyWithProxyAdminGetter.json → UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json} +4 -4
  136. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  137. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +4 -27
  138. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +1 -1
  139. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +101 -61
  140. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  141. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +1 -1
  142. package/artifacts/contracts/test/TestPool.sol/TestPool.json +150 -126
  143. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +1 -1
  144. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +115 -58
  145. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  146. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +93 -39
  147. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  148. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  149. package/artifacts/contracts/test/TestService.sol/TestService.json +81 -75
  150. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  151. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  152. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  153. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  154. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +15 -38
  155. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  156. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  157. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  158. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  159. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  160. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  161. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  162. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  163. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  164. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +1 -1
  165. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  166. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  167. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  168. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  169. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  170. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  171. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  172. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  173. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +2 -2
  174. package/contracts/components/BaseComponent.sol +12 -27
  175. package/contracts/components/Distribution.sol +29 -6
  176. package/contracts/components/IBaseComponent.sol +2 -2
  177. package/contracts/components/IDistributionComponent.sol +1 -2
  178. package/contracts/components/IPoolComponent.sol +3 -10
  179. package/contracts/components/IProductComponent.sol +2 -3
  180. package/contracts/components/Pool.sol +84 -73
  181. package/contracts/components/Product.sol +85 -13
  182. package/contracts/instance/IInstance.sol +4 -3
  183. package/contracts/instance/Instance.sol +14 -3
  184. package/contracts/instance/base/ComponentServiceBase.sol +13 -6
  185. package/contracts/instance/base/IInstanceBase.sol +3 -2
  186. package/contracts/instance/base/InstanceBase.sol +6 -8
  187. package/contracts/instance/base/ServiceBase.sol +19 -13
  188. package/contracts/instance/module/component/ComponentModule.sol +5 -4
  189. package/contracts/instance/module/component/IComponent.sol +2 -2
  190. package/contracts/instance/module/pool/IPoolModule.sol +4 -3
  191. package/contracts/instance/module/pool/PoolModule.sol +12 -7
  192. package/contracts/instance/module/treasury/ITreasury.sol +7 -5
  193. package/contracts/instance/module/treasury/TokenHandler.sol +2 -2
  194. package/contracts/instance/module/treasury/TreasuryModule.sol +21 -28
  195. package/contracts/instance/service/ComponentOwnerService.sol +181 -66
  196. package/contracts/instance/service/DistributionService.sol +6 -11
  197. package/contracts/instance/service/IComponentOwnerService.sol +0 -2
  198. package/contracts/instance/service/PoolService.sol +19 -19
  199. package/contracts/instance/service/ProductService.sol +25 -24
  200. package/contracts/registry/ChainNft.sol +43 -15
  201. package/contracts/registry/IChainNft.sol +3 -2
  202. package/contracts/registry/IRegistry.sol +44 -28
  203. package/contracts/registry/IRegistryService.sol +29 -0
  204. package/contracts/registry/ITransferInterceptor.sol +6 -0
  205. package/contracts/registry/Registry.sol +382 -273
  206. package/contracts/registry/RegistryService.sol +375 -0
  207. package/contracts/registry/RegistryServiceManager.sol +52 -0
  208. package/contracts/shared/ContractDeployerLib.sol +72 -0
  209. package/contracts/shared/ERC165.sol +1 -1
  210. package/contracts/shared/IRegisterable.sol +7 -9
  211. package/contracts/shared/IVersionable.sol +40 -9
  212. package/contracts/shared/NftOwnable.sol +87 -0
  213. package/contracts/shared/ProxyManager.sol +103 -0
  214. package/contracts/shared/Registerable.sol +74 -43
  215. package/contracts/shared/UpgradableProxyWithAdmin.sol +16 -0
  216. package/contracts/shared/Versionable.sol +108 -60
  217. package/contracts/test/TestDistribution.sol +3 -2
  218. package/contracts/test/TestPool.sol +4 -2
  219. package/contracts/test/TestProduct.sol +4 -2
  220. package/contracts/test/TestRegisterable.sol +5 -6
  221. package/contracts/test/TestService.sol +5 -11
  222. package/contracts/types/Version.sol +1 -0
  223. package/package.json +1 -1
  224. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +0 -4
  225. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.json +0 -24
  226. package/artifacts/contracts/registry/RegistryUpgradeable.sol/RegistryUpgradeable.dbg.json +0 -4
  227. package/artifacts/contracts/registry/RegistryUpgradeable.sol/RegistryUpgradeable.json +0 -724
  228. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.dbg.json +0 -4
  229. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.json +0 -248
  230. package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.dbg.json +0 -4
  231. package/artifacts/contracts/shared/VersionableUpgradeable.sol/VersionableUpgradeable.dbg.json +0 -4
  232. package/artifacts/contracts/shared/VersionableUpgradeable.sol/VersionableUpgradeable.json +0 -228
  233. package/contracts/experiment/statemachine/README.md +0 -112
  234. package/contracts/registry/IRegistryLinked.sol +0 -8
  235. package/contracts/registry/RegistryUpgradeable.sol +0 -473
  236. package/contracts/shared/Proxy.sol +0 -94
  237. package/contracts/shared/VersionableUpgradeable.sol +0 -133
@@ -0,0 +1,87 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {IOwnable} from "./IOwnable.sol";
5
+ import {IRegistry} from "../registry/IRegistry.sol";
6
+ import {NftId, zeroNftId} from "../types/NftId.sol";
7
+
8
+ contract NftOwnable is
9
+ IOwnable
10
+ {
11
+ error ErrorNftOwnableUnauthorized(address account);
12
+
13
+ error ErrorAlreadyInitialized(address registry, NftId nftId);
14
+ error ErrorRegistryAlreadyInitialized(address registry);
15
+ error ErrorRegistryNotInitialized();
16
+ error ErrorRegistryAddressZero();
17
+ error ErrorContractNotRegistered(address contractAddress);
18
+
19
+ IRegistry internal _registry;
20
+ NftId private _nftId;
21
+ address private _initialOwner;
22
+
23
+ modifier onlyOwner() {
24
+ address owner = getOwner();
25
+
26
+ // owner == address(0) is eg uninitialized upgradable contract
27
+ if (owner != address(0) && msg.sender != owner) {
28
+ revert ErrorNftOwnableUnauthorized(msg.sender);
29
+ }
30
+ _;
31
+ }
32
+
33
+ constructor() {
34
+ _initialOwner = msg.sender;
35
+ }
36
+
37
+ // function only needed during bootstrapping on a new chain
38
+ function linkToRegistry(
39
+ address registryAddress,
40
+ address contractAddress
41
+ )
42
+ internal
43
+ onlyOwner()
44
+ returns (NftId)
45
+ {
46
+ if (_nftId.gtz()) {
47
+ revert ErrorAlreadyInitialized(address(_registry), _nftId);
48
+ }
49
+
50
+ if (address(_registry) != address(0)) {
51
+ revert ErrorRegistryAlreadyInitialized(address(_registry));
52
+ }
53
+
54
+ if (registryAddress == address(0)) {
55
+ revert ErrorRegistryAddressZero();
56
+ }
57
+
58
+ _registry = IRegistry(registryAddress);
59
+
60
+ if (!_registry.isRegistered(contractAddress)) {
61
+ revert ErrorContractNotRegistered(contractAddress);
62
+ }
63
+
64
+ _nftId = _registry.getNftId(contractAddress);
65
+
66
+ return _nftId;
67
+ }
68
+
69
+
70
+ function getRegistry() external view returns (IRegistry) {
71
+ return _registry;
72
+ }
73
+
74
+
75
+ function getNftId() external view returns (NftId) {
76
+ return _nftId;
77
+ }
78
+
79
+
80
+ function getOwner() public view returns (address) {
81
+ if (_nftId.gtz()) {
82
+ return _registry.ownerOf(_nftId);
83
+ }
84
+
85
+ return _initialOwner;
86
+ }
87
+ }
@@ -0,0 +1,103 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {Ownable} from "@openzeppelin5/contracts/access/Ownable.sol";
5
+ import {ProxyAdmin} from "@openzeppelin5/contracts/proxy/transparent/ProxyAdmin.sol";
6
+ import {ITransparentUpgradeableProxy} from "@openzeppelin5/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
7
+
8
+ import {IVersionable} from "./IVersionable.sol";
9
+ import {NftOwnable} from "./NftOwnable.sol";
10
+ import {UpgradableProxyWithAdmin} from "./UpgradableProxyWithAdmin.sol";
11
+
12
+ /// @dev manages proxy deployments for upgradable contracs of type IVersionable
13
+ contract ProxyManager is
14
+ NftOwnable
15
+ {
16
+
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
+
21
+ error ErrorAlreadyDeployed();
22
+ error ErrorAlreadyDeployedWithSalt();
23
+ error ErrorNotYetDeployed();
24
+
25
+ UpgradableProxyWithAdmin internal _proxy;
26
+ bool internal _isDeployed;
27
+
28
+ /// @dev only used to capture proxy owner
29
+ constructor()
30
+ NftOwnable()
31
+ { }
32
+
33
+ /// @dev deploy initial contract
34
+ function deploy(address initialImplementation, bytes memory initializationData)
35
+ public
36
+ virtual
37
+ onlyOwner()
38
+ returns (IVersionable versionable)
39
+ {
40
+ if (_isDeployed) { revert ErrorAlreadyDeployed(); }
41
+
42
+ address currentProxyOwner = getOwner(); // used by implementation
43
+ address initialProxyAdminOwner = address(this); // used by proxy
44
+ bytes memory data = getDeployData(initialImplementation, currentProxyOwner, initializationData);
45
+
46
+ _proxy = new UpgradableProxyWithAdmin(
47
+ initialImplementation,
48
+ initialProxyAdminOwner,
49
+ data
50
+ );
51
+
52
+ _isDeployed = true;
53
+ versionable = IVersionable(address(_proxy));
54
+
55
+ emit LogProxyDeployed(address(_proxy), initialImplementation);
56
+ }
57
+
58
+ function linkToRegistry(address registryAddress)
59
+ public
60
+ virtual
61
+ {
62
+ // links ownership for this proxy manager to the owner of the underlying proxy nft
63
+ // applies onlyOwner modifier internally
64
+ linkToRegistry(registryAddress, address(_proxy));
65
+ }
66
+
67
+ /// @dev upgrade existing contract
68
+ function upgrade(address newImplementation, bytes memory upgradeData)
69
+ public
70
+ virtual
71
+ onlyOwner()
72
+ returns (IVersionable versionable)
73
+ {
74
+ if (!_isDeployed) { revert ErrorNotYetDeployed(); }
75
+
76
+ address currentProxyOwner = getOwner();
77
+ ProxyAdmin proxyAdmin = getProxy().getProxyAdmin();
78
+ ITransparentUpgradeableProxy proxy = ITransparentUpgradeableProxy(address(_proxy));
79
+ bytes memory data = getUpgradeData(newImplementation, currentProxyOwner, upgradeData);
80
+
81
+ proxyAdmin.upgradeAndCall(
82
+ proxy,
83
+ newImplementation,
84
+ data);
85
+
86
+ versionable = IVersionable(address(_proxy));
87
+
88
+ emit LogProxyUpgraded(address(_proxy), newImplementation);
89
+
90
+ }
91
+
92
+ function getDeployData(address implementation, address proxyOwner, bytes memory deployData) public pure returns (bytes memory data) {
93
+ return abi.encodeWithSelector(IVersionable.initialize.selector, implementation, proxyOwner, deployData);
94
+ }
95
+
96
+ function getUpgradeData(address implementation, address proxyOwner, bytes memory upgradeData) public pure returns (bytes memory data) {
97
+ return abi.encodeWithSelector(IVersionable.upgrade.selector, implementation, proxyOwner, upgradeData);
98
+ }
99
+
100
+ function getProxy() public returns (UpgradableProxyWithAdmin) {
101
+ return _proxy;
102
+ }
103
+ }
@@ -1,21 +1,39 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {Initializable} from "@openzeppelin5/contracts/proxy/utils/Initializable.sol";
3
5
 
4
6
  import {NftId, zeroNftId} from "../types/NftId.sol";
5
7
  import {ObjectType} from "../types/ObjectType.sol";
6
8
 
7
9
  import {IRegistry} from "../registry/IRegistry.sol";
8
10
  import {IRegisterable} from "./IRegisterable.sol";
11
+ import {Versionable} from "./Versionable.sol";
9
12
 
10
13
  import {ERC165} from "./ERC165.sol";
11
14
 
12
15
  abstract contract Registerable is
13
16
  ERC165,
14
- IRegisterable
17
+ IRegisterable,
18
+ Initializable
15
19
  {
16
- IRegistry internal immutable _registry;
17
- NftId internal immutable _parentNftId;
18
- address internal immutable _initialOwner;
20
+ // keccak256(abi.encode(uint256(keccak256("gif-next.contracts.shared.Registerable.sol")) - 1)) & ~bytes32(uint256(0xff));
21
+ bytes32 public constant REGISTERABLE_LOCATION_V1 = 0x6548007c3f4340f82f348c576c0ff69f4f529cadd5ad41f96aae61abceeaa300;
22
+
23
+ struct RegisterableStorage {
24
+ IRegistry _registry;
25
+ NftId _parentNftId;
26
+ address _initialOwner;
27
+ ObjectType _objectType;
28
+ bool _isInterceptor;
29
+ bytes _data;
30
+ }
31
+
32
+ function _getRegisterableStorage() private pure returns (RegisterableStorage storage $) {
33
+ assembly {
34
+ $.slot := REGISTERABLE_LOCATION_V1
35
+ }
36
+ }
19
37
 
20
38
  modifier onlyOwner() virtual {
21
39
  require(
@@ -25,62 +43,75 @@ abstract contract Registerable is
25
43
  _;
26
44
  }
27
45
 
28
- constructor(
46
+ function _initializeRegisterable(
29
47
  address registryAddress,
30
- NftId parentNftId
48
+ NftId parentNftId,
49
+ ObjectType objectType,
50
+ bool isInterceptor,
51
+ address initialOwner,
52
+ bytes memory data
31
53
  )
32
- ERC165()
54
+ internal
55
+ //onlyInitializing//TODO uncomment when "fully" upgradeable
56
+ virtual
33
57
  {
34
58
  require(
35
- address(registryAddress) != address(0),
59
+ registryAddress != address(0),
36
60
  "ERROR:RGB-010:REGISTRY_ZERO"
37
61
  );
38
62
 
39
- _registry = IRegistry(registryAddress);
40
- require(
41
- _registry.supportsInterface(type(IRegistry).interfaceId),
42
- "ERROR:RGB-011:NOT_REGISTRY"
43
- );
63
+ // TODO check parentNftId -> registry.isRegistered(parentNftId)
64
+ // TODO check object-parent type pair -> registry.isValidTypeCombo() or something...verify with registry that setup will be able to register...
44
65
 
45
- _parentNftId = parentNftId;
66
+ IRegistry registry = IRegistry(registryAddress);
46
67
  require(
47
- _registry.isRegistered(_parentNftId),
48
- "ERROR:RGB-012:PARENT_NOT_REGISTERED"
68
+ registry.supportsInterface(type(IRegistry).interfaceId),
69
+ "ERROR:RGB-011:NOT_REGISTRY"
49
70
  );
50
71
 
51
- _initialOwner = msg.sender;
72
+ RegisterableStorage storage $ = _getRegisterableStorage();
73
+ $._registry = registry;
74
+ $._parentNftId = parentNftId;
75
+ $._objectType = objectType;
76
+ $._isInterceptor = isInterceptor;
77
+ $._initialOwner = initialOwner;// not msg.sender because called in proxy constructor where msg.sender is proxy deployer
78
+ $._data = data;
52
79
 
53
- // register support for IRegisterable
54
- _registerInterface(type(IRegisterable).interfaceId);
80
+ _registerInterface(type(Registerable).interfaceId);
55
81
  }
56
82
 
57
- // from IRegistryLinked
58
- function register() public onlyOwner virtual override returns (NftId nftId) {
59
- return _registry.register(address(this));
83
+ // from IOwnable
84
+ function getOwner() public view virtual returns (address) {
85
+ return _getRegisterableStorage()._registry.ownerOf(address(this));
60
86
  }
61
87
 
62
- function getRegistry() public view virtual override returns (IRegistry registry) {
63
- return _registry;
88
+ // from IRegisterable
89
+ function getRegistry() public view virtual returns (IRegistry registry) {
90
+ return _getRegisterableStorage()._registry;
64
91
  }
65
92
 
66
- function getOwner() public view virtual override returns (address owner) {
67
- NftId nftId = _registry.getNftId(address(this));
68
- if(nftId == zeroNftId()) {
69
- return _initialOwner;
70
- }
71
-
72
- return _registry.getOwner(nftId);
73
- }
74
-
75
- function getNftId() public view override returns (NftId nftId) {
76
- return _registry.getNftId(address(this));
93
+ function getNftId() public view virtual returns (NftId nftId) {
94
+ return _getRegisterableStorage()._registry.getNftId(address(this));
77
95
  }
78
96
 
79
- function getParentNftId() public view override returns (NftId nftId) {
80
- return _parentNftId;
81
- }
82
-
83
- function getData() public view virtual override returns (bytes memory data) {
84
- return "";
97
+ function getInitialInfo()
98
+ public
99
+ view
100
+ virtual
101
+ returns (IRegistry.ObjectInfo memory, bytes memory data)
102
+ {
103
+ RegisterableStorage storage $ = _getRegisterableStorage();
104
+ return (
105
+ IRegistry.ObjectInfo(
106
+ zeroNftId(),
107
+ $._parentNftId,
108
+ $._objectType,
109
+ $._isInterceptor,
110
+ address(this),
111
+ $._initialOwner,
112
+ $._data
113
+ ),
114
+ bytes("")
115
+ );
85
116
  }
86
- }
117
+ }
@@ -0,0 +1,16 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {ProxyAdmin} from "@openzeppelin5/contracts/proxy/transparent/ProxyAdmin.sol";
5
+ import {TransparentUpgradeableProxy, ITransparentUpgradeableProxy} from "@openzeppelin5/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
6
+
7
+ import {IVersionable} from "./IVersionable.sol";
8
+
9
+ contract UpgradableProxyWithAdmin is TransparentUpgradeableProxy {
10
+
11
+ constructor(address implementation, address initialProxyAdminOwner, bytes memory data)
12
+ TransparentUpgradeableProxy(implementation, initialProxyAdminOwner, data)
13
+ {}
14
+
15
+ function getProxyAdmin() external returns (ProxyAdmin) { return ProxyAdmin(_proxyAdmin()); }
16
+ }
@@ -1,99 +1,147 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
4
  import {Initializable} from "@openzeppelin5/contracts/proxy/utils/Initializable.sol";
5
5
 
6
6
  import {Blocknumber, blockNumber} from "../types/Blocknumber.sol";
7
7
  import {Timestamp, blockTimestamp} from "../types/Timestamp.sol";
8
- import {Version, VersionPart} from "../types/Version.sol";
8
+ import {Version, VersionPart, VersionLib} from "../types/Version.sol";
9
9
 
10
10
  import {IVersionable} from "./IVersionable.sol";
11
11
 
12
- abstract contract Versionable is Initializable, IVersionable {
13
12
 
14
- mapping(Version version => VersionInfo info) private _versionHistory;
15
- Version [] private _versions;
16
13
 
14
+ abstract contract Versionable is
15
+ Initializable,
16
+ IVersionable
17
+ {
18
+ // keccak256(abi.encode(uint256(keccak256("gif-next.contracts.shared.Versionable.sol")) - 1)) & ~bytes32(uint256(0xff))
19
+ bytes32 private constant VERSIONABLE_LOCATION_V1 = 0x4f61291a8ac3d020d0a7d919a76b8592aa88385744dee3f8b4f3873b969ed900;
17
20
 
18
- // controlled activation for controller contract
19
- constructor() {
20
- _activate(address(0), msg.sender);
21
- }
22
21
 
23
- // IMPORTANT this function needs to be implemented by each new version
24
- // and needs to call internal function call _activate()
25
- function initialize(address implementation, address activatedBy, bytes memory initializationData)
26
- external
27
- virtual
28
- {
29
- _activate(implementation, activatedBy);
22
+ /// @custom:storage-location erc7201:gif-next.contracts.shared.Versionable.sol
23
+ struct VersionableStorage {
24
+ mapping(Version version => VersionInfo info) _versionHistory;
25
+ Version [] _versions;
26
+ Version _v1;
30
27
  }
31
- // TODO mock, delete when implementations are ready
32
- function activate(address implementation, address activatedBy, bytes memory activatinData) public {}
33
- function upgrade(address implementation, address activatedBy, bytes memory upgradeData) external {}
34
28
 
35
29
 
36
- // can only be called once per contract
37
- // needs bo be called inside the proxy upgrade tx
38
- function _activate(
30
+ constructor() {
31
+ _disableInitializers();
32
+ }
33
+ // TODO write test where new version of private _updateVersionHistory is added and used...
34
+ function initialize(
39
35
  address implementation,
40
- address activatedBy
36
+ address activatedBy,
37
+ bytes memory data
41
38
  )
42
- internal
39
+ public
40
+ initializer
43
41
  {
44
- Version thisVersion = getVersion();
45
- require(
46
- !isActivated(thisVersion),
47
- "ERROR:VRN-001:VERSION_ALREADY_ACTIVATED"
48
- );
49
-
50
- // require increasing version number
51
- if(_versions.length > 0) {
52
- Version lastVersion = _versions[_versions.length - 1];
53
- require(
54
- thisVersion > lastVersion,
55
- "ERROR:VRN-002:VERSION_NOT_INCREASING"
56
- );
57
- }
42
+ _updateVersionHistory(implementation, activatedBy);
43
+ _initialize(activatedBy, data);
44
+ }
58
45
 
59
- // update version history
60
- _versions.push(thisVersion);
61
- _versionHistory[thisVersion] = VersionInfo(
62
- thisVersion,
63
- implementation,
64
- activatedBy,
65
- blockTimestamp(),
66
- blockNumber()
67
- );
46
+ // TODO activatedBy MUST ALWAYS be an owner?
47
+ function upgrade(
48
+ address implementation,
49
+ address activatedBy,
50
+ bytes memory data
51
+ )
52
+ external
53
+ reinitializer(VersionLib.toUint64(getVersion()))
54
+ {
55
+ _updateVersionHistory(implementation, activatedBy);
56
+ _upgrade(data);
57
+ }
68
58
 
69
- emit LogVersionableActivated(thisVersion, implementation, activatedBy);
59
+ function isInitialized(Version _version) public override view returns(bool) {
60
+ return _getVersionableStorage()._versionHistory[_version].activatedIn.toInt() > 0;
70
61
  }
71
62
 
63
+ function getVersion() public pure virtual returns(Version);
72
64
 
73
- function isActivated(Version _version) public override view returns(bool) {
74
- return _versionHistory[_version].activatedIn.toInt() > 0;
65
+ function getVersionCount() public view override returns(uint256) {
66
+ return _getVersionableStorage()._versions.length;
75
67
  }
76
68
 
69
+ function getVersion(uint256 idx) public view override returns(Version) {
70
+ return _getVersionableStorage()._versions[idx];
71
+ }
77
72
 
78
- function getVersion() public pure virtual returns(Version);
79
-
73
+ function getVersionInfo(Version _version) public override view returns(VersionInfo memory) {
74
+ return _getVersionableStorage()._versionHistory[_version];
75
+ }
80
76
 
81
- function getVersionCount() external view override returns(uint256) {
82
- return _versions.length;
77
+ function getInitializedVersion() public view returns(uint64) {
78
+ return _getInitializedVersion();
83
79
  }
84
80
 
85
81
 
86
- function getVersion(uint256 idx) external view override returns(Version) {
87
- return _versions[idx];
82
+
83
+ // IMPORTANT each version must implement this function
84
+ // each implementation MUST use onlyInitialising modifier
85
+ // each implementation MUST call intializers of all base contracts...
86
+ function _initialize(address owner, bytes memory data)
87
+ internal
88
+ onlyInitializing
89
+ virtual
90
+ {
91
+ revert();
88
92
  }
89
93
 
90
94
 
91
- function getVersionInfo(Version _version) external override view returns(VersionInfo memory) {
92
- return _versionHistory[_version];
95
+ // IMPORTANT each version except version "1" must implement this function
96
+ // each implementation MUST use onlyInitialising modifier
97
+ function _upgrade(bytes memory data)
98
+ internal
99
+ onlyInitializing
100
+ virtual
101
+ {
102
+ revert();
93
103
  }
94
104
 
95
- function getInitializedVersion() external view returns(uint64)
105
+ function _getVersionableStorage() private pure returns (VersionableStorage storage $) {
106
+ assembly {
107
+ $.slot := VERSIONABLE_LOCATION_V1
108
+ }
109
+ }
110
+
111
+ // can only be called once per contract
112
+ // needs to be called inside the proxy upgrade tx
113
+ // TODO run reinitializer(version().toUint64()) modifier after "version()" is checked,
114
+ function _updateVersionHistory(
115
+ address implementation,
116
+ address activatedBy
117
+ )
118
+ private
119
+ onlyInitializing
96
120
  {
97
- return _getInitializedVersion();
121
+ VersionableStorage storage $ = _getVersionableStorage();
122
+
123
+ uint64 version = _getInitializedVersion();
124
+
125
+ Version thisVersion = getVersion();
126
+
127
+ if(version == 1) {
128
+ // thisVersion is alias to version "1"
129
+ $._v1 = thisVersion;
130
+ }
131
+ else {
132
+ require(thisVersion > $._v1, "INVALID VERSION");
133
+ }
134
+
135
+ // update version history
136
+ $._versions.push(thisVersion);
137
+ $._versionHistory[thisVersion] = VersionInfo(
138
+ thisVersion,
139
+ implementation,
140
+ activatedBy,
141
+ blockTimestamp(),
142
+ blockNumber()
143
+ );
144
+
145
+ emit LogVersionableInitialized(thisVersion, implementation, activatedBy);
98
146
  }
99
147
  }
@@ -13,9 +13,10 @@ contract TestDistribution is Distribution {
13
13
  NftId instanceNftid,
14
14
  address token,
15
15
  bool isVerifying,
16
- Fee memory distributionFee
16
+ Fee memory distributionFee,
17
+ address initialOwner
17
18
  )
18
- Distribution(registry, instanceNftid, token, isVerifying, distributionFee)
19
+ Distribution(registry, instanceNftid, token, isVerifying, distributionFee, initialOwner)
19
20
  // solhint-disable-next-line no-empty-blocks
20
21
  {}
21
22
  }
@@ -13,13 +13,15 @@ contract TestPool is Pool {
13
13
  address registry,
14
14
  NftId instanceNftid,
15
15
  address token,
16
+ bool isInterceptor,
16
17
  bool isVerifying,
17
18
  UFixed collateralizationLevel,
18
19
  Fee memory poolFee,
19
20
  Fee memory stakingFee,
20
- Fee memory performanceFee
21
+ Fee memory performanceFee,
22
+ address initialOwner
21
23
  )
22
- Pool(registry, instanceNftid, token, isVerifying, collateralizationLevel, poolFee, stakingFee, performanceFee)
24
+ Pool(registry, instanceNftid, token, isInterceptor, isVerifying, collateralizationLevel, poolFee, stakingFee, performanceFee, initialOwner)
23
25
  // solhint-disable-next-line no-empty-blocks
24
26
  {}
25
27
  }
@@ -19,12 +19,14 @@ contract TestProduct is Product {
19
19
  address registry,
20
20
  NftId instanceNftid,
21
21
  address token,
22
+ bool isInterceptor,
22
23
  address pool,
23
24
  address distribution,
24
25
  Fee memory productFee,
25
- Fee memory processingFee
26
+ Fee memory processingFee,
27
+ address initialOwner
26
28
  )
27
- Product(registry, instanceNftid, token, pool, distribution, productFee, processingFee)
29
+ Product(registry, instanceNftid, token, isInterceptor, pool, distribution, productFee, processingFee, initialOwner)
28
30
  // solhint-disable-next-line no-empty-blocks
29
31
  {
30
32
  }
@@ -8,12 +8,11 @@ import {Registerable} from "../../contracts/shared/Registerable.sol";
8
8
 
9
9
  contract TestRegisterable is Registerable {
10
10
 
11
- constructor(address registry, NftId registryNftId)
12
- Registerable(registry, registryNftId)
11
+ constructor(address registry, NftId registryNftId, ObjectType objectType, bool isInterceptor, address initialOwner)
12
+ //Registerable(registry, registryNftId)
13
13
  // solhint-disable-next-line no-empty-blocks
14
- {}
15
-
16
- function getType() external pure override returns (ObjectType) {
17
- return TOKEN();
14
+ {
15
+ bytes memory data = "";
16
+ _initializeRegisterable(registry, registryNftId, objectType, isInterceptor, initialOwner, data);
18
17
  }
19
18
  }
@@ -8,25 +8,19 @@ import {ServiceBase} from "../../contracts/instance/base/ServiceBase.sol";
8
8
  import {IVersionable} from "../../contracts/shared/IVersionable.sol";
9
9
  import {Versionable} from "../../contracts/shared/Versionable.sol";
10
10
 
11
+ //import {IService} from "../../contracts/instance/base/IService.sol";
12
+
11
13
  contract TestService is ServiceBase {
12
14
 
13
15
  string public constant NAME = "TestService";
14
16
 
15
- constructor(address registry, NftId registryNftId)
16
- ServiceBase(registry, registryNftId)
17
+ constructor(address registry, NftId registryNftId, address initialOwner)
17
18
  // solhint-disable-next-line no-empty-blocks
18
- {}
19
-
20
- function getVersion()
21
- public
22
- pure
23
- virtual override (IVersionable, Versionable)
24
- returns(Version)
25
19
  {
26
- return VersionLib.toVersion(3,0,0);
20
+ _initializeServiceBase(registry, registryNftId, initialOwner);
27
21
  }
28
22
 
29
- function getName() external pure override returns(string memory name) {
23
+ function getName() public pure override returns(string memory name) {
30
24
  return NAME;
31
25
  }
32
26
  }