@etherisc/gif-next 0.0.2-c96f882-016 → 0.0.2-cbce707-667
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/BaseComponent.sol/BaseComponent.json +13 -0
- package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/components/Distribution.sol/Distribution.json +75 -15
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +13 -0
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +52 -0
- 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/Pool.sol/Pool.json +112 -13
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +39 -18
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.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/Dummy.sol/LifeCycleModule.json +2 -2
- 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/SM.sol/SM.json +2 -2
- package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
- 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/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +1 -1
- package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.json +0 -13
- package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +1 -1
- package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +403 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +124 -101
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +34 -47
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +143 -38
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +169 -33
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +71 -11
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +5 -0
- 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/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +2 -2
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
- package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
- package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +18 -18
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +657 -0
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +436 -0
- 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 +4 -0
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +796 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +448 -0
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +26 -0
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +0 -19
- package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.json +60 -24
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +20 -44
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +46 -29
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +410 -0
- package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
- package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
- package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
- package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
- package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
- package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
- package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/shared/Registerable.sol/Registerable.json +4 -4
- package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
- package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
- package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
- package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
- package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
- package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
- package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
- package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
- package/artifacts/contracts/test/TestService.sol/TestService.json +11 -11
- 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/DistributorType.sol/DistributorTypeLib.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/NumberId.sol/NumberIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
- package/artifacts/contracts/types/Referral.sol/ReferralLib.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/RoleId.sol/RoleIdLib.json +2 -2
- package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
- package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
- package/artifacts/contracts/types/UFixed.sol/UFixedLib.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/components/BaseComponent.sol +8 -3
- package/contracts/components/Distribution.sol +13 -13
- package/contracts/components/IBaseComponent.sol +1 -0
- package/contracts/components/IDistributionComponent.sol +3 -0
- package/contracts/components/Pool.sol +15 -27
- package/contracts/components/Product.sol +1 -1
- package/contracts/instance/AccessManagedSimple.sol +1 -8
- package/contracts/instance/IInstance.sol +15 -4
- package/contracts/instance/Instance.sol +16 -15
- package/contracts/instance/InstanceAccessManager.sol +1 -1
- package/contracts/instance/InstanceReader.sol +17 -1
- package/contracts/instance/InstanceService.sol +51 -7
- package/contracts/instance/base/ComponentServiceBase.sol +2 -10
- package/contracts/instance/module/IBundle.sol +1 -0
- package/contracts/instance/module/ISetup.sol +1 -0
- package/contracts/instance/service/DistributionService.sol +105 -0
- package/contracts/instance/service/DistributionServiceManager.sol +53 -0
- package/contracts/instance/service/PoolService.sol +211 -0
- package/contracts/instance/service/PoolServiceManager.sol +53 -0
- package/contracts/registry/IRegistry.sol +4 -0
- package/contracts/registry/IRegistryService.sol +0 -2
- package/contracts/registry/Registry.sol +18 -1
- package/contracts/registry/RegistryService.sol +2 -47
- package/contracts/registry/RegistryServiceManager.sol +21 -5
- package/contracts/registry/TokenRegistry.sol +111 -0
- package/contracts/shared/ERC165.sol +6 -2
- package/contracts/shared/Registerable.sol +1 -0
- package/contracts/types/RoleId.sol +7 -0
- package/contracts/types/StateId.sol +4 -0
- package/package.json +1 -1
@@ -15,7 +15,9 @@ import {Service} from "../../contracts/shared/Service.sol";
|
|
15
15
|
import {IService} from "../shared/IService.sol";
|
16
16
|
import {ContractDeployerLib} from "../shared/ContractDeployerLib.sol";
|
17
17
|
import {NftId, NftIdLib, zeroNftId} from "../../contracts/types/NftId.sol";
|
18
|
+
import {RoleId} from "../types/RoleId.sol";
|
18
19
|
import {VersionLib} from "../types/Version.sol";
|
20
|
+
import {ADMIN_ROLE, INSTANCE_SERVICE_ROLE, DISTRIBUTION_SERVICE_ROLE, POOL_SERVICE_ROLE} from "../types/RoleId.sol";
|
19
21
|
|
20
22
|
contract InstanceService is Service, IInstanceService {
|
21
23
|
|
@@ -37,13 +39,17 @@ contract InstanceService is Service, IInstanceService {
|
|
37
39
|
InstanceReader clonedInstanceReader
|
38
40
|
)
|
39
41
|
{
|
42
|
+
address instanceOwner = msg.sender;
|
40
43
|
Registry registry = Registry(_registryAddress);
|
41
44
|
NftId registryNftId = registry.getNftId(_registryAddress);
|
42
45
|
address registryServiceAddress = registry.getServiceAddress("RegistryService", VersionLib.toVersion(3, 0, 0).toMajorPart());
|
43
46
|
RegistryService registryService = RegistryService(registryServiceAddress);
|
44
47
|
|
48
|
+
// initially set the authority of the access managar to this (being the instance service).
|
49
|
+
// This will allow the instance service to bootstrap the authorizations of the instance
|
50
|
+
// and then transfer the ownership of the access manager to the instance owner once everything is setup
|
45
51
|
clonedAccessManager = AccessManagerSimple(Clones.clone(_accessManagerMaster));
|
46
|
-
clonedAccessManager.initialize(
|
52
|
+
clonedAccessManager.initialize(address(this));
|
47
53
|
|
48
54
|
clonedInstance = Instance(Clones.clone(_instanceMaster));
|
49
55
|
clonedInstance.initialize(address(clonedAccessManager), _registryAddress, registryNftId, msg.sender);
|
@@ -53,9 +59,43 @@ contract InstanceService is Service, IInstanceService {
|
|
53
59
|
clonedInstanceReader = InstanceReader(Clones.clone(address(_instanceReaderMaster)));
|
54
60
|
clonedInstanceReader.initialize(_registryAddress, instanceNftId);
|
55
61
|
|
62
|
+
_grantInitialAuthorizations(clonedAccessManager, clonedInstance);
|
63
|
+
|
64
|
+
clonedInstance.setInstanceReader(clonedInstanceReader);
|
65
|
+
|
66
|
+
// to complete setup switch instance ownership to the instance owner
|
67
|
+
// TODO: use a role less powerful than admin, maybe INSTANCE_ADMIN (does not exist yet)
|
68
|
+
clonedAccessManager.grantRole(ADMIN_ROLE().toInt(), instanceOwner, 0);
|
69
|
+
clonedAccessManager.revokeRole(ADMIN_ROLE().toInt(), address(this));
|
70
|
+
|
56
71
|
emit LogInstanceCloned(address(clonedAccessManager), address(clonedInstance), address(clonedInstanceReader), instanceNftId);
|
57
72
|
}
|
58
73
|
|
74
|
+
function _grantInitialAuthorizations(AccessManagerSimple clonedAccessManager, Instance clonedInstance) internal {
|
75
|
+
address distributionServiceAddress = _registry.getServiceAddress("DistributionService", VersionLib.toVersion(3, 0, 0).toMajorPart());
|
76
|
+
clonedAccessManager.grantRole(DISTRIBUTION_SERVICE_ROLE().toInt(), distributionServiceAddress, 0);
|
77
|
+
bytes4[] memory instanceDistributionServiceSelectors = new bytes4[](2);
|
78
|
+
instanceDistributionServiceSelectors[0] = clonedInstance.createDistributionSetup.selector;
|
79
|
+
instanceDistributionServiceSelectors[1] = clonedInstance.updateDistributionSetup.selector;
|
80
|
+
clonedAccessManager.setTargetFunctionRole(
|
81
|
+
address(clonedInstance),
|
82
|
+
instanceDistributionServiceSelectors,
|
83
|
+
DISTRIBUTION_SERVICE_ROLE().toInt());
|
84
|
+
|
85
|
+
address poolServiceAddress = _registry.getServiceAddress("PoolService", VersionLib.toVersion(3, 0, 0).toMajorPart());
|
86
|
+
clonedAccessManager.grantRole(POOL_SERVICE_ROLE().toInt(), address(poolServiceAddress), 0);
|
87
|
+
bytes4[] memory instancePoolServiceSelectors = new bytes4[](4);
|
88
|
+
instancePoolServiceSelectors[0] = clonedInstance.createPoolSetup.selector;
|
89
|
+
instancePoolServiceSelectors[1] = clonedInstance.updatePoolSetup.selector;
|
90
|
+
instancePoolServiceSelectors[2] = clonedInstance.createBundle.selector;
|
91
|
+
instancePoolServiceSelectors[3] = clonedInstance.updateBundle.selector;
|
92
|
+
clonedAccessManager.setTargetFunctionRole(
|
93
|
+
address(clonedInstance),
|
94
|
+
instancePoolServiceSelectors,
|
95
|
+
POOL_SERVICE_ROLE().toInt());
|
96
|
+
|
97
|
+
}
|
98
|
+
|
59
99
|
function setAccessManagerMaster(address accessManagerMaster) external {
|
60
100
|
require(
|
61
101
|
_accessManagerMaster == address(0),
|
@@ -121,18 +161,22 @@ contract InstanceService is Service, IInstanceService {
|
|
121
161
|
address initialOwner = address(0);
|
122
162
|
(_registryAddress, initialOwner) = abi.decode(data, (address, address));
|
123
163
|
|
124
|
-
// // TODO register instance in registry
|
125
|
-
IRegistry registry = IRegistry(_registryAddress);
|
126
|
-
NftId registryNftId = registry.getNftId(_registryAddress);
|
127
|
-
|
128
164
|
_initializeService(_registryAddress, initialOwner);
|
129
165
|
|
130
166
|
_registerInterface(type(IService).interfaceId);
|
131
167
|
_registerInterface(type(IInstanceService).interfaceId);
|
132
168
|
}
|
133
169
|
|
134
|
-
function
|
135
|
-
|
170
|
+
function hasRole(address account, RoleId role, NftId instanceNftId) external view returns (bool) {
|
171
|
+
IRegistry.ObjectInfo memory instanceObjectInfo = getRegistry().getObjectInfo(instanceNftId);
|
172
|
+
address instanceAddress = instanceObjectInfo.objectAddress;
|
173
|
+
Instance instance = Instance(instanceAddress);
|
174
|
+
AccessManagerSimple accessManager = AccessManagerSimple(instance.authority());
|
175
|
+
(bool isMember, uint32 executionDelay) = accessManager.hasRole(role.toInt(), account);
|
176
|
+
if (executionDelay > 0) {
|
177
|
+
return false;
|
178
|
+
}
|
179
|
+
return isMember;
|
136
180
|
}
|
137
181
|
}
|
138
182
|
|
@@ -12,15 +12,7 @@ import {Version, VersionPart, VersionLib} from "../../types/Version.sol";
|
|
12
12
|
|
13
13
|
abstract contract ComponentServiceBase is Service {
|
14
14
|
|
15
|
-
|
16
|
-
address registry,
|
17
|
-
NftId registryNftId,
|
18
|
-
address initialOwner
|
19
|
-
)
|
20
|
-
{
|
21
|
-
_initializeService(registry, initialOwner);
|
22
|
-
}
|
23
|
-
|
15
|
+
error CallerIsNotComponentOwner();
|
24
16
|
|
25
17
|
function _getAndVerifyComponentInfoAndInstance(
|
26
18
|
ObjectType objectType
|
@@ -32,7 +24,7 @@ abstract contract ComponentServiceBase is Service {
|
|
32
24
|
IInstance instance
|
33
25
|
)
|
34
26
|
{
|
35
|
-
NftId componentNftId =
|
27
|
+
NftId componentNftId = _registry.getNftId(msg.sender);
|
36
28
|
require(componentNftId.gtz(), "ERROR_COMPONENT_UNKNOWN");
|
37
29
|
|
38
30
|
info = getRegistry().getObjectInfo(componentNftId);
|
@@ -13,6 +13,7 @@ interface IBundle {
|
|
13
13
|
uint256 capitalAmount; // net investment capital + net premiums - payouts
|
14
14
|
uint256 lockedAmount; // capital amount linked to collateralizaion of non-closed policies (<= balance)
|
15
15
|
uint256 balanceAmount; // total amount of funds: capitalAmount + fees (balance >= captial)
|
16
|
+
uint256 lifetime;
|
16
17
|
Timestamp expiredAt; // no new policies
|
17
18
|
Timestamp closedAt; // no open policies, locked amount = 0
|
18
19
|
}
|
@@ -5,6 +5,7 @@ import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IER
|
|
5
5
|
|
6
6
|
import {Fee} from "../../types/Fee.sol";
|
7
7
|
import {NftId} from "../../types/NftId.sol";
|
8
|
+
import {LibNftIdSet} from "../../types/NftIdSet.sol";
|
8
9
|
import {UFixed} from "../../types/UFixed.sol";
|
9
10
|
import {TokenHandler} from "../../shared/TokenHandler.sol";
|
10
11
|
|
@@ -0,0 +1,105 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.19;
|
3
|
+
|
4
|
+
import {IRegistry} from "../../registry/IRegistry.sol";
|
5
|
+
import {IRegistryService} from "../../registry/IRegistryService.sol";
|
6
|
+
import {IInstance} from "../../instance/IInstance.sol";
|
7
|
+
import {InstanceReader} from "../../instance/InstanceReader.sol";
|
8
|
+
import {ISetup} from "../../instance/module/ISetup.sol";
|
9
|
+
import {ITreasury} from "../../instance/module/ITreasury.sol";
|
10
|
+
|
11
|
+
import {NftId, NftIdLib} from "../../types/NftId.sol";
|
12
|
+
import {Fee} from "../../types/Fee.sol";
|
13
|
+
import {DISTRIBUTION_OWNER_ROLE} from "../../types/RoleId.sol";
|
14
|
+
import {KEEP_STATE} from "../../types/StateId.sol";
|
15
|
+
import {DISTRIBUTION} from "../../types/ObjectType.sol";
|
16
|
+
import {Version, VersionLib} from "../../types/Version.sol";
|
17
|
+
|
18
|
+
import {IVersionable} from "../../shared/IVersionable.sol";
|
19
|
+
import {Versionable} from "../../shared/Versionable.sol";
|
20
|
+
|
21
|
+
import {IService} from "../../shared/IService.sol";
|
22
|
+
import {Service} from "../../shared/Service.sol";
|
23
|
+
import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
|
24
|
+
import {IDistributionService} from "./IDistributionService.sol";
|
25
|
+
import {Distribution} from "../../components/Distribution.sol";
|
26
|
+
import {InstanceService} from "../InstanceService.sol";
|
27
|
+
import {Instance} from "../Instance.sol";
|
28
|
+
import {INftOwnable} from "../../shared/INftOwnable.sol";
|
29
|
+
|
30
|
+
string constant DISTRIBUTION_SERVICE_NAME = "DistributionService";
|
31
|
+
|
32
|
+
contract DistributionService is
|
33
|
+
ComponentServiceBase,
|
34
|
+
IDistributionService
|
35
|
+
{
|
36
|
+
using NftIdLib for NftId;
|
37
|
+
|
38
|
+
string public constant NAME = "DistributionService";
|
39
|
+
|
40
|
+
address internal _registryAddress;
|
41
|
+
InstanceService internal _instanceService;
|
42
|
+
|
43
|
+
function _initialize(
|
44
|
+
address owner,
|
45
|
+
bytes memory data
|
46
|
+
)
|
47
|
+
internal
|
48
|
+
initializer
|
49
|
+
virtual override
|
50
|
+
{
|
51
|
+
address initialOwner = address(0);
|
52
|
+
(_registryAddress, initialOwner) = abi.decode(data, (address, address));
|
53
|
+
|
54
|
+
IRegistry registry = IRegistry(_registryAddress);
|
55
|
+
_instanceService = InstanceService(registry.getServiceAddress("InstanceService", getMajorVersion()));
|
56
|
+
|
57
|
+
_initializeService(_registryAddress, initialOwner);
|
58
|
+
|
59
|
+
_registerInterface(type(IService).interfaceId);
|
60
|
+
_registerInterface(type(IDistributionService).interfaceId);
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
function getName() public pure override(IService, Service) returns(string memory name) {
|
65
|
+
return NAME;
|
66
|
+
}
|
67
|
+
|
68
|
+
function register(address distributionComponentAddress)
|
69
|
+
external
|
70
|
+
returns (NftId distributionNftId)
|
71
|
+
{
|
72
|
+
address componentOwner = msg.sender;
|
73
|
+
Distribution distribution = Distribution(distributionComponentAddress);
|
74
|
+
IInstance instance = distribution.getInstance();
|
75
|
+
INftOwnable nftOwnable = INftOwnable(address(instance));
|
76
|
+
|
77
|
+
require(_instanceService.hasRole(componentOwner, DISTRIBUTION_OWNER_ROLE(), nftOwnable.getNftId()), "ERROR:DIS-001:NOT_DISTRIBUTION_OWNER_ROLE");
|
78
|
+
|
79
|
+
IRegistryService registryService = getRegistryService();
|
80
|
+
(IRegistry.ObjectInfo memory distributionObjInfo, ) = registryService.registerDistribution(
|
81
|
+
distribution,
|
82
|
+
componentOwner
|
83
|
+
);
|
84
|
+
distributionNftId = distributionObjInfo.nftId;
|
85
|
+
|
86
|
+
ISetup.DistributionSetupInfo memory initialSetup = distribution.getInitialSetupInfo();
|
87
|
+
instance.createDistributionSetup(distributionNftId, initialSetup);
|
88
|
+
}
|
89
|
+
|
90
|
+
function setFees(
|
91
|
+
Fee memory distributionFee
|
92
|
+
)
|
93
|
+
external
|
94
|
+
override
|
95
|
+
{
|
96
|
+
(IRegistry.ObjectInfo memory info , IInstance instance) = _getAndVerifyComponentInfoAndInstance(DISTRIBUTION());
|
97
|
+
InstanceReader instanceReader = instance.getInstanceReader();
|
98
|
+
NftId distributionNftId = info.nftId;
|
99
|
+
|
100
|
+
ISetup.DistributionSetupInfo memory distSetupInfo = instanceReader.getDistributionSetupInfo(distributionNftId);
|
101
|
+
distSetupInfo.distributionFee = distributionFee;
|
102
|
+
|
103
|
+
instance.updateDistributionSetup(distributionNftId, distSetupInfo, KEEP_STATE());
|
104
|
+
}
|
105
|
+
}
|
@@ -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
|
+
}
|
@@ -55,6 +55,10 @@ interface IRegistry is IERC165 {
|
|
55
55
|
|
56
56
|
function setTokenActive(address token, VersionPart majorVersion, bool active) external;
|
57
57
|
|
58
|
+
function getMajorVersionMin() external view returns (VersionPart);
|
59
|
+
|
60
|
+
function getMajorVersionMax() external view returns (VersionPart);
|
61
|
+
|
58
62
|
function getMajorVersion() external view returns (VersionPart);
|
59
63
|
|
60
64
|
function getObjectCount() external view returns (uint256);
|
@@ -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)
|
@@ -213,10 +213,27 @@ contract Registry is
|
|
213
213
|
emit LogTokenStateSet(token, majorVersion, active);
|
214
214
|
}
|
215
215
|
|
216
|
-
/// @dev
|
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
|
217
233
|
function getMajorVersion() external view returns (VersionPart) {
|
218
234
|
return _majorVersion;
|
219
235
|
}
|
236
|
+
|
220
237
|
|
221
238
|
function getObjectCount() external view override returns (uint256) {
|
222
239
|
return _chainNft.totalSupply();
|