@etherisc/gif-next 0.0.2-cc4a5cb-898 → 0.0.2-cddad6b-504

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  2. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  3. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  4. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  5. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  6. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  8. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  9. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  10. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  11. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  12. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  13. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  14. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  15. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  16. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  18. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  26. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  27. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +1 -1
  28. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  29. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  30. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  31. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  32. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  33. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +1 -1
  34. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +1 -1
  35. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  36. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  37. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +1 -1
  38. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +1 -1
  39. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +1 -1
  40. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +1 -1
  41. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +1 -1
  42. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +1 -1
  43. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +1 -1
  44. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +1 -1
  45. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +1 -1
  46. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +1 -1
  47. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +1 -1
  48. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +1 -1
  49. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +1 -1
  50. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +1 -1
  51. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +1 -1
  52. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +1 -1
  53. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
  54. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +1 -1
  55. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +1 -1
  56. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
  57. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +1 -1
  58. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +1 -1
  59. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +1 -1
  60. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +1 -1
  61. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +1 -1
  62. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  63. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +1 -1
  64. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  65. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  66. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  67. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  68. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  69. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  70. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  71. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  72. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  73. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  74. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  75. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
  76. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  77. package/artifacts/contracts/registry/RegistryUpgradeable.sol/RegistryUpgradeable.dbg.json +4 -0
  78. package/artifacts/contracts/registry/RegistryUpgradeable.sol/RegistryUpgradeable.json +495 -0
  79. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  80. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +1 -1
  81. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  82. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  83. package/artifacts/contracts/shared/Proxy.sol/Proxy.dbg.json +1 -1
  84. package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.dbg.json +1 -1
  85. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  86. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  87. package/artifacts/contracts/shared/VersionableUpgradeable.sol/VersionableUpgradeable.dbg.json +4 -0
  88. package/artifacts/contracts/shared/VersionableUpgradeable.sol/VersionableUpgradeable.json +187 -0
  89. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +1 -1
  90. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  91. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +1 -1
  92. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +1 -1
  93. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  94. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  95. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  96. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  97. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  98. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  99. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  100. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  101. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  102. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  103. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  104. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  105. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  106. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  107. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  108. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +1 -1
  109. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  110. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  111. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  112. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  113. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  114. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  115. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  116. package/contracts/registry/RegistryUpgradeable.sol +416 -0
  117. package/contracts/shared/VersionableUpgradeable.sol +108 -0
  118. package/package.json +1 -1
@@ -0,0 +1,416 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {Initializable} from "@openzeppelin5/contracts/proxy/utils/Initializable.sol";
5
+
6
+ import {IRegisterable} from "../shared/IRegisterable.sol";
7
+ import {IService} from "../instance/base/IService.sol";
8
+
9
+ import {IChainNft} from "./IChainNft.sol";
10
+ import {ChainNft} from "./ChainNft.sol";
11
+ import {IRegistry} from "./IRegistry.sol";
12
+ import {NftId, toNftId, zeroNftId, NftIdLib} from "../types/NftId.sol";
13
+ import {VersionPart} from "../types/Version.sol";
14
+ import {ObjectType, PROTOCOL, REGISTRY, TOKEN, SERVICE, INSTANCE, STAKE, PRODUCT, DISTRIBUTION, ORACLE, POOL, POLICY, BUNDLE} from "../types/ObjectType.sol";
15
+
16
+ // TODO make registry upgradable
17
+ contract RegistryUpgradeable is
18
+ Initializable,
19
+ IRegisterable,
20
+ IRegistry
21
+ {
22
+ using NftIdLib for NftId;
23
+
24
+ string public constant EMPTY_URI = "";
25
+
26
+ // @custom:storage-location erc7201:etherisc.storage.Registry
27
+ struct RegistryStorageV1 {// TODO encode version? at least just apropriate naming
28
+
29
+ mapping(NftId nftId => ObjectInfo info) _info;
30
+ mapping(address object => NftId nftId) _nftIdByAddress;
31
+ mapping(ObjectType objectType => bool) _isValidType;
32
+ mapping(ObjectType objectType => mapping(ObjectType objectParentType => bool)) _isValidParentType;
33
+
34
+ mapping(NftId nftId => string stringValue) _string;
35
+ mapping(bytes32 serviceNameHash => mapping(VersionPart majorVersion => address service)) _service;
36
+
37
+ NftId _nftId;
38
+ IChainNft _chainNft;
39
+ ChainNft _chainNftInternal;
40
+ address _initialOwner;
41
+
42
+ /// @dev will own protocol nft and registry nft(s) minted during initialize
43
+ address _protocolOwner;
44
+ }
45
+
46
+ // keccak256(abi.encode(uint256(keccak256("etherisc.storage.Registry")) - 1)) & ~bytes32(uint256(0xff));
47
+ bytes32 private constant RegistryStorageLocation = 0x6548007c3f4340f82f348c576c0ff69f4f529cadd5ad41f96aae61abceeaa300;
48
+
49
+ function _getRegistryStorageV1() private pure returns (RegistryStorageV1 storage $) {
50
+ assembly {
51
+ $.slot := RegistryStorageLocation
52
+ }
53
+ }
54
+
55
+ // TODO refactor once registry becomes upgradable
56
+ // @Dev the protocol owner will get ownership of the
57
+ // protocol nft and the global registry nft minted in this
58
+ // initializer function
59
+ function initialize(
60
+ address chainNft,
61
+ address protocolOwner
62
+ )
63
+ public
64
+ initializer
65
+ {
66
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
67
+
68
+ require(
69
+ address($._chainNft) == address(0),
70
+ "ERROR:REG-001:ALREADY_INITIALIZED"
71
+ );
72
+
73
+ $._initialOwner = msg.sender;
74
+ $._protocolOwner = protocolOwner;
75
+
76
+ $._chainNft = IChainNft(chainNft);
77
+ $._chainNftInternal = ChainNft(chainNft);
78
+
79
+ // initial registry setup
80
+ _registerProtocol();
81
+ $._nftId = _registerRegistry();
82
+
83
+ // setup rules for further registrations
84
+ _setupValidTypes();
85
+ _setupValidParentTypes();
86
+ }
87
+
88
+
89
+ function register(
90
+ address objectAddress
91
+ )
92
+ // TODO add authz (only services may register components etc)
93
+ // we have to check how we do authz for registring services (just restrict to protocol owner/registry owner)
94
+ external override returns (NftId nftId) {
95
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
96
+
97
+ require(
98
+ $._nftIdByAddress[objectAddress].eqz(),
99
+ "ERROR:REG-002:ALREADY_REGISTERED"
100
+ );
101
+
102
+ IRegisterable registerable = IRegisterable(objectAddress);
103
+ require(
104
+ registerable.supportsInterface(type(IRegisterable).interfaceId),
105
+ "ERROR:REG-003:NOT_REGISTERABLE"
106
+ );
107
+
108
+ ObjectType objectType = registerable.getType();
109
+ require(
110
+ $._isValidType[objectType],
111
+ "ERROR:REG-004:TYPE_INVALID"
112
+ );
113
+
114
+ NftId parentNftId = registerable.getParentNftId();
115
+ require(
116
+ isRegistered(parentNftId),
117
+ "ERROR:REG-005:PARENT_NOT_REGISTERED"
118
+ );
119
+
120
+ require(
121
+ $._isValidParentType[objectType][$._info[parentNftId].objectType],
122
+ "ERROR:REG-006:PARENT_TYPE_INVALID"
123
+ );
124
+
125
+ // also check that nftId and parentNFtId are on the same chain if applicable
126
+
127
+ // nft minting
128
+ uint256 mintedTokenId = $._chainNft.mint(
129
+ registerable.getOwner(),
130
+ EMPTY_URI
131
+ );
132
+
133
+ nftId = toNftId(mintedTokenId);
134
+
135
+ // special case services
136
+ if(registerable.getType() == SERVICE()) {
137
+ IService service = IService(objectAddress);
138
+ require(
139
+ service.supportsInterface(type(IService).interfaceId),
140
+ "ERROR:REG-007:NOT_SERVICE"
141
+ );
142
+
143
+ string memory serviceName = service.getName();
144
+ VersionPart majorVersion = service.getMajorVersion();
145
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
146
+
147
+ // service specific state
148
+ $._string[nftId] = serviceName;
149
+
150
+ require(
151
+ $._service[serviceNameHash][majorVersion] == address(0),
152
+ "ERROR:REG-008:ALREADY_REGISTERED"
153
+ );
154
+ $._service[serviceNameHash][majorVersion] = objectAddress;
155
+ }
156
+
157
+ // create object info and link nft id with it
158
+ _registerObjectInfo(registerable, nftId);
159
+ }
160
+
161
+
162
+ function registerObjectForInstance(
163
+ NftId parentNftId,
164
+ ObjectType objectType,
165
+ address initialOwner,
166
+ bytes memory data
167
+ )
168
+ external
169
+ override
170
+ returns (
171
+ // TODO add onlyRegisteredInstance
172
+ NftId nftId
173
+ )
174
+ {
175
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
176
+
177
+ // TODO add more validation
178
+ require(
179
+ objectType == POLICY() || objectType == BUNDLE(),
180
+ "ERROR:REG-010:TYPE_INVALID"
181
+ );
182
+
183
+ uint256 mintedTokenId = $._chainNft.mint(initialOwner, EMPTY_URI);
184
+ nftId = toNftId(mintedTokenId);
185
+
186
+ ObjectInfo memory info = ObjectInfo(
187
+ nftId,
188
+ parentNftId,
189
+ objectType,
190
+ address(0),
191
+ initialOwner,
192
+ data
193
+ );
194
+
195
+ $._info[nftId] = info;
196
+
197
+ // add logging
198
+ }
199
+
200
+ function getObjectCount() external view override returns (uint256) {
201
+ return _getRegistryStorageV1()._chainNft.totalSupply();
202
+ }
203
+
204
+ function getNftId(
205
+ address object
206
+ ) external view override returns (NftId id) {
207
+ return _getRegistryStorageV1()._nftIdByAddress[object];
208
+ }
209
+
210
+ function isRegistered(
211
+ NftId nftId
212
+ ) public view override returns (bool) {
213
+ return _getRegistryStorageV1()._info[nftId].objectType.gtz();
214
+ }
215
+
216
+ function isRegistered(
217
+ address object
218
+ ) external view override returns (bool) {
219
+ return _getRegistryStorageV1()._nftIdByAddress[object].gtz();
220
+ }
221
+
222
+ function getObjectInfo(
223
+ NftId nftId
224
+ ) external view override returns (ObjectInfo memory info) {
225
+ return _getRegistryStorageV1()._info[nftId];
226
+ }
227
+
228
+ function getName(
229
+ NftId nftId
230
+ ) external view returns (string memory name) {
231
+ return _getRegistryStorageV1()._string[nftId];
232
+ }
233
+
234
+ function getOwner(NftId nftId) external view override returns (address) {
235
+ return _getRegistryStorageV1()._chainNft.ownerOf(nftId.toInt());
236
+ }
237
+
238
+ function getChainNft() external view override returns (IChainNft) {
239
+ return _getRegistryStorageV1()._chainNft;
240
+ }
241
+
242
+ // special case to retrive a gif service
243
+ function getServiceAddress(string memory serviceName, VersionPart majorVersion) external view override returns (address serviceAddress) {
244
+ bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
245
+ return _getRegistryStorageV1()._service[serviceNameHash][majorVersion];
246
+ }
247
+
248
+ // from IERC165
249
+ function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {
250
+ return interfaceId == type(IRegistry).interfaceId;
251
+ }
252
+
253
+ // from IRegistryLinked
254
+ function getRegistry() external view override returns (IRegistry registry) {
255
+ return this;
256
+ }
257
+
258
+ // from IRegisterable
259
+ function register() external pure override returns (NftId nftId) {
260
+ return zeroNftId();
261
+ }
262
+
263
+ function getType() external pure override returns (ObjectType objectType) {
264
+ return REGISTRY();
265
+ }
266
+
267
+
268
+ function getOwner() public view override returns (address owner) {
269
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
270
+ return $._nftId.gtz() ? this.getOwner($._nftId) : $._initialOwner;
271
+ }
272
+
273
+ function getNftId() external view override (IRegisterable, IRegistry) returns (NftId nftId) {
274
+ return _getRegistryStorageV1()._nftId;
275
+ }
276
+
277
+ function getParentNftId() external view returns (NftId nftId) {
278
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
279
+ // we're the global registry
280
+ if(block.chainid == 1) {
281
+ return toNftId($._chainNftInternal.PROTOCOL_NFT_ID());
282
+ }
283
+ else {
284
+ return toNftId($._chainNftInternal.GLOBAL_REGISTRY_ID());
285
+ }
286
+ }
287
+
288
+ function getData() external pure returns (bytes memory data) {
289
+ return "";
290
+ }
291
+
292
+ // registry specific functions
293
+ function getProtocolOwner() external view override returns (address) {
294
+ return _getRegistryStorageV1()._protocolOwner;
295
+ }
296
+
297
+ /// @dev defines which types are allowed to register
298
+ function _setupValidTypes() internal {
299
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
300
+ $._isValidType[REGISTRY()] = true; // only for global registry
301
+ $._isValidType[TOKEN()] = true;
302
+ $._isValidType[SERVICE()] = true;
303
+ $._isValidType[INSTANCE()] = true;
304
+ $._isValidType[STAKE()] = true;
305
+ $._isValidType[PRODUCT()] = true;
306
+ $._isValidType[ORACLE()] = true;
307
+ $._isValidType[POOL()] = true;
308
+ $._isValidType[DISTRIBUTION()] = true;
309
+ $._isValidType[POLICY()] = true;
310
+ $._isValidType[BUNDLE()] = true;
311
+ }
312
+
313
+ /// @dev defines which types - parent type relations are allowed to register
314
+ function _setupValidParentTypes() internal {
315
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
316
+ // registry as parent
317
+ $._isValidParentType[TOKEN()][REGISTRY()] = true;
318
+ $._isValidParentType[SERVICE()][REGISTRY()] = true;
319
+ $._isValidParentType[INSTANCE()][REGISTRY()] = true;
320
+
321
+ // instance as parent
322
+ $._isValidParentType[PRODUCT()][INSTANCE()] = true;
323
+ $._isValidParentType[DISTRIBUTION()][INSTANCE()] = true;
324
+ $._isValidParentType[ORACLE()][INSTANCE()] = true;
325
+ $._isValidParentType[POOL()][INSTANCE()] = true;
326
+
327
+ // product as parent
328
+ $._isValidParentType[POLICY()][PRODUCT()] = true;
329
+
330
+ // pool as parent
331
+ $._isValidParentType[BUNDLE()][POOL()] = true;
332
+ $._isValidParentType[STAKE()][POOL()] = true;
333
+ }
334
+
335
+ /// @dev protocol registration used to anchor the dip ecosystem relations
336
+ function _registerProtocol() virtual internal {
337
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
338
+
339
+ uint256 protocolId = $._chainNftInternal.PROTOCOL_NFT_ID();
340
+ $._chainNftInternal.mint($._protocolOwner, protocolId);
341
+
342
+ NftId protocolNftid = toNftId(protocolId);
343
+ ObjectInfo memory protocolInfo = ObjectInfo(
344
+ protocolNftid,
345
+ zeroNftId(), // parent nft id
346
+ PROTOCOL(),
347
+ address(0), // contract address
348
+ $._protocolOwner,
349
+ "" // data
350
+ );
351
+
352
+ $._info[protocolNftid] = protocolInfo;
353
+ }
354
+
355
+ /// @dev registry registration
356
+ /// might also register the global registry when not on mainnet
357
+ function _registerRegistry() virtual internal returns (NftId registryNftId) {
358
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
359
+
360
+ uint256 registryId = $._chainNftInternal.calculateTokenId(2);
361
+ registryNftId = toNftId(registryId);
362
+
363
+ // we're not the global registry
364
+ if(registryId != $._chainNftInternal.GLOBAL_REGISTRY_ID()) {
365
+ _registerGlobalRegistry();
366
+ }
367
+
368
+ $._chainNftInternal.mint($._protocolOwner, registryId);
369
+ _registerObjectInfo(this, registryNftId);
370
+ }
371
+
372
+
373
+ /// @dev global registry registration for non mainnet registries
374
+ function _registerGlobalRegistry() virtual internal {
375
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
376
+
377
+ uint256 globalRegistryId = $._chainNftInternal.GLOBAL_REGISTRY_ID();
378
+ $._chainNftInternal.mint($._protocolOwner, globalRegistryId);
379
+
380
+ NftId globalRegistryNftId = toNftId(globalRegistryId);
381
+ ObjectInfo memory globalRegistryInfo = ObjectInfo(
382
+ globalRegistryNftId,
383
+ toNftId($._chainNftInternal.PROTOCOL_NFT_ID()),
384
+ REGISTRY(),
385
+ address(0), // contract address
386
+ $._protocolOwner,
387
+ "" // data
388
+ );
389
+
390
+ $._info[globalRegistryNftId] = globalRegistryInfo;
391
+ }
392
+
393
+
394
+ function _registerObjectInfo(
395
+ IRegisterable registerable,
396
+ NftId nftId
397
+ ) internal virtual {
398
+ RegistryStorageV1 storage $ = _getRegistryStorageV1();
399
+
400
+ address objectAddress = address(registerable);
401
+ ObjectInfo memory info = ObjectInfo(
402
+ nftId,
403
+ registerable.getParentNftId(),
404
+ registerable.getType(),
405
+ objectAddress,
406
+ registerable.getOwner(),
407
+ registerable.getData()
408
+ );
409
+
410
+ $._info[nftId] = info;
411
+ $._nftIdByAddress[objectAddress] = nftId;
412
+
413
+ // add logging
414
+ }
415
+
416
+ }
@@ -0,0 +1,108 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {Initializable} from "@openzeppelin5/contracts/proxy/utils/Initializable.sol";
5
+
6
+ import {Blocknumber, blockNumber} from "../types/Blocknumber.sol";
7
+ import {Timestamp, blockTimestamp} from "../types/Timestamp.sol";
8
+ import {Version, VersionPart} from "../types/Version.sol";
9
+
10
+ import {IVersionable} from "./IVersionable.sol";
11
+
12
+ abstract contract VersionableUpgradeable is
13
+ Initializable,
14
+ IVersionable
15
+ {
16
+ /// @custom:storage-location erc7201:etherisc.storage.Versionable
17
+ struct VersionableStorage {
18
+ mapping(Version version => VersionInfo info) _versionHistory;
19
+ Version [] _versions;
20
+ }
21
+
22
+ // keccak256(abi.encode(uint256(keccak256("etherisc.storage.Versionable")) - 1)) & ~bytes32(uint256(0xff))
23
+ bytes32 private constant VersionableStorageLocation = 0x4f61291a8ac3d020d0a7d919a76b8592aa88385744dee3f8b4f3873b969ed900;
24
+
25
+ function _getVersionableStorage() private pure returns (VersionableStorage storage $) {
26
+ assembly {
27
+ $.slot := VersionableStorageLocation
28
+ }
29
+ }
30
+
31
+ // controlled activation for controller contract
32
+ constructor() {
33
+ _activate(address(0), msg.sender);
34
+ }
35
+
36
+ // IMPORTANT this function needs to be implemented by each new version
37
+ // and needs to call internal function call _activate()
38
+ function activate(address implementation, address activatedBy)
39
+ external
40
+ virtual
41
+ override
42
+ onlyInitializing
43
+ {
44
+ _activate(implementation, activatedBy);
45
+ }
46
+
47
+
48
+ // can only be called once per contract
49
+ // needs to be called inside the proxy upgrade tx
50
+ function _activate(
51
+ address implementation,
52
+ address activatedBy
53
+ )
54
+ internal
55
+ {
56
+ VersionableStorage storage $ = _getVersionableStorage();
57
+
58
+ Version thisVersion = getVersion();
59
+ require(
60
+ !isActivated(thisVersion),
61
+ "ERROR:VRN-001:VERSION_ALREADY_ACTIVATED"
62
+ );
63
+
64
+ // require increasing version number
65
+ if($._versions.length > 0) {
66
+ Version lastVersion = $._versions[$._versions.length - 1];
67
+ require(
68
+ thisVersion > lastVersion,
69
+ "ERROR:VRN-002:VERSION_NOT_INCREASING"
70
+ );
71
+ }
72
+
73
+ // update version history
74
+ $._versions.push(thisVersion);
75
+ $._versionHistory[thisVersion] = VersionInfo(
76
+ thisVersion,
77
+ implementation,
78
+ activatedBy,
79
+ blockTimestamp(),
80
+ blockNumber()
81
+ );
82
+
83
+ emit LogVersionableActivated(thisVersion, implementation, activatedBy);
84
+ }
85
+
86
+
87
+ function isActivated(Version _version) public override view returns(bool) {
88
+ return _getVersionableStorage()._versionHistory[_version].activatedIn.toInt() > 0;
89
+ }
90
+
91
+
92
+ function getVersion() public pure virtual returns(Version);
93
+
94
+
95
+ function getVersionCount() external view override returns(uint256) {
96
+ return _getVersionableStorage()._versions.length;
97
+ }
98
+
99
+
100
+ function getVersion(uint256 idx) external view override returns(Version) {
101
+ return _getVersionableStorage()._versions[idx];
102
+ }
103
+
104
+
105
+ function getVersionInfo(Version _version) external override view returns(VersionInfo memory) {
106
+ return _getVersionableStorage()._versionHistory[_version];
107
+ }
108
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etherisc/gif-next",
3
- "version": "0.0.2-cc4a5cb-898",
3
+ "version": "0.0.2-cddad6b-504",
4
4
  "description": "This is the repository for the next version of the Generic Insurance Framework (GIF) smart contracts. ",
5
5
  "main": "index.js",
6
6
  "scripts": {