@etherisc/gif-next 0.0.2-cff6256-424 → 0.0.2-d224a95-375
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/README.md +63 -1
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +126 -0
- package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/components/Distribution.sol/Distribution.json +136 -62
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +88 -0
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +0 -52
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +28 -2
- 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 +168 -19
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +144 -64
- 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/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/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +4 -0
- package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +1206 -0
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +4 -0
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +788 -0
- package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +4 -0
- package/artifacts/contracts/instance/{AccessManagedSimple.sol/AccessManagedSimple.json → Cloneable.sol/Cloneable.json} +86 -2
- 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 +1347 -93
- package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
- package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.json +448 -0
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +6 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +169 -142
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +55 -32
- package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.dbg.json +4 -0
- package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.json +763 -0
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +177 -38
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +207 -51
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +70 -26
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +4 -0
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +285 -0
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +59 -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/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- 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 +16 -16
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +100 -25
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +30 -14
- 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/IPoolService.sol/IPoolService.json +167 -0
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +40 -31
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +1049 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +464 -0
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +1147 -0
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +488 -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 +2 -110
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +94 -0
- 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 +35 -146
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +76 -20
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +26 -34
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +12 -12
- 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/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 +2 -2
- 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 +9 -9
- 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/NftIdSet.sol/LibNftIdSet.json +26 -3
- 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/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 +49 -8
- package/contracts/components/Distribution.sol +12 -15
- package/contracts/components/IBaseComponent.sol +6 -0
- package/contracts/components/IDistributionComponent.sol +0 -2
- package/contracts/components/IPoolComponent.sol +5 -1
- package/contracts/components/Pool.sol +35 -26
- package/contracts/components/Product.sol +33 -41
- package/contracts/instance/AccessManagerUpgradeableInitializeable.sol +23 -0
- package/contracts/instance/BundleManager.sol +129 -0
- package/contracts/instance/Cloneable.sol +46 -0
- package/contracts/instance/IInstance.sol +30 -7
- package/contracts/instance/IInstanceBase.sol +26 -0
- package/contracts/instance/IInstanceService.sol +5 -3
- package/contracts/instance/Instance.sol +41 -29
- package/contracts/instance/InstanceAccessManager.sol +6 -6
- package/contracts/instance/InstanceBase.sol +41 -0
- package/contracts/instance/InstanceReader.sol +26 -1
- package/contracts/instance/InstanceService.sol +105 -24
- package/contracts/instance/InstanceServiceManager.sol +6 -5
- package/contracts/instance/ObjectManager.sol +101 -0
- package/contracts/instance/base/ComponentServiceBase.sol +96 -1
- package/contracts/instance/module/IBundle.sol +1 -0
- package/contracts/instance/module/ISetup.sol +3 -0
- package/contracts/instance/service/DistributionService.sol +12 -20
- package/contracts/instance/service/DistributionServiceManager.sol +6 -5
- package/contracts/instance/service/IPoolService.sol +16 -2
- package/contracts/instance/service/IProductService.sol +6 -3
- package/contracts/instance/service/PoolService.sol +287 -0
- package/contracts/instance/service/PoolServiceManager.sol +54 -0
- package/contracts/instance/service/ProductService.sol +570 -0
- package/contracts/instance/service/ProductServiceManager.sol +54 -0
- package/contracts/registry/IRegistry.sol +5 -18
- package/contracts/registry/IRegistryService.sol +28 -11
- package/contracts/registry/Registry.sol +4 -45
- package/contracts/registry/RegistryService.sol +30 -71
- package/contracts/shared/NftOwnable.sol +2 -4
- package/contracts/shared/Service.sol +1 -0
- package/contracts/types/NftIdSet.sol +26 -24
- package/contracts/types/RoleId.sol +2 -0
- package/package.json +1 -1
- package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +0 -4
- package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +0 -4
- package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.json +0 -1132
- package/contracts/instance/AccessManagedSimple.sol +0 -115
- package/contracts/instance/AccessManagerSimple.sol +0 -692
@@ -4,14 +4,109 @@ pragma solidity ^0.8.19;
|
|
4
4
|
import {IRegistry} from "../../registry/IRegistry.sol";
|
5
5
|
import {IRegistryService} from "../../registry/IRegistryService.sol";
|
6
6
|
import {IInstance} from "../../instance/IInstance.sol";
|
7
|
-
import {ObjectType, INSTANCE, PRODUCT, POOL} from "../../types/ObjectType.sol";
|
7
|
+
import {ObjectType, INSTANCE, PRODUCT, POOL, DISTRIBUTION, ORACLE} from "../../types/ObjectType.sol";
|
8
8
|
import {NftId, NftIdLib} from "../../types/NftId.sol";
|
9
|
+
import {RoleId, PRODUCT_OWNER_ROLE, POOL_OWNER_ROLE, DISTRIBUTION_OWNER_ROLE, ORACLE_OWNER_ROLE} from "../../types/RoleId.sol";
|
9
10
|
|
11
|
+
import {BaseComponent} from "../../components/BaseComponent.sol";
|
12
|
+
import {Product} from "../../components/Product.sol";
|
13
|
+
import {INftOwnable} from "../../shared/INftOwnable.sol";
|
10
14
|
import {Service} from "../../shared/Service.sol";
|
15
|
+
import {InstanceService} from "../InstanceService.sol";
|
11
16
|
import {Version, VersionPart, VersionLib} from "../../types/Version.sol";
|
12
17
|
|
13
18
|
abstract contract ComponentServiceBase is Service {
|
14
19
|
|
20
|
+
error ExpectedRoleMissing(RoleId expected, address caller);
|
21
|
+
error ComponentTypeInvalid(ObjectType componentType);
|
22
|
+
|
23
|
+
mapping (ObjectType => RoleId) internal _objectTypeToExpectedRole;
|
24
|
+
|
25
|
+
/// @dev modifier to check if caller has a role on the instance the component is registered in
|
26
|
+
modifier onlyComponentOwnerRole(address componentAddress) {
|
27
|
+
BaseComponent component = BaseComponent(componentAddress);
|
28
|
+
ObjectType objectType = _getObjectType(component);
|
29
|
+
RoleId expectedRole = _objectTypeToExpectedRole[objectType];
|
30
|
+
|
31
|
+
address componentOwner = msg.sender;
|
32
|
+
INftOwnable nftOwnable = INftOwnable(address(component.getInstance()));
|
33
|
+
if(! getInstanceService().hasRole(componentOwner, expectedRole, nftOwnable.getNftId())) {
|
34
|
+
revert ExpectedRoleMissing(expectedRole, componentOwner);
|
35
|
+
}
|
36
|
+
_;
|
37
|
+
}
|
38
|
+
|
39
|
+
/// @dev modifier to check if caller is a registered service
|
40
|
+
modifier onlyService() {
|
41
|
+
address caller = msg.sender;
|
42
|
+
require(getRegistry().isRegisteredService(caller), "ERROR_NOT_SERVICE");
|
43
|
+
_;
|
44
|
+
}
|
45
|
+
|
46
|
+
function _initializeService(
|
47
|
+
address registry,
|
48
|
+
address initialOwner
|
49
|
+
)
|
50
|
+
internal
|
51
|
+
override
|
52
|
+
{
|
53
|
+
super._initializeService(registry, initialOwner);
|
54
|
+
_objectTypeToExpectedRole[PRODUCT()] = PRODUCT_OWNER_ROLE();
|
55
|
+
_objectTypeToExpectedRole[POOL()] = POOL_OWNER_ROLE();
|
56
|
+
_objectTypeToExpectedRole[DISTRIBUTION()] = DISTRIBUTION_OWNER_ROLE();
|
57
|
+
_objectTypeToExpectedRole[ORACLE()] = ORACLE_OWNER_ROLE();
|
58
|
+
}
|
59
|
+
|
60
|
+
function getInstanceService() public view returns (InstanceService) {
|
61
|
+
return InstanceService(getRegistry().getServiceAddress("InstanceService", getMajorVersion()));
|
62
|
+
}
|
63
|
+
|
64
|
+
function register(address componentAddress)
|
65
|
+
external
|
66
|
+
onlyComponentOwnerRole(componentAddress)
|
67
|
+
returns (NftId componentNftId)
|
68
|
+
{
|
69
|
+
address componentOwner = msg.sender;
|
70
|
+
BaseComponent component = BaseComponent(componentAddress);
|
71
|
+
ObjectType objectType = _getObjectType(component);
|
72
|
+
IRegistryService registryService = getRegistryService();
|
73
|
+
|
74
|
+
IRegistry.ObjectInfo memory objInfo;
|
75
|
+
bytes memory initialObjData;
|
76
|
+
|
77
|
+
if (objectType == DISTRIBUTION()) {
|
78
|
+
(objInfo, initialObjData) = registryService.registerDistribution(component, componentOwner);
|
79
|
+
} else if (objectType == PRODUCT()) {
|
80
|
+
(objInfo, initialObjData) = registryService.registerProduct(component, componentOwner);
|
81
|
+
} else if (objectType == POOL()) {
|
82
|
+
(objInfo, initialObjData) = registryService.registerPool(component, componentOwner);
|
83
|
+
// TODO: implement this for oracle - currently missing in registry
|
84
|
+
// } else if (objectType == ORACLE()) {
|
85
|
+
// (objInfo, initialObjData) = registryService.registerOracle(component, componentOwner);
|
86
|
+
} else {
|
87
|
+
revert ComponentTypeInvalid(objectType);
|
88
|
+
}
|
89
|
+
|
90
|
+
componentNftId = objInfo.nftId;
|
91
|
+
{
|
92
|
+
IInstance instance = _getInstance(objInfo);
|
93
|
+
_finalizeComponentRegistration(componentNftId, initialObjData, instance);
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal virtual;
|
98
|
+
|
99
|
+
function _getObjectType(BaseComponent component) internal view returns (ObjectType) {
|
100
|
+
(IRegistry.ObjectInfo memory compInitialInfo, ) = component.getInitialInfo();
|
101
|
+
return compInitialInfo.objectType;
|
102
|
+
}
|
103
|
+
|
104
|
+
function _getInstance(IRegistry.ObjectInfo memory compObjInfo) internal view returns (IInstance) {
|
105
|
+
IRegistry registry = getRegistry();
|
106
|
+
IRegistry.ObjectInfo memory instanceInfo = registry.getObjectInfo(compObjInfo.parentNftId);
|
107
|
+
return IInstance(instanceInfo.objectAddress);
|
108
|
+
}
|
109
|
+
|
15
110
|
function _getAndVerifyComponentInfoAndInstance(
|
16
111
|
ObjectType objectType
|
17
112
|
)
|
@@ -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
|
}
|
@@ -20,6 +20,8 @@ interface ISetup {
|
|
20
20
|
Fee poolFee; // pool fee on net premium
|
21
21
|
Fee stakingFee; // pool fee on staked capital from investor
|
22
22
|
Fee performanceFee; // pool fee on profits from capital investors
|
23
|
+
bool isIntercepting; // intercepts nft transfers (for products)
|
24
|
+
address wallet;
|
23
25
|
}
|
24
26
|
|
25
27
|
struct DistributionSetupInfo {
|
@@ -38,6 +40,7 @@ interface ISetup {
|
|
38
40
|
Fee stakingFee; // pool fee on staked capital from investor
|
39
41
|
Fee performanceFee; // pool fee on profits from capital investors
|
40
42
|
bool isIntercepting; // intercepts nft transfers (for bundles)
|
43
|
+
bool isConfirmingApplication; // confirms applications before they are underwritten
|
41
44
|
address wallet;
|
42
45
|
}
|
43
46
|
}
|
@@ -10,6 +10,7 @@ import {ITreasury} from "../../instance/module/ITreasury.sol";
|
|
10
10
|
|
11
11
|
import {NftId, NftIdLib} from "../../types/NftId.sol";
|
12
12
|
import {Fee} from "../../types/Fee.sol";
|
13
|
+
import {DISTRIBUTION_OWNER_ROLE} from "../../types/RoleId.sol";
|
13
14
|
import {KEEP_STATE} from "../../types/StateId.sol";
|
14
15
|
import {DISTRIBUTION} from "../../types/ObjectType.sol";
|
15
16
|
import {Version, VersionLib} from "../../types/Version.sol";
|
@@ -22,6 +23,9 @@ import {Service} from "../../shared/Service.sol";
|
|
22
23
|
import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
|
23
24
|
import {IDistributionService} from "./IDistributionService.sol";
|
24
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";
|
25
29
|
|
26
30
|
string constant DISTRIBUTION_SERVICE_NAME = "DistributionService";
|
27
31
|
|
@@ -45,10 +49,9 @@ contract DistributionService is
|
|
45
49
|
{
|
46
50
|
address initialOwner = address(0);
|
47
51
|
(_registryAddress, initialOwner) = abi.decode(data, (address, address));
|
48
|
-
|
49
|
-
//
|
50
|
-
|
51
|
-
_initializeService(_registryAddress, initialOwner);
|
52
|
+
// TODO while DistributionService is not deployed in DistributionServiceManager constructor
|
53
|
+
// owner is DistributionServiceManager deployer
|
54
|
+
_initializeService(_registryAddress, owner);
|
52
55
|
|
53
56
|
_registerInterface(type(IService).interfaceId);
|
54
57
|
_registerInterface(type(IDistributionService).interfaceId);
|
@@ -59,23 +62,12 @@ contract DistributionService is
|
|
59
62
|
return NAME;
|
60
63
|
}
|
61
64
|
|
62
|
-
function
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
{
|
67
|
-
// TODO validate permission of componentOwner
|
68
|
-
Distribution distribution = Distribution(distributionComponentAddress);
|
69
|
-
IRegistryService registryService = getRegistryService();
|
70
|
-
(IRegistry.ObjectInfo memory distributionObjInfo, ) = registryService.registerDistribution(
|
71
|
-
distribution,
|
72
|
-
componentOwner
|
65
|
+
function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal override {
|
66
|
+
ISetup.DistributionSetupInfo memory initialSetup = abi.decode(
|
67
|
+
initialObjData,
|
68
|
+
(ISetup.DistributionSetupInfo)
|
73
69
|
);
|
74
|
-
|
75
|
-
|
76
|
-
ISetup.DistributionSetupInfo memory initialSetup = distribution.getInitialSetupInfo();
|
77
|
-
IInstance instance = distribution.getInstance();
|
78
|
-
instance.createDistributionSetup(distributionNftId, initialSetup);
|
70
|
+
instance.createDistributionSetup(componentNftId, initialSetup);
|
79
71
|
}
|
80
72
|
|
81
73
|
function setFees(
|
@@ -29,13 +29,14 @@ contract DistributionServiceManager is ProxyManager {
|
|
29
29
|
Registry registry = Registry(registryAddress);
|
30
30
|
address registryServiceAddress = registry.getServiceAddress("RegistryService", VersionLib.toVersion(3, 0, 0).toMajorPart());
|
31
31
|
RegistryService registryService = RegistryService(registryServiceAddress);
|
32
|
+
// TODO this must have a role or own nft to register service
|
33
|
+
//registryService.registerService(_distributionService);
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
+
// TODO no nft to link yet
|
35
36
|
// link ownership of instance service manager ot nft owner of instance service
|
36
|
-
_linkToNftOwnable(
|
37
|
-
|
38
|
-
|
37
|
+
//_linkToNftOwnable(
|
38
|
+
// address(registryAddress),
|
39
|
+
// address(_distributionService));
|
39
40
|
|
40
41
|
// implies that after this constructor call only upgrade functionality is available
|
41
42
|
_isDeployed = true;
|
@@ -3,9 +3,14 @@ pragma solidity ^0.8.19;
|
|
3
3
|
|
4
4
|
import {NftId} from "../../types/NftId.sol";
|
5
5
|
import {Fee} from "../../types/Fee.sol";
|
6
|
+
import {StateId} from "../../types/StateId.sol";
|
6
7
|
import {IService} from "../../shared/IService.sol";
|
8
|
+
import {IBundle} from "../module/IBundle.sol";
|
9
|
+
import {IInstance} from "../../instance/IInstance.sol";
|
7
10
|
|
8
11
|
interface IPoolService is IService {
|
12
|
+
error ErrorIPoolServiceInsufficientAllowance(address bundleOwner, address tokenHandlerAddress, uint256 amount);
|
13
|
+
|
9
14
|
function setFees(
|
10
15
|
Fee memory poolFee,
|
11
16
|
Fee memory stakingFee,
|
@@ -25,13 +30,22 @@ interface IPoolService is IService {
|
|
25
30
|
Fee memory fee
|
26
31
|
) external;
|
27
32
|
|
33
|
+
function updateBundle(NftId instanceNftId, NftId bundleNftId, IBundle.BundleInfo memory bundleInfo, StateId state) external;
|
34
|
+
|
35
|
+
function underwritePolicy(IInstance instanceNftId,
|
36
|
+
NftId policyNftId,
|
37
|
+
NftId bundleNftId,
|
38
|
+
uint256 collateralAmount,
|
39
|
+
uint256 netPremium
|
40
|
+
) external;
|
41
|
+
|
28
42
|
// function fundBundle(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
|
29
43
|
|
30
44
|
// function defundBundle(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
|
31
45
|
|
32
|
-
|
46
|
+
function lockBundle(NftId bundleNftId) external;
|
33
47
|
|
34
|
-
|
48
|
+
function unlockBundle(NftId bundleNftId) external;
|
35
49
|
|
36
50
|
// function closeBundle(NftId bundleNftId) external;
|
37
51
|
}
|
@@ -13,6 +13,9 @@ import {UFixed} from "../../types/UFixed.sol";
|
|
13
13
|
import {Fee} from "../../types/Fee.sol";
|
14
14
|
|
15
15
|
interface IProductService is IService {
|
16
|
+
|
17
|
+
error ErrorIProductServiceInsufficientAllowance(address customer, address tokenHandlerAddress, uint256 amount);
|
18
|
+
|
16
19
|
function setFees(
|
17
20
|
Fee memory productFee,
|
18
21
|
Fee memory processingFee
|
@@ -24,15 +27,15 @@ interface IProductService is IService {
|
|
24
27
|
) external;
|
25
28
|
|
26
29
|
|
27
|
-
function
|
30
|
+
function updateRisk(
|
28
31
|
RiskId riskId,
|
29
|
-
|
32
|
+
bytes memory data
|
30
33
|
) external;
|
31
34
|
|
32
35
|
|
33
36
|
function updateRiskState(
|
34
37
|
RiskId riskId,
|
35
|
-
StateId
|
38
|
+
StateId newState
|
36
39
|
) external;
|
37
40
|
|
38
41
|
|
@@ -0,0 +1,287 @@
|
|
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
|
+
import {IPolicy} from "../module/IPolicy.sol";
|
11
|
+
|
12
|
+
import {IVersionable} from "../../shared/IVersionable.sol";
|
13
|
+
import {Versionable} from "../../shared/Versionable.sol";
|
14
|
+
import {INftOwnable} from "../../shared/INftOwnable.sol";
|
15
|
+
|
16
|
+
import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
|
17
|
+
import {POOL, BUNDLE} from "../../types/ObjectType.sol";
|
18
|
+
import {POOL_OWNER_ROLE, RoleId} from "../../types/RoleId.sol";
|
19
|
+
import {Fee, FeeLib} from "../../types/Fee.sol";
|
20
|
+
import {Version, VersionLib} from "../../types/Version.sol";
|
21
|
+
import {KEEP_STATE, StateId} from "../../types/StateId.sol";
|
22
|
+
import {TimestampLib, zeroTimestamp} from "../../types/Timestamp.sol";
|
23
|
+
|
24
|
+
import {IService} from "../../shared/IService.sol";
|
25
|
+
import {Service} from "../../shared/Service.sol";
|
26
|
+
import {BundleManager} from "../BundleManager.sol";
|
27
|
+
import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
|
28
|
+
import {IPoolService} from "./IPoolService.sol";
|
29
|
+
import {IRegistryService} from "../../registry/IRegistryService.sol";
|
30
|
+
import {InstanceService} from "../InstanceService.sol";
|
31
|
+
import {InstanceReader} from "../InstanceReader.sol";
|
32
|
+
|
33
|
+
string constant POOL_SERVICE_NAME = "PoolService";
|
34
|
+
|
35
|
+
contract PoolService is
|
36
|
+
ComponentServiceBase,
|
37
|
+
IPoolService
|
38
|
+
{
|
39
|
+
using NftIdLib for NftId;
|
40
|
+
|
41
|
+
string public constant NAME = "PoolService";
|
42
|
+
|
43
|
+
address internal _registryAddress;
|
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
|
+
// TODO while PoolService is not deployed in PoolServiceManager constructor
|
56
|
+
// owner is PoolServiceManager deployer
|
57
|
+
_initializeService(_registryAddress, owner);
|
58
|
+
|
59
|
+
_registerInterface(type(IService).interfaceId);
|
60
|
+
_registerInterface(type(IPoolService).interfaceId);
|
61
|
+
}
|
62
|
+
|
63
|
+
function getName() public pure override(Service, IService) returns(string memory name) {
|
64
|
+
return NAME;
|
65
|
+
}
|
66
|
+
|
67
|
+
function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal override {
|
68
|
+
ISetup.PoolSetupInfo memory initialSetup = abi.decode(
|
69
|
+
initialObjData,
|
70
|
+
(ISetup.PoolSetupInfo)
|
71
|
+
);
|
72
|
+
instance.createPoolSetup(componentNftId, initialSetup);
|
73
|
+
}
|
74
|
+
|
75
|
+
function setFees(
|
76
|
+
Fee memory poolFee,
|
77
|
+
Fee memory stakingFee,
|
78
|
+
Fee memory performanceFee
|
79
|
+
)
|
80
|
+
external
|
81
|
+
override
|
82
|
+
{
|
83
|
+
(IRegistry.ObjectInfo memory poolInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
|
84
|
+
InstanceReader instanceReader = instance.getInstanceReader();
|
85
|
+
NftId poolNftId = poolInfo.nftId;
|
86
|
+
|
87
|
+
ISetup.PoolSetupInfo memory poolSetupInfo = instanceReader.getPoolSetupInfo(poolNftId);
|
88
|
+
poolSetupInfo.poolFee = poolFee;
|
89
|
+
poolSetupInfo.stakingFee = stakingFee;
|
90
|
+
poolSetupInfo.performanceFee = performanceFee;
|
91
|
+
|
92
|
+
instance.updatePoolSetup(poolNftId, poolSetupInfo, KEEP_STATE());
|
93
|
+
}
|
94
|
+
|
95
|
+
function createBundle(
|
96
|
+
address owner,
|
97
|
+
Fee memory fee,
|
98
|
+
uint256 stakingAmount,
|
99
|
+
uint256 lifetime,
|
100
|
+
bytes calldata filter
|
101
|
+
)
|
102
|
+
external
|
103
|
+
override
|
104
|
+
returns(NftId bundleNftId)
|
105
|
+
{
|
106
|
+
(IRegistry.ObjectInfo memory info, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
|
107
|
+
InstanceReader instanceReader = instance.getInstanceReader();
|
108
|
+
NftId poolNftId = info.nftId;
|
109
|
+
|
110
|
+
IBundle.BundleInfo memory bundleInfo = IBundle.BundleInfo(
|
111
|
+
poolNftId,
|
112
|
+
fee,
|
113
|
+
filter,
|
114
|
+
stakingAmount,
|
115
|
+
0,
|
116
|
+
stakingAmount,
|
117
|
+
lifetime,
|
118
|
+
zeroTimestamp(),
|
119
|
+
zeroTimestamp()
|
120
|
+
);
|
121
|
+
|
122
|
+
// register bundle with registry
|
123
|
+
bundleNftId = getRegistryService().registerBundle(
|
124
|
+
IRegistry.ObjectInfo(
|
125
|
+
zeroNftId(),
|
126
|
+
poolNftId,
|
127
|
+
BUNDLE(),
|
128
|
+
false, // intercepting property for bundles is defined on pool
|
129
|
+
address(0),
|
130
|
+
owner,
|
131
|
+
abi.encode(bundleInfo)
|
132
|
+
)
|
133
|
+
);
|
134
|
+
|
135
|
+
// create bundle info in instance
|
136
|
+
instance.createBundle(bundleNftId, bundleInfo);
|
137
|
+
|
138
|
+
BundleManager bundleManager = instance.getBundleManager();
|
139
|
+
bundleManager.add(bundleNftId);
|
140
|
+
|
141
|
+
_processStakingByTreasury(
|
142
|
+
instanceReader,
|
143
|
+
poolNftId,
|
144
|
+
bundleNftId,
|
145
|
+
stakingAmount);
|
146
|
+
|
147
|
+
// TODO add logging
|
148
|
+
}
|
149
|
+
|
150
|
+
function setBundleFee(
|
151
|
+
NftId bundleNftId,
|
152
|
+
Fee memory fee
|
153
|
+
)
|
154
|
+
external
|
155
|
+
override
|
156
|
+
{
|
157
|
+
(IRegistry.ObjectInfo memory info , IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
|
158
|
+
InstanceReader instanceReader = instance.getInstanceReader();
|
159
|
+
NftId poolNftId = info.nftId;
|
160
|
+
|
161
|
+
IBundle.BundleInfo memory bundleInfo = instanceReader.getBundleInfo(bundleNftId);
|
162
|
+
require(bundleInfo.poolNftId.gtz(), "ERROR:PLS-010:BUNDLE_UNKNOWN");
|
163
|
+
require(poolNftId == bundleInfo.poolNftId, "ERROR:PLS-011:BUNDLE_POOL_MISMATCH");
|
164
|
+
|
165
|
+
bundleInfo.fee = fee;
|
166
|
+
|
167
|
+
instance.updateBundle(bundleNftId, bundleInfo, KEEP_STATE());
|
168
|
+
}
|
169
|
+
|
170
|
+
function updateBundle(NftId instanceNftId, NftId bundleNftId, IBundle.BundleInfo memory bundleInfo, StateId state)
|
171
|
+
external
|
172
|
+
onlyService
|
173
|
+
{
|
174
|
+
IRegistry.ObjectInfo memory instanceInfo = getRegistry().getObjectInfo(instanceNftId);
|
175
|
+
IInstance instance = IInstance(instanceInfo.objectAddress);
|
176
|
+
instance.updateBundle(bundleNftId, bundleInfo, state);
|
177
|
+
}
|
178
|
+
|
179
|
+
function lockBundle(NftId bundleNftId)
|
180
|
+
external
|
181
|
+
{
|
182
|
+
(, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
|
183
|
+
BundleManager bundleManager = instance.getBundleManager();
|
184
|
+
bundleManager.lock(bundleNftId);
|
185
|
+
}
|
186
|
+
|
187
|
+
function unlockBundle(NftId bundleNftId)
|
188
|
+
external
|
189
|
+
{
|
190
|
+
(, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
|
191
|
+
BundleManager bundleManager = instance.getBundleManager();
|
192
|
+
bundleManager.unlock(bundleNftId);
|
193
|
+
}
|
194
|
+
|
195
|
+
function underwritePolicy(IInstance instance,
|
196
|
+
NftId policyNftId,
|
197
|
+
NftId bundleNftId,
|
198
|
+
uint256 collateralAmount,
|
199
|
+
uint256 netPremiumAmount
|
200
|
+
)
|
201
|
+
external
|
202
|
+
onlyService
|
203
|
+
{
|
204
|
+
InstanceReader instanceReader = instance.getInstanceReader();
|
205
|
+
IBundle.BundleInfo memory bundleInfo = instanceReader.getBundleInfo(bundleNftId);
|
206
|
+
|
207
|
+
// lock collateral
|
208
|
+
bundleInfo.lockedAmount += collateralAmount;
|
209
|
+
bundleInfo.balanceAmount += netPremiumAmount;
|
210
|
+
|
211
|
+
instance.updateBundle(bundleNftId, bundleInfo, KEEP_STATE());
|
212
|
+
|
213
|
+
linkPolicy(instance, policyNftId);
|
214
|
+
}
|
215
|
+
|
216
|
+
/// @dev links policy to bundle
|
217
|
+
function linkPolicy(IInstance instance, NftId policyNftId)
|
218
|
+
internal
|
219
|
+
onlyService
|
220
|
+
{
|
221
|
+
InstanceReader instanceReader = instance.getInstanceReader();
|
222
|
+
IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
|
223
|
+
|
224
|
+
// ensure policy has not yet been activated
|
225
|
+
if (policyInfo.activatedAt.gtz()) {
|
226
|
+
revert BundleManager.ErrorBundleManagerErrorPolicyAlreadyActivated(policyNftId);
|
227
|
+
}
|
228
|
+
|
229
|
+
BundleManager bundleManager = instance.getBundleManager();
|
230
|
+
bundleManager.linkPolicy(policyNftId);
|
231
|
+
}
|
232
|
+
|
233
|
+
/// @dev unlinks policy from bundle
|
234
|
+
function unlinkPolicy(IInstance instance, NftId policyNftId)
|
235
|
+
internal
|
236
|
+
onlyService
|
237
|
+
{
|
238
|
+
InstanceReader instanceReader = instance.getInstanceReader();
|
239
|
+
IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
|
240
|
+
|
241
|
+
// ensure policy has no open claims
|
242
|
+
if (policyInfo.openClaimsCount > 0) {
|
243
|
+
revert BundleManager.ErrorBundleManagerPolicyWithOpenClaims(
|
244
|
+
policyNftId,
|
245
|
+
policyInfo.openClaimsCount);
|
246
|
+
}
|
247
|
+
|
248
|
+
// ensure policy is closeable
|
249
|
+
if (policyInfo.expiredAt < TimestampLib.blockTimestamp()
|
250
|
+
|| policyInfo.payoutAmount < policyInfo.sumInsuredAmount)
|
251
|
+
{
|
252
|
+
revert BundleManager.ErrorBundleManagerPolicyNotCloseable(policyNftId);
|
253
|
+
}
|
254
|
+
|
255
|
+
BundleManager bundleManager = instance.getBundleManager();
|
256
|
+
bundleManager.unlinkPolicy(policyNftId);
|
257
|
+
}
|
258
|
+
|
259
|
+
function _processStakingByTreasury(
|
260
|
+
InstanceReader instanceReader,
|
261
|
+
NftId poolNftId,
|
262
|
+
NftId bundleNftId,
|
263
|
+
uint256 stakingAmount
|
264
|
+
)
|
265
|
+
internal
|
266
|
+
{
|
267
|
+
// process token transfer(s)
|
268
|
+
if(stakingAmount > 0) {
|
269
|
+
ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
|
270
|
+
TokenHandler tokenHandler = poolInfo.tokenHandler;
|
271
|
+
address bundleOwner = getRegistry().ownerOf(bundleNftId);
|
272
|
+
Fee memory stakingFee = poolInfo.stakingFee;
|
273
|
+
|
274
|
+
tokenHandler.transfer(
|
275
|
+
bundleOwner,
|
276
|
+
poolInfo.wallet,
|
277
|
+
stakingAmount
|
278
|
+
);
|
279
|
+
|
280
|
+
|
281
|
+
if (! FeeLib.feeIsZero(stakingFee)) {
|
282
|
+
(uint256 stakingFeeAmount, uint256 netAmount) = FeeLib.calculateFee(stakingFee, stakingAmount);
|
283
|
+
// TODO: track staking fees in pool's state (issue #177)
|
284
|
+
}
|
285
|
+
}
|
286
|
+
}
|
287
|
+
}
|
@@ -0,0 +1,54 @@
|
|
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
|
+
// TODO this must have a role or own nft to register service
|
33
|
+
//registryService.registerService(_poolService);
|
34
|
+
|
35
|
+
// TODO no nft to link yet
|
36
|
+
// link ownership of instance service manager ot nft owner of instance service
|
37
|
+
//_linkToNftOwnable(
|
38
|
+
// address(registryAddress),
|
39
|
+
// address(_poolService));
|
40
|
+
|
41
|
+
// implies that after this constructor call only upgrade functionality is available
|
42
|
+
_isDeployed = true;
|
43
|
+
}
|
44
|
+
|
45
|
+
//--- view functions ----------------------------------------------------//
|
46
|
+
function getPoolService()
|
47
|
+
external
|
48
|
+
view
|
49
|
+
returns (PoolService poolService)
|
50
|
+
{
|
51
|
+
return _poolService;
|
52
|
+
}
|
53
|
+
|
54
|
+
}
|