@etherisc/gif-next 0.0.2-cc4a5cb-898 → 0.0.2-cddad6b-504
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.
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
- package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
- package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
- package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +1 -1
- package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +1 -1
- package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +1 -1
- package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +1 -1
- package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +1 -1
- package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +1 -1
- package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +1 -1
- package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +1 -1
- package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +1 -1
- package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +1 -1
- package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +1 -1
- package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryUpgradeable.sol/RegistryUpgradeable.dbg.json +4 -0
- package/artifacts/contracts/registry/RegistryUpgradeable.sol/RegistryUpgradeable.json +495 -0
- package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
- package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
- package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
- package/artifacts/contracts/shared/Proxy.sol/Proxy.dbg.json +1 -1
- package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.dbg.json +1 -1
- package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
- package/artifacts/contracts/shared/VersionableUpgradeable.sol/VersionableUpgradeable.dbg.json +4 -0
- package/artifacts/contracts/shared/VersionableUpgradeable.sol/VersionableUpgradeable.json +187 -0
- package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +1 -1
- package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
- package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +1 -1
- package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +1 -1
- package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
- package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
- package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
- package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
- package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
- package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
- package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
- package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
- package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
- package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
- package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
- package/contracts/registry/RegistryUpgradeable.sol +416 -0
- package/contracts/shared/VersionableUpgradeable.sol +108 -0
- 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