@etherisc/gif-next 0.0.2-bca36d7-613 → 0.0.2-bdd64e2-180

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 (185) hide show
  1. package/README.md +4 -0
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +13 -0
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +75 -15
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +13 -0
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +52 -0
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  12. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  13. package/artifacts/contracts/components/Pool.sol/Pool.json +112 -13
  14. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  15. package/artifacts/contracts/components/Product.sol/Product.json +39 -18
  16. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
  18. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +2 -2
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +2 -2
  35. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  36. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
  37. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  38. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  39. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +1 -1
  40. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.json +0 -13
  41. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +1 -1
  42. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
  43. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  44. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +403 -1
  45. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  46. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  47. package/artifacts/contracts/instance/Instance.sol/Instance.json +124 -101
  48. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  49. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +34 -47
  50. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  51. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +143 -38
  52. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  53. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +169 -33
  54. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  55. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +71 -11
  56. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  57. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +5 -0
  58. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  59. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  60. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  61. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  62. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +2 -2
  63. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  64. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
  65. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  66. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  67. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  68. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  69. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  70. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  71. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  72. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  73. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +18 -18
  74. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  75. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +657 -0
  76. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
  77. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +436 -0
  78. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  79. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  80. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  82. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  83. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +796 -0
  84. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
  85. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +448 -0
  86. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  87. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  88. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +309 -0
  89. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  90. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +0 -19
  91. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  92. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  93. package/artifacts/contracts/registry/Registry.sol/Registry.json +258 -24
  94. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  95. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +20 -44
  96. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  97. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +49 -28
  98. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
  99. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +410 -0
  100. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  101. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  102. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  103. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  104. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  105. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  106. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  107. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  108. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  109. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  110. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  111. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  112. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +4 -4
  113. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
  114. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  115. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  116. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  117. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
  118. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  119. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  120. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  121. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
  122. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  123. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  124. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  125. package/artifacts/contracts/test/TestService.sol/TestService.json +11 -11
  126. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  127. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  128. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  129. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  130. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +2 -2
  131. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  132. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  133. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  134. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  135. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  136. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  137. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  138. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  139. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  140. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  141. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  142. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  143. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  144. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  145. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  146. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  147. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  148. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  149. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  150. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  151. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  152. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  153. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  154. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +22 -3
  155. package/contracts/components/BaseComponent.sol +8 -3
  156. package/contracts/components/Distribution.sol +13 -13
  157. package/contracts/components/IBaseComponent.sol +1 -0
  158. package/contracts/components/IDistributionComponent.sol +3 -0
  159. package/contracts/components/Pool.sol +15 -27
  160. package/contracts/components/Product.sol +1 -1
  161. package/contracts/instance/AccessManagedSimple.sol +1 -8
  162. package/contracts/instance/IInstance.sol +15 -4
  163. package/contracts/instance/Instance.sol +16 -15
  164. package/contracts/instance/InstanceAccessManager.sol +1 -1
  165. package/contracts/instance/InstanceReader.sol +17 -1
  166. package/contracts/instance/InstanceService.sol +51 -7
  167. package/contracts/instance/base/ComponentServiceBase.sol +2 -10
  168. package/contracts/instance/module/IBundle.sol +1 -0
  169. package/contracts/instance/module/ISetup.sol +1 -0
  170. package/contracts/instance/service/DistributionService.sol +105 -0
  171. package/contracts/instance/service/DistributionServiceManager.sol +53 -0
  172. package/contracts/instance/service/PoolService.sol +211 -0
  173. package/contracts/instance/service/PoolServiceManager.sol +53 -0
  174. package/contracts/registry/IRegistry.sol +38 -2
  175. package/contracts/registry/IRegistryService.sol +0 -2
  176. package/contracts/registry/Registry.sol +94 -28
  177. package/contracts/registry/RegistryService.sol +2 -47
  178. package/contracts/registry/RegistryServiceManager.sol +21 -5
  179. package/contracts/registry/TokenRegistry.sol +111 -0
  180. package/contracts/shared/ERC165.sol +6 -2
  181. package/contracts/shared/Registerable.sol +1 -0
  182. package/contracts/types/RoleId.sol +7 -0
  183. package/contracts/types/StateId.sol +4 -0
  184. package/contracts/types/Version.sol +4 -1
  185. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {IVersionable} from "../../shared/IVersionable.sol";
5
+ import {ProxyManager} from "../../shared/ProxyManager.sol";
6
+ import {DistributionService} from "./DistributionService.sol";
7
+ import {Registry} from "../../registry/Registry.sol";
8
+ import {RegistryService} from "../../registry/RegistryService.sol";
9
+ import {VersionLib} from "../../types/Version.sol";
10
+
11
+ contract DistributionServiceManager is ProxyManager {
12
+
13
+ DistributionService private _distributionService;
14
+
15
+ /// @dev initializes proxy manager with distribution service implementation and deploys instance
16
+ constructor(
17
+ address registryAddress
18
+ )
19
+ ProxyManager()
20
+ {
21
+ DistributionService distSrv = new DistributionService();
22
+ bytes memory data = abi.encode(registryAddress, address(this));
23
+ IVersionable versionable = deploy(
24
+ address(distSrv),
25
+ data);
26
+
27
+ _distributionService = DistributionService(address(versionable));
28
+
29
+ Registry registry = Registry(registryAddress);
30
+ address registryServiceAddress = registry.getServiceAddress("RegistryService", VersionLib.toVersion(3, 0, 0).toMajorPart());
31
+ RegistryService registryService = RegistryService(registryServiceAddress);
32
+
33
+ registryService.registerService(_distributionService);
34
+
35
+ // link ownership of instance service manager ot nft owner of instance service
36
+ _linkToNftOwnable(
37
+ address(registryAddress),
38
+ address(_distributionService));
39
+
40
+ // implies that after this constructor call only upgrade functionality is available
41
+ _isDeployed = true;
42
+ }
43
+
44
+ //--- view functions ----------------------------------------------------//
45
+ function getDistributionService()
46
+ external
47
+ view
48
+ returns (DistributionService distributionService)
49
+ {
50
+ return _distributionService;
51
+ }
52
+
53
+ }
@@ -0,0 +1,211 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {Pool} from "../../components/Pool.sol";
5
+ import {IRegistry} from "../../registry/IRegistry.sol";
6
+ import {IInstance} from "../../instance/IInstance.sol";
7
+ import {IBundle} from "../../instance/module/IBundle.sol";
8
+ import {TokenHandler} from "../../instance/module/ITreasury.sol";
9
+ import {ISetup} from "../module/ISetup.sol";
10
+
11
+ import {IVersionable} from "../../shared/IVersionable.sol";
12
+ import {Versionable} from "../../shared/Versionable.sol";
13
+ import {INftOwnable} from "../../shared/INftOwnable.sol";
14
+
15
+ import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
16
+ import {POOL, BUNDLE} from "../../types/ObjectType.sol";
17
+ import {POOL_OWNER_ROLE} from "../../types/RoleId.sol";
18
+ import {Fee, FeeLib} from "../../types/Fee.sol";
19
+ import {Version, VersionLib} from "../../types/Version.sol";
20
+ import {KEEP_STATE} from "../../types/StateId.sol";
21
+ import {zeroTimestamp} from "../../types/Timestamp.sol";
22
+
23
+ import {IService} from "../../shared/IService.sol";
24
+ import {Service} from "../../shared/Service.sol";
25
+ import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
26
+ import {IPoolService} from "./IPoolService.sol";
27
+ import {IRegistryService} from "../../registry/IRegistryService.sol";
28
+ import {InstanceService} from "../InstanceService.sol";
29
+ import {InstanceReader} from "../InstanceReader.sol";
30
+
31
+
32
+ string constant POOL_SERVICE_NAME = "PoolService";
33
+
34
+ contract PoolService is
35
+ ComponentServiceBase,
36
+ IPoolService
37
+ {
38
+ using NftIdLib for NftId;
39
+
40
+ string public constant NAME = "PoolService";
41
+
42
+ address internal _registryAddress;
43
+ InstanceService internal _instanceService;
44
+
45
+ function _initialize(
46
+ address owner,
47
+ bytes memory data
48
+ )
49
+ internal
50
+ initializer
51
+ virtual override
52
+ {
53
+ address initialOwner = address(0);
54
+ (_registryAddress, initialOwner) = abi.decode(data, (address, address));
55
+
56
+ IRegistry registry = IRegistry(_registryAddress);
57
+ _instanceService = InstanceService(registry.getServiceAddress("InstanceService", getMajorVersion()));
58
+
59
+ _initializeService(_registryAddress, initialOwner);
60
+
61
+ _registerInterface(type(IService).interfaceId);
62
+ _registerInterface(type(IPoolService).interfaceId);
63
+ }
64
+
65
+ function getName() public pure override(Service, IService) returns(string memory name) {
66
+ return NAME;
67
+ }
68
+
69
+ function register(address poolComponentAddress)
70
+ external
71
+ returns (NftId poolNftId)
72
+ {
73
+ address componentOwner = msg.sender;
74
+ Pool pool = Pool(poolComponentAddress);
75
+ IInstance instance = pool.getInstance();
76
+ INftOwnable nftOwnable = INftOwnable(address(instance));
77
+
78
+ require(_instanceService.hasRole(componentOwner, POOL_OWNER_ROLE(), nftOwnable.getNftId()), "ERROR:POS-001:NOT_POOL_OWNER_ROLE");
79
+
80
+ IRegistryService registryService = getRegistryService();
81
+ (IRegistry.ObjectInfo memory poolObjInfo, ) = registryService.registerPool(
82
+ pool,
83
+ componentOwner
84
+ );
85
+ poolNftId = poolObjInfo.nftId;
86
+
87
+ ISetup.PoolSetupInfo memory initialSetup = pool.getInitialSetupInfo();
88
+ instance.createPoolSetup(poolNftId, initialSetup);
89
+ }
90
+
91
+ function setFees(
92
+ Fee memory poolFee,
93
+ Fee memory stakingFee,
94
+ Fee memory performanceFee
95
+ )
96
+ external
97
+ override
98
+ {
99
+ (IRegistry.ObjectInfo memory poolInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
100
+ InstanceReader instanceReader = instance.getInstanceReader();
101
+ NftId poolNftId = poolInfo.nftId;
102
+
103
+ ISetup.PoolSetupInfo memory poolSetupInfo = instanceReader.getPoolSetupInfo(poolNftId);
104
+ poolSetupInfo.poolFee = poolFee;
105
+ poolSetupInfo.stakingFee = stakingFee;
106
+ poolSetupInfo.performanceFee = performanceFee;
107
+
108
+ instance.updatePoolSetup(poolNftId, poolSetupInfo, KEEP_STATE());
109
+ }
110
+
111
+ function createBundle(
112
+ address owner,
113
+ Fee memory fee,
114
+ uint256 stakingAmount,
115
+ uint256 lifetime,
116
+ bytes calldata filter
117
+ )
118
+ external
119
+ override
120
+ returns(NftId bundleNftId)
121
+ {
122
+ (IRegistry.ObjectInfo memory info, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
123
+ InstanceReader instanceReader = instance.getInstanceReader();
124
+ NftId poolNftId = info.nftId;
125
+
126
+ IBundle.BundleInfo memory bundleInfo = IBundle.BundleInfo(
127
+ poolNftId,
128
+ FeeLib.zeroFee(),
129
+ filter,
130
+ stakingAmount,
131
+ 0,
132
+ stakingAmount,
133
+ lifetime,
134
+ zeroTimestamp(),
135
+ zeroTimestamp()
136
+ );
137
+
138
+ // register bundle with registry
139
+ bundleNftId = getRegistryService().registerBundle(
140
+ IRegistry.ObjectInfo(
141
+ zeroNftId(),
142
+ poolNftId,
143
+ BUNDLE(),
144
+ false, // intercepting property for bundles is defined on pool
145
+ address(0),
146
+ owner,
147
+ abi.encode(bundleInfo)
148
+ )
149
+ );
150
+
151
+ // create bundle info in instance
152
+ instance.createBundle(bundleNftId, bundleInfo);
153
+
154
+ // TODO add bundle to pool in instance
155
+
156
+ // TODO collect capital
157
+ // _processStakingByTreasury(
158
+ // instanceReader,
159
+ // zeroNftId(),
160
+ // poolNftId,
161
+ // bundleNftId,
162
+ // stakingAmount);
163
+
164
+ // TODO add logging
165
+ }
166
+
167
+ function setBundleFee(
168
+ NftId bundleNftId,
169
+ Fee memory fee
170
+ )
171
+ external
172
+ override
173
+ {
174
+ (IRegistry.ObjectInfo memory info , IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
175
+ InstanceReader instanceReader = instance.getInstanceReader();
176
+ NftId poolNftId = info.nftId;
177
+
178
+ IBundle.BundleInfo memory bundleInfo = instanceReader.getBundleInfo(bundleNftId);
179
+ require(bundleInfo.poolNftId.gtz(), "ERROR:PLS-010:BUNDLE_UNKNOWN");
180
+ require(poolNftId == bundleInfo.poolNftId, "ERROR:PLS-011:BUNDLE_POOL_MISMATCH");
181
+
182
+ bundleInfo.fee = fee;
183
+
184
+ instance.updateBundle(bundleNftId, bundleInfo, KEEP_STATE());
185
+ }
186
+
187
+
188
+
189
+ function _processStakingByTreasury(
190
+ InstanceReader instanceReader,
191
+ NftId productNftId,
192
+ NftId poolNftId,
193
+ NftId bundleNftId,
194
+ uint256 stakingAmount
195
+ )
196
+ internal
197
+ {
198
+ // process token transfer(s)
199
+ if(stakingAmount > 0) {
200
+ TokenHandler tokenHandler = TokenHandler(instanceReader.getTokenHandler(productNftId));
201
+ address bundleOwner = getRegistry().ownerOf(bundleNftId);
202
+ ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
203
+
204
+ tokenHandler.transfer(
205
+ bundleOwner,
206
+ poolInfo.wallet,
207
+ stakingAmount
208
+ );
209
+ }
210
+ }
211
+ }
@@ -0,0 +1,53 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {IVersionable} from "../../shared/IVersionable.sol";
5
+ import {ProxyManager} from "../../shared/ProxyManager.sol";
6
+ import {PoolService} from "./PoolService.sol";
7
+ import {Registry} from "../../registry/Registry.sol";
8
+ import {RegistryService} from "../../registry/RegistryService.sol";
9
+ import {VersionLib} from "../../types/Version.sol";
10
+
11
+ contract PoolServiceManager is ProxyManager {
12
+
13
+ PoolService private _poolService;
14
+
15
+ /// @dev initializes proxy manager with pool service implementation
16
+ constructor(
17
+ address registryAddress
18
+ )
19
+ ProxyManager()
20
+ {
21
+ PoolService poolSrv = new PoolService();
22
+ bytes memory data = abi.encode(registryAddress, address(this));
23
+ IVersionable versionable = deploy(
24
+ address(poolSrv),
25
+ data);
26
+
27
+ _poolService = PoolService(address(versionable));
28
+
29
+ Registry registry = Registry(registryAddress);
30
+ address registryServiceAddress = registry.getServiceAddress("RegistryService", VersionLib.toVersion(3, 0, 0).toMajorPart());
31
+ RegistryService registryService = RegistryService(registryServiceAddress);
32
+
33
+ registryService.registerService(_poolService);
34
+
35
+ // link ownership of instance service manager ot nft owner of instance service
36
+ _linkToNftOwnable(
37
+ address(registryAddress),
38
+ address(_poolService));
39
+
40
+ // implies that after this constructor call only upgrade functionality is available
41
+ _isDeployed = true;
42
+ }
43
+
44
+ //--- view functions ----------------------------------------------------//
45
+ function getPoolService()
46
+ external
47
+ view
48
+ returns (PoolService poolService)
49
+ {
50
+ return _poolService;
51
+ }
52
+
53
+ }
@@ -10,10 +10,33 @@ import {VersionPart} from "../types/Version.sol";
10
10
 
11
11
  interface IRegistry is IERC165 {
12
12
 
13
+ event LogInitialMajorVersionSet(VersionPart majorVersion);
14
+ event LogMajorVersionSet(VersionPart majorVersionMax);
13
15
  event LogRegistration(ObjectInfo info);
14
-
16
+ event LogTokenStateSet(address token, VersionPart majorVersion, bool active);
15
17
  event LogServiceNameRegistration(string serviceName, VersionPart majorVersion);
16
18
 
19
+ // supported versions
20
+ error MajorVersionMaxIncreaseInvalid(VersionPart newMajorVersionMax, VersionPart existingMaxMajorVersion);
21
+
22
+ // token whitelisting
23
+ error TokenNotRegistered(address token);
24
+ error NotToken(address token);
25
+ error TokenMajorVersionInvalid(VersionPart majorVersion);
26
+
27
+ // register
28
+ error NotRegistryService();
29
+ error ZeroParentAddress();
30
+ error ContractAlreadyRegistered(address objectAddress);
31
+ error InvalidServiceVersion(VersionPart majorVersion);
32
+ error ServiceNameAlreadyRegistered(string name, VersionPart majorVersion);
33
+
34
+ // approve
35
+ error NotOwner(address account);
36
+ error NotRegisteredContract(NftId registrarNftId);
37
+ error NotService(NftId registrarNftId);
38
+ error InvalidTypesCombination(ObjectType objectType, ObjectType parentType);
39
+
17
40
 
18
41
  struct ObjectInfo {
19
42
  NftId nftId;
@@ -26,11 +49,22 @@ interface IRegistry is IERC165 {
26
49
  }// TODO delete nftId and initialOwner(if not used) from struct
27
50
  // TODO strong disagree, keep nftId there (lets keep get object info return object consistent)
28
51
 
52
+ function setMajorVersion(VersionPart newMajorVersionMax) external;
53
+
29
54
  function register(ObjectInfo memory info) external returns (NftId nftId);
30
-
55
+
56
+ function setTokenActive(address token, VersionPart majorVersion, bool active) external;
57
+
58
+ function getMajorVersionMin() external view returns (VersionPart);
59
+
60
+ function getMajorVersionMax() external view returns (VersionPart);
61
+
62
+ function getMajorVersion() external view returns (VersionPart);
31
63
 
32
64
  function getObjectCount() external view returns (uint256);
33
65
 
66
+ function getNftId() external view returns (NftId nftId);
67
+
34
68
  function getNftId(address objectAddress) external view returns (NftId nftId);
35
69
 
36
70
  function ownerOf(NftId nftId) external view returns (address);
@@ -45,6 +79,8 @@ interface IRegistry is IERC165 {
45
79
 
46
80
  function isRegistered(address contractAddress) external view returns (bool);
47
81
 
82
+ function isTokenActive(address token, VersionPart majorVersion) external view returns (bool);
83
+
48
84
  function getServiceName(NftId nftId) external view returns (string memory name);
49
85
 
50
86
  function getServiceAddress(
@@ -12,8 +12,6 @@ import {IBaseComponent} from "../components/IBaseComponent.sol";
12
12
 
13
13
  interface IRegistryService is IService {
14
14
 
15
- function registerToken(address tokenAddress) external returns(NftId nftId);
16
-
17
15
  function registerService(IService service) external returns(IRegistry.ObjectInfo memory info, bytes memory data);
18
16
 
19
17
  function registerInstance(IRegisterable instance)
@@ -7,7 +7,7 @@ import {IService} from "../shared/IService.sol";
7
7
  import {ChainNft} from "./ChainNft.sol";
8
8
  import {IRegistry} from "./IRegistry.sol";
9
9
  import {NftId, toNftId, zeroNftId, NftIdLib} from "../types/NftId.sol";
10
- import {Version, VersionPart, VersionLib} from "../types/Version.sol";
10
+ import {Version, VersionPart, VersionLib, VersionPartLib} from "../types/Version.sol";
11
11
  import {ObjectType, PROTOCOL, REGISTRY, TOKEN, SERVICE, INSTANCE, STAKE, PRODUCT, DISTRIBUTION, ORACLE, POOL, POLICY, BUNDLE} from "../types/ObjectType.sol";
12
12
  import {ITransferInterceptor} from "./ITransferInterceptor.sol";
13
13
 
@@ -28,24 +28,13 @@ contract Registry is
28
28
  ERC165,
29
29
  IRegistry
30
30
  {
31
- // register
32
- error NotRegistryService();
33
- error ZeroParentAddress();
34
- error ContractAlreadyRegistered(address objectAddress);
35
- error InvalidServiceVersion(VersionPart majorVersion);
36
- error ServiceNameAlreadyRegistered(string name, VersionPart majorVersion);
37
-
38
- // approve
39
- error NotOwner();
40
- error NotRegisteredContract(NftId registrarNftId);
41
- error NotService(NftId registrarNftId);
42
- error InvalidTypesCombination(ObjectType objectType, ObjectType parentType);
43
-
44
- uint256 public constant MAJOR_VERSION_MIN = 3;
31
+ uint256 public constant GIF_MAJOR_VERSION_AT_DEPLOYMENT = 3;
45
32
  address public constant NFT_LOCK_ADDRESS = address(0x1);
46
33
  uint256 public constant REGISTRY_SERVICE_TOKEN_SEQUENCE_ID = 3;
47
34
  string public constant EMPTY_URI = "";
48
35
 
36
+ VersionPart internal _majorVersion;
37
+
49
38
  mapping(NftId nftId => ObjectInfo info) internal _info;
50
39
  mapping(address object => NftId nftId) internal _nftIdByAddress;
51
40
 
@@ -58,6 +47,9 @@ contract Registry is
58
47
  mapping(ObjectType objectType => mapping(
59
48
  ObjectType parentType => bool)) internal _isValidObjectCombination;
60
49
 
50
+ mapping(address token => mapping(
51
+ VersionPart majorVersion => bool isActive)) internal _tokenIsActive;
52
+
61
53
  mapping(NftId nftId => string name) internal _string;
62
54
  mapping(bytes32 serviceNameHash => mapping(
63
55
  VersionPart majorVersion => address service)) internal _service;
@@ -69,7 +61,7 @@ contract Registry is
69
61
 
70
62
  modifier onlyOwner() {
71
63
  if(msg.sender != getOwner()) {
72
- revert NotOwner();
64
+ revert NotOwner(msg.sender);
73
65
  }
74
66
  _;
75
67
  }
@@ -85,7 +77,10 @@ contract Registry is
85
77
  constructor(address registryOwner, VersionPart majorVersion)
86
78
  {
87
79
  require(registryOwner > address(0), "Registry: registry owner is 0");
88
- require(majorVersion.toInt() == MAJOR_VERSION_MIN, "Registry: initial major version of registry service is not MAJOR_VERSION_MIN");
80
+
81
+ // major version at constructor time
82
+ _majorVersion = VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
83
+ emit LogInitialMajorVersionSet(_majorVersion);
89
84
 
90
85
  // deploy NFT
91
86
  _chainNft = new ChainNft(address(this));// adds 10kb to deployment size
@@ -101,6 +96,24 @@ contract Registry is
101
96
  _registerInterface(type(IRegistry).interfaceId);
102
97
  }
103
98
 
99
+ // from IRegistry
100
+
101
+ /// @dev latest GIF release version
102
+ function setMajorVersion(VersionPart newMajorVersion)
103
+ external
104
+ onlyOwner
105
+ {
106
+ // ensure major version increments is one
107
+ uint256 oldMax = _majorVersion.toInt();
108
+ uint256 newMax = newMajorVersion.toInt();
109
+ if (newMax <= oldMax || newMax - oldMax != 1) {
110
+ revert MajorVersionMaxIncreaseInvalid(newMajorVersion, _majorVersion);
111
+ }
112
+
113
+ _majorVersion = newMajorVersion;
114
+ emit LogMajorVersionSet(_majorVersion);
115
+ }
116
+
104
117
  /// @dev registry protects only against tampering existing records, registering with invalid types pairs and 0 parent address
105
118
  // TODO service registration means its approval for some type?
106
119
  // TODO registration of precompile addresses
@@ -169,12 +182,67 @@ contract Registry is
169
182
  emit LogRegistration(info);
170
183
  }
171
184
 
172
- // from IRegistry
185
+ /// @dev token state is informative, registry have no clue about used tokens
186
+ // component owner is responsible for token selection and operations
187
+ // service MUST deny registration of component with inactive token
188
+ function setTokenActive(address token, VersionPart majorVersion, bool active)
189
+ external
190
+ onlyOwner
191
+ {
192
+ // verify that token is registered
193
+ ObjectInfo memory info = _info[_nftIdByAddress[token]];
194
+ if (info.nftId.eqz()) {
195
+ revert TokenNotRegistered(token);
196
+ }
197
+
198
+ // verify provided address is a registered token
199
+ if (info.objectType != TOKEN()) {
200
+ revert NotToken(token);
201
+ }
202
+
203
+ // verify valid major version
204
+ // ensure major version increments is one
205
+ uint256 version = majorVersion.toInt();
206
+ uint256 versionNow = _majorVersion.toInt();
207
+ if (version < GIF_MAJOR_VERSION_AT_DEPLOYMENT || version > versionNow) {
208
+ revert TokenMajorVersionInvalid(majorVersion);
209
+ }
210
+
211
+ _tokenIsActive[token][majorVersion] = active;
212
+
213
+ emit LogTokenStateSet(token, majorVersion, active);
214
+ }
215
+
216
+ /// @dev earliest GIF major version
217
+ function getMajorVersionMin() external view returns (VersionPart) {
218
+ return VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
219
+ }
220
+
221
+ // TODO make distinction between active an not yet active version
222
+ // need to be thought trough, not yet clear if necessary
223
+ // need to answer question: what is the latest version during the upgrade process?
224
+ // likely setting up a new gif version does not fit into a single tx
225
+ // in this case we might want to have a period where the latest version is
226
+ // in the process of being set up while the latest active version is 1 major release smaller
227
+ /// @dev latest GIF major version (might not yet be active)
228
+ function getMajorVersionMax() external view returns (VersionPart) {
229
+ return _majorVersion;
230
+ }
231
+
232
+ /// @dev latest active GIF release version
233
+ function getMajorVersion() external view returns (VersionPart) {
234
+ return _majorVersion;
235
+ }
236
+
237
+
173
238
  function getObjectCount() external view override returns (uint256) {
174
-
175
239
  return _chainNft.totalSupply();
176
240
  }
177
241
 
242
+ function getNftId() external view returns (NftId nftId) {
243
+ return _registryNftId;
244
+ }
245
+
178
246
  function getNftId(address object) external view override returns (NftId id) {
179
247
  return _nftIdByAddress[object];
180
248
  }
@@ -205,6 +273,10 @@ contract Registry is
205
273
  return _nftIdByAddress[object].gtz();
206
274
  }
207
275
 
276
+ function isTokenActive(address token, VersionPart majorVersion) external view returns (bool) {
277
+ return _tokenIsActive[token][majorVersion];
278
+ }
279
+
208
280
  function getServiceName(NftId nftId) external view returns (string memory) {
209
281
  return _string[nftId];
210
282
  }
@@ -238,14 +310,8 @@ contract Registry is
238
310
  ) = abi.decode(info.data, (string, VersionPart));
239
311
  bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
240
312
 
241
- // TODO MUST guarantee consistency of service.getVersion() and majorVersion here
242
- // TODO update _serviceNftId when registryService with new major version is registered? -> it is fixed in current setup -> can lock up
243
- // TODO do not use names -> each object type is registered by corresponding service -> conflicting with approve()
244
- if(
245
- majorVersion.toInt() < MAJOR_VERSION_MIN ||
246
- (majorVersion.toInt() > MAJOR_VERSION_MIN &&
247
- _service[serviceNameHash][VersionLib.toVersionPart(majorVersion.toInt() - 1)] == address(0) )
248
- ) {
313
+ // ensures consistency of service.getVersion() and majorVersion here
314
+ if(majorVersion != _majorVersion) {
249
315
  revert InvalidServiceVersion(majorVersion);
250
316
  }
251
317
 
@@ -386,7 +452,7 @@ contract Registry is
386
452
 
387
453
  string memory serviceName = "RegistryService";
388
454
  bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
389
- _service[serviceNameHash][VersionLib.toVersionPart(MAJOR_VERSION_MIN)] = msg.sender;
455
+ _service[serviceNameHash][VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT)] = msg.sender;
390
456
  _string[serviceNftId] = serviceName;
391
457
  _serviceNftId = serviceNftId;
392
458
  }
@@ -1,9 +1,7 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.20;
3
3
 
4
- import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
5
4
  import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
6
- import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
7
5
  import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";
8
6
 
9
7
  import {IRegistry} from "./IRegistry.sol";
@@ -22,7 +20,7 @@ import {Versionable} from "../../contracts/shared/Versionable.sol";
22
20
  import {IRegisterable} from "../../contracts/shared/IRegisterable.sol";
23
21
 
24
22
  import {RoleId, PRODUCT_OWNER_ROLE, POOL_OWNER_ROLE, ORACLE_OWNER_ROLE} from "../../contracts/types/RoleId.sol";
25
- import {ObjectType, REGISTRY, TOKEN, SERVICE, PRODUCT, ORACLE, POOL, TOKEN, INSTANCE, DISTRIBUTION, POLICY, BUNDLE} from "../../contracts/types/ObjectType.sol";
23
+ import {ObjectType, REGISTRY, SERVICE, PRODUCT, ORACLE, POOL, INSTANCE, DISTRIBUTION, POLICY, BUNDLE} from "../../contracts/types/ObjectType.sol";
26
24
  import {StateId, ACTIVE, PAUSED} from "../../contracts/types/StateId.sol";
27
25
  import {NftId, NftIdLib, zeroNftId} from "../../contracts/types/NftId.sol";
28
26
  import {Fee, FeeLib} from "../../contracts/types/Fee.sol";
@@ -41,10 +39,10 @@ contract RegistryService is
41
39
  {
42
40
  using NftIdLib for NftId;
43
41
 
42
+ // TODO move errors to interface contract
44
43
  error SelfRegistration();
45
44
  error NotRegistryOwner();
46
45
 
47
- error NotToken();
48
46
  error NotService();
49
47
  error NotInstance();
50
48
  error NotProduct();
@@ -58,7 +56,6 @@ contract RegistryService is
58
56
  error InvalidInitialOwner(address initialOwner);
59
57
  error InvalidAddress(address registerableAddress);
60
58
 
61
-
62
59
  // Initial value for constant variable has to be compile-time constant
63
60
  // TODO define types as constants?
64
61
  //ObjectType public constant SERVICE_TYPE = REGISTRY();
@@ -69,48 +66,6 @@ contract RegistryService is
69
66
 
70
67
  address public constant NFT_LOCK_ADDRESS = address(0x1);
71
68
 
72
- /// @dev
73
- // msg.sender - ONLY registry owner
74
- // CAN NOT register itself
75
- // CAN NOT register IRegisterable address
76
- // CAN register ONLY valid object-parent types combinations for TOKEN
77
- // IMPORTANT: MUST NOT call untrusted contract inbetween calls to registry/instance (trusted contracts)
78
- // motivation: registry/instance state may change during external call
79
- // TODO it may be usefull to have transferable token nft in order to delist token, make it invalid for new beginings
80
- // TODO: MUST prohibit registration of precompiles addresses
81
- function registerToken(address tokenAddress)
82
- external
83
- returns(NftId nftId)
84
- {
85
- if(msg.sender == tokenAddress) {
86
- revert SelfRegistration();
87
- }
88
-
89
- // MUST not revert if no ERC165 support
90
- if(tokenAddress.code.length == 0 ||
91
- ERC165Checker.supportsInterface(tokenAddress, type(IRegisterable).interfaceId)) {
92
- revert NotToken();
93
- }
94
-
95
- NftId registryNftId = _registry.getNftId(address(_registry));
96
-
97
- if(msg.sender != _registry.ownerOf(registryNftId)) {
98
- revert NotRegistryOwner();
99
- }
100
-
101
- IRegistry.ObjectInfo memory info = IRegistry.ObjectInfo(
102
- zeroNftId(), // any value
103
- registryNftId, // parent nft id
104
- TOKEN(),
105
- false, // isInterceptor
106
- tokenAddress,
107
- NFT_LOCK_ADDRESS,
108
- "" // any value
109
- );
110
-
111
- nftId = _registry.register(info);
112
- }
113
-
114
69
  /// @dev
115
70
  // msg.sender - ONLY registry owner
116
71
  // CAN NOT register itself