@etherisc/gif-next 0.0.2-771d9e9-515 → 0.0.2-77ae649-865
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/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/components/Distribution.sol/Distribution.json +10 -10
- 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/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 +42 -11
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +18 -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/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +1 -1
- package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +1 -1
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +4 -0
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +775 -0
- package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +4 -0
- package/artifacts/contracts/instance/Cloneable.sol/Cloneable.json +185 -0
- 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 +963 -18
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +5 -0
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +150 -81
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +2 -2
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +74 -40
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +128 -49
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +52 -32
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +4 -0
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +272 -0
- 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/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 +22 -22
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +17 -21
- 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 +1 -1
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +224 -30
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +27 -23
- 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/Distribution.sol +6 -3
- package/contracts/components/IPoolComponent.sol +5 -1
- package/contracts/components/Pool.sol +33 -9
- package/contracts/components/Product.sol +33 -41
- package/contracts/instance/BundleManager.sol +129 -0
- package/contracts/instance/Cloneable.sol +46 -0
- package/contracts/instance/IInstance.sol +21 -4
- package/contracts/instance/IInstanceService.sol +3 -1
- package/contracts/instance/Instance.sol +15 -4
- package/contracts/instance/InstanceReader.sol +9 -0
- package/contracts/instance/InstanceService.sol +62 -12
- package/contracts/instance/InstanceServiceManager.sol +6 -5
- package/contracts/instance/ObjectManager.sol +95 -0
- package/contracts/instance/base/ComponentServiceBase.sol +18 -2
- package/contracts/instance/module/ISetup.sol +3 -1
- package/contracts/instance/service/DistributionService.sol +3 -2
- 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 +112 -18
- package/contracts/instance/service/PoolServiceManager.sol +6 -5
- 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/types/NftIdSet.sol +26 -24
- package/contracts/types/RoleId.sol +1 -0
- package/package.json +1 -1
@@ -0,0 +1,95 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.20;
|
3
|
+
|
4
|
+
import {Cloneable} from "./Cloneable.sol";
|
5
|
+
|
6
|
+
import {IInstance} from "./IInstance.sol";
|
7
|
+
import {INSTANCE} from "../types/ObjectType.sol";
|
8
|
+
import {InstanceReader} from "./InstanceReader.sol";
|
9
|
+
import {IRegistry} from "../registry/IRegistry.sol";
|
10
|
+
import {LibNftIdSet} from "../types/NftIdSet.sol";
|
11
|
+
import {NftId} from "../types/NftId.sol";
|
12
|
+
|
13
|
+
contract ObjectManager is
|
14
|
+
Cloneable
|
15
|
+
{
|
16
|
+
|
17
|
+
event LogObjectManagerInitialized(NftId instanceNftId, address instanceReader);
|
18
|
+
|
19
|
+
error ErrorObjectManagerNftIdInvalid(NftId instanceNftId);
|
20
|
+
error ErrorObjectManagerAlreadyAdded(NftId componentNftId, NftId objectNftId);
|
21
|
+
|
22
|
+
mapping(NftId compnentNftId => LibNftIdSet.Set objects) internal _activeObjects;
|
23
|
+
mapping(NftId compnentNftId => LibNftIdSet.Set objects) internal _allObjects;
|
24
|
+
InstanceReader internal _instanceReader;
|
25
|
+
|
26
|
+
constructor() Cloneable() {
|
27
|
+
_instanceReader = InstanceReader(address(0));
|
28
|
+
}
|
29
|
+
|
30
|
+
/// @dev call to initialize MUST be made in the same transaction as cloning of the contract
|
31
|
+
function initialize(
|
32
|
+
address authority,
|
33
|
+
address registry,
|
34
|
+
NftId instanceNftId
|
35
|
+
)
|
36
|
+
external
|
37
|
+
{
|
38
|
+
initialize(authority, registry);
|
39
|
+
|
40
|
+
// check/handle instance nft id/instance reader
|
41
|
+
IRegistry.ObjectInfo memory instanceInfo = _registry.getObjectInfo(instanceNftId);
|
42
|
+
if (instanceInfo.objectType != INSTANCE()) {
|
43
|
+
revert ErrorObjectManagerNftIdInvalid(instanceNftId);
|
44
|
+
}
|
45
|
+
|
46
|
+
IInstance instance = IInstance(instanceInfo.objectAddress);
|
47
|
+
_instanceReader = instance.getInstanceReader();
|
48
|
+
|
49
|
+
emit LogObjectManagerInitialized(instanceNftId, address(_instanceReader));
|
50
|
+
}
|
51
|
+
|
52
|
+
function getInstanceReader() external view returns (InstanceReader) {
|
53
|
+
return _instanceReader;
|
54
|
+
}
|
55
|
+
|
56
|
+
function _add(NftId componentNftId, NftId objectNftId) internal {
|
57
|
+
LibNftIdSet.Set storage allSet = _allObjects[componentNftId];
|
58
|
+
LibNftIdSet.Set storage activeSet = _activeObjects[componentNftId];
|
59
|
+
|
60
|
+
LibNftIdSet.add(allSet, objectNftId);
|
61
|
+
LibNftIdSet.add(activeSet, objectNftId);
|
62
|
+
}
|
63
|
+
|
64
|
+
function _activate(NftId componentNftId, NftId objectNftId) internal {
|
65
|
+
LibNftIdSet.add(_activeObjects[componentNftId], objectNftId);
|
66
|
+
}
|
67
|
+
|
68
|
+
function _deactivate(NftId componentNftId, NftId objectNftId) internal {
|
69
|
+
LibNftIdSet.remove(_activeObjects[componentNftId], objectNftId);
|
70
|
+
}
|
71
|
+
|
72
|
+
function _objects(NftId componentNftId) internal view returns (uint256) {
|
73
|
+
return LibNftIdSet.size(_allObjects[componentNftId]);
|
74
|
+
}
|
75
|
+
|
76
|
+
function _contains(NftId componentNftId, NftId objectNftId) internal view returns (bool) {
|
77
|
+
return LibNftIdSet.contains(_allObjects[componentNftId], objectNftId);
|
78
|
+
}
|
79
|
+
|
80
|
+
function _getObject(NftId componentNftId, uint256 idx) internal view returns (NftId) {
|
81
|
+
return LibNftIdSet.getElementAt(_allObjects[componentNftId], idx);
|
82
|
+
}
|
83
|
+
|
84
|
+
function _activeObjs(NftId componentNftId) internal view returns (uint256) {
|
85
|
+
return LibNftIdSet.size(_activeObjects[componentNftId]);
|
86
|
+
}
|
87
|
+
|
88
|
+
function _isActive(NftId componentNftId, NftId objectNftId) internal view returns (bool) {
|
89
|
+
return LibNftIdSet.contains(_activeObjects[componentNftId], objectNftId);
|
90
|
+
}
|
91
|
+
|
92
|
+
function _getActiveObject(NftId componentNftId, uint256 idx) internal view returns (NftId) {
|
93
|
+
return LibNftIdSet.getElementAt(_activeObjects[componentNftId], idx);
|
94
|
+
}
|
95
|
+
}
|
@@ -9,6 +9,7 @@ import {NftId, NftIdLib} from "../../types/NftId.sol";
|
|
9
9
|
import {RoleId, PRODUCT_OWNER_ROLE, POOL_OWNER_ROLE, DISTRIBUTION_OWNER_ROLE, ORACLE_OWNER_ROLE} from "../../types/RoleId.sol";
|
10
10
|
|
11
11
|
import {BaseComponent} from "../../components/BaseComponent.sol";
|
12
|
+
import {Product} from "../../components/Product.sol";
|
12
13
|
import {INftOwnable} from "../../shared/INftOwnable.sol";
|
13
14
|
import {Service} from "../../shared/Service.sol";
|
14
15
|
import {InstanceService} from "../InstanceService.sol";
|
@@ -35,6 +36,13 @@ abstract contract ComponentServiceBase is Service {
|
|
35
36
|
_;
|
36
37
|
}
|
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
|
+
|
38
46
|
function _initializeService(
|
39
47
|
address registry,
|
40
48
|
address initialOwner
|
@@ -60,7 +68,6 @@ abstract contract ComponentServiceBase is Service {
|
|
60
68
|
{
|
61
69
|
address componentOwner = msg.sender;
|
62
70
|
BaseComponent component = BaseComponent(componentAddress);
|
63
|
-
IInstance instance = component.getInstance();
|
64
71
|
ObjectType objectType = _getObjectType(component);
|
65
72
|
IRegistryService registryService = getRegistryService();
|
66
73
|
|
@@ -81,7 +88,10 @@ abstract contract ComponentServiceBase is Service {
|
|
81
88
|
}
|
82
89
|
|
83
90
|
componentNftId = objInfo.nftId;
|
84
|
-
|
91
|
+
{
|
92
|
+
IInstance instance = _getInstance(objInfo);
|
93
|
+
_finalizeComponentRegistration(componentNftId, initialObjData, instance);
|
94
|
+
}
|
85
95
|
}
|
86
96
|
|
87
97
|
function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal virtual;
|
@@ -90,6 +100,12 @@ abstract contract ComponentServiceBase is Service {
|
|
90
100
|
(IRegistry.ObjectInfo memory compInitialInfo, ) = component.getInitialInfo();
|
91
101
|
return compInitialInfo.objectType;
|
92
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
|
+
}
|
93
109
|
|
94
110
|
function _getAndVerifyComponentInfoAndInstance(
|
95
111
|
ObjectType objectType
|
@@ -5,7 +5,6 @@ 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";
|
9
8
|
import {UFixed} from "../../types/UFixed.sol";
|
10
9
|
import {TokenHandler} from "../../shared/TokenHandler.sol";
|
11
10
|
|
@@ -21,6 +20,8 @@ interface ISetup {
|
|
21
20
|
Fee poolFee; // pool fee on net premium
|
22
21
|
Fee stakingFee; // pool fee on staked capital from investor
|
23
22
|
Fee performanceFee; // pool fee on profits from capital investors
|
23
|
+
bool isIntercepting; // intercepts nft transfers (for products)
|
24
|
+
address wallet;
|
24
25
|
}
|
25
26
|
|
26
27
|
struct DistributionSetupInfo {
|
@@ -39,6 +40,7 @@ interface ISetup {
|
|
39
40
|
Fee stakingFee; // pool fee on staked capital from investor
|
40
41
|
Fee performanceFee; // pool fee on profits from capital investors
|
41
42
|
bool isIntercepting; // intercepts nft transfers (for bundles)
|
43
|
+
bool isConfirmingApplication; // confirms applications before they are underwritten
|
42
44
|
address wallet;
|
43
45
|
}
|
44
46
|
}
|
@@ -49,8 +49,9 @@ contract DistributionService is
|
|
49
49
|
{
|
50
50
|
address initialOwner = address(0);
|
51
51
|
(_registryAddress, initialOwner) = abi.decode(data, (address, address));
|
52
|
-
|
53
|
-
|
52
|
+
// TODO while DistributionService is not deployed in DistributionServiceManager constructor
|
53
|
+
// owner is DistributionServiceManager deployer
|
54
|
+
_initializeService(_registryAddress, owner);
|
54
55
|
|
55
56
|
_registerInterface(type(IService).interfaceId);
|
56
57
|
_registerInterface(type(IDistributionService).interfaceId);
|
@@ -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
|
|
@@ -7,6 +7,7 @@ import {IInstance} from "../../instance/IInstance.sol";
|
|
7
7
|
import {IBundle} from "../../instance/module/IBundle.sol";
|
8
8
|
import {TokenHandler} from "../../instance/module/ITreasury.sol";
|
9
9
|
import {ISetup} from "../module/ISetup.sol";
|
10
|
+
import {IPolicy} from "../module/IPolicy.sol";
|
10
11
|
|
11
12
|
import {IVersionable} from "../../shared/IVersionable.sol";
|
12
13
|
import {Versionable} from "../../shared/Versionable.sol";
|
@@ -17,18 +18,18 @@ import {POOL, BUNDLE} from "../../types/ObjectType.sol";
|
|
17
18
|
import {POOL_OWNER_ROLE, RoleId} from "../../types/RoleId.sol";
|
18
19
|
import {Fee, FeeLib} from "../../types/Fee.sol";
|
19
20
|
import {Version, VersionLib} from "../../types/Version.sol";
|
20
|
-
import {KEEP_STATE} from "../../types/StateId.sol";
|
21
|
-
import {zeroTimestamp} from "../../types/Timestamp.sol";
|
21
|
+
import {KEEP_STATE, StateId} from "../../types/StateId.sol";
|
22
|
+
import {TimestampLib, zeroTimestamp} from "../../types/Timestamp.sol";
|
22
23
|
|
23
24
|
import {IService} from "../../shared/IService.sol";
|
24
25
|
import {Service} from "../../shared/Service.sol";
|
26
|
+
import {BundleManager} from "../BundleManager.sol";
|
25
27
|
import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
|
26
28
|
import {IPoolService} from "./IPoolService.sol";
|
27
29
|
import {IRegistryService} from "../../registry/IRegistryService.sol";
|
28
30
|
import {InstanceService} from "../InstanceService.sol";
|
29
31
|
import {InstanceReader} from "../InstanceReader.sol";
|
30
32
|
|
31
|
-
|
32
33
|
string constant POOL_SERVICE_NAME = "PoolService";
|
33
34
|
|
34
35
|
contract PoolService is
|
@@ -51,8 +52,9 @@ contract PoolService is
|
|
51
52
|
{
|
52
53
|
address initialOwner = address(0);
|
53
54
|
(_registryAddress, initialOwner) = abi.decode(data, (address, address));
|
54
|
-
|
55
|
-
|
55
|
+
// TODO while PoolService is not deployed in PoolServiceManager constructor
|
56
|
+
// owner is PoolServiceManager deployer
|
57
|
+
_initializeService(_registryAddress, owner);
|
56
58
|
|
57
59
|
_registerInterface(type(IService).interfaceId);
|
58
60
|
_registerInterface(type(IPoolService).interfaceId);
|
@@ -107,7 +109,7 @@ contract PoolService is
|
|
107
109
|
|
108
110
|
IBundle.BundleInfo memory bundleInfo = IBundle.BundleInfo(
|
109
111
|
poolNftId,
|
110
|
-
|
112
|
+
fee,
|
111
113
|
filter,
|
112
114
|
stakingAmount,
|
113
115
|
0,
|
@@ -133,15 +135,14 @@ contract PoolService is
|
|
133
135
|
// create bundle info in instance
|
134
136
|
instance.createBundle(bundleNftId, bundleInfo);
|
135
137
|
|
136
|
-
|
138
|
+
BundleManager bundleManager = instance.getBundleManager();
|
139
|
+
bundleManager.add(bundleNftId);
|
137
140
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
// bundleNftId,
|
144
|
-
// stakingAmount);
|
141
|
+
_processStakingByTreasury(
|
142
|
+
instanceReader,
|
143
|
+
poolNftId,
|
144
|
+
bundleNftId,
|
145
|
+
stakingAmount);
|
145
146
|
|
146
147
|
// TODO add logging
|
147
148
|
}
|
@@ -166,11 +167,97 @@ contract PoolService is
|
|
166
167
|
instance.updateBundle(bundleNftId, bundleInfo, KEEP_STATE());
|
167
168
|
}
|
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
|
+
}
|
169
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
|
+
}
|
170
258
|
|
171
259
|
function _processStakingByTreasury(
|
172
260
|
InstanceReader instanceReader,
|
173
|
-
NftId productNftId,
|
174
261
|
NftId poolNftId,
|
175
262
|
NftId bundleNftId,
|
176
263
|
uint256 stakingAmount
|
@@ -179,15 +266,22 @@ contract PoolService is
|
|
179
266
|
{
|
180
267
|
// process token transfer(s)
|
181
268
|
if(stakingAmount > 0) {
|
182
|
-
TokenHandler tokenHandler = TokenHandler(instanceReader.getTokenHandler(productNftId));
|
183
|
-
address bundleOwner = getRegistry().ownerOf(bundleNftId);
|
184
269
|
ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
|
185
|
-
|
270
|
+
TokenHandler tokenHandler = poolInfo.tokenHandler;
|
271
|
+
address bundleOwner = getRegistry().ownerOf(bundleNftId);
|
272
|
+
Fee memory stakingFee = poolInfo.stakingFee;
|
273
|
+
|
186
274
|
tokenHandler.transfer(
|
187
275
|
bundleOwner,
|
188
276
|
poolInfo.wallet,
|
189
277
|
stakingAmount
|
190
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
|
+
}
|
191
285
|
}
|
192
286
|
}
|
193
287
|
}
|
@@ -29,13 +29,14 @@ contract PoolServiceManager 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(_poolService);
|
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(_poolService));
|
39
40
|
|
40
41
|
// implies that after this constructor call only upgrade functionality is available
|
41
42
|
_isDeployed = true;
|