@etherisc/gif-next 0.0.2-b81ff84-640 → 0.0.2-b97394c-442

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.
Files changed (187) hide show
  1. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +13 -0
  3. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.json +23 -15
  5. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +13 -0
  7. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  8. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +2 -2
  10. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  12. package/artifacts/contracts/components/Pool.sol/Pool.json +29 -16
  13. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  14. package/artifacts/contracts/components/Product.sol/Product.json +31 -56
  15. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
  16. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
  18. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +2 -2
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +2 -2
  34. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  35. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
  36. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  37. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  38. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +1 -1
  39. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.json +0 -13
  40. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +1 -1
  41. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
  42. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  43. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1356 -22
  44. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  45. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  46. package/artifacts/contracts/instance/Instance.sol/Instance.json +167 -101
  47. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  48. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +34 -47
  49. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  50. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +177 -38
  51. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  52. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +209 -33
  53. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  54. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +91 -15
  55. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  56. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +59 -0
  57. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  58. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  59. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  60. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  61. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +2 -2
  62. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  63. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
  64. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  65. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  66. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  67. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  68. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  69. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  70. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  71. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  72. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +16 -16
  73. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  74. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +716 -0
  75. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
  76. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +444 -0
  77. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  78. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  79. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  80. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +108 -0
  81. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  82. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +40 -31
  83. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  84. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +971 -0
  85. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
  86. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +460 -0
  87. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  88. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +1147 -0
  89. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
  90. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +488 -0
  91. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  92. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  93. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +2 -110
  94. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  95. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +94 -0
  96. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  97. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  98. package/artifacts/contracts/registry/Registry.sol/Registry.json +35 -146
  99. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  100. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +76 -20
  101. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  102. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +26 -34
  103. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  104. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +12 -12
  105. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  106. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  107. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  108. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  109. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  110. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  111. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  112. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  113. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  114. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  115. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  116. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +2 -2
  117. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
  118. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  119. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  120. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  121. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  122. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  123. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  124. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
  125. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  126. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  127. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  128. package/artifacts/contracts/test/TestService.sol/TestService.json +9 -9
  129. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  130. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  131. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  132. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  133. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  134. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  135. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  136. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  137. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  138. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  139. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  140. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  141. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  142. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  143. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  144. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  145. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  146. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  147. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  148. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  149. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  150. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  151. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  152. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  153. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  154. package/contracts/components/BaseComponent.sol +8 -3
  155. package/contracts/components/Distribution.sol +15 -18
  156. package/contracts/components/IBaseComponent.sol +1 -0
  157. package/contracts/components/IDistributionComponent.sol +1 -0
  158. package/contracts/components/IPoolComponent.sol +1 -1
  159. package/contracts/components/Pool.sol +16 -28
  160. package/contracts/components/Product.sol +34 -42
  161. package/contracts/instance/AccessManagedSimple.sol +1 -8
  162. package/contracts/instance/IInstance.sol +33 -7
  163. package/contracts/instance/Instance.sol +20 -19
  164. package/contracts/instance/InstanceAccessManager.sol +1 -1
  165. package/contracts/instance/InstanceReader.sol +26 -1
  166. package/contracts/instance/InstanceService.sol +69 -9
  167. package/contracts/instance/InstanceServiceManager.sol +6 -5
  168. package/contracts/instance/base/ComponentServiceBase.sol +91 -6
  169. package/contracts/instance/module/IBundle.sol +1 -0
  170. package/contracts/instance/module/ISetup.sol +4 -0
  171. package/contracts/instance/service/DistributionService.sol +88 -0
  172. package/contracts/instance/service/DistributionServiceManager.sol +54 -0
  173. package/contracts/instance/service/IPoolService.sol +6 -0
  174. package/contracts/instance/service/IProductService.sol +6 -3
  175. package/contracts/instance/service/PoolService.sol +204 -0
  176. package/contracts/instance/service/PoolServiceManager.sol +54 -0
  177. package/contracts/instance/service/ProductService.sol +561 -0
  178. package/contracts/instance/service/ProductServiceManager.sol +54 -0
  179. package/contracts/registry/IRegistry.sol +5 -18
  180. package/contracts/registry/IRegistryService.sol +28 -11
  181. package/contracts/registry/Registry.sol +4 -45
  182. package/contracts/registry/RegistryService.sol +30 -71
  183. package/contracts/shared/NftOwnable.sol +2 -4
  184. package/contracts/shared/Service.sol +1 -0
  185. package/contracts/types/RoleId.sol +8 -0
  186. package/contracts/types/StateId.sol +4 -0
  187. package/package.json +1 -1
@@ -4,23 +4,108 @@ 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
 
15
- constructor(
16
- address registry,
17
- NftId registryNftId,
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,
18
48
  address initialOwner
19
49
  )
50
+ internal
51
+ override
20
52
  {
21
- _initializeService(registry, initialOwner);
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()));
22
62
  }
23
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
+ }
24
109
 
25
110
  function _getAndVerifyComponentInfoAndInstance(
26
111
  ObjectType objectType
@@ -32,7 +117,7 @@ abstract contract ComponentServiceBase is Service {
32
117
  IInstance instance
33
118
  )
34
119
  {
35
- NftId componentNftId = getRegistry().getNftId(msg.sender);
120
+ NftId componentNftId = _registry.getNftId(msg.sender);
36
121
  require(componentNftId.gtz(), "ERROR_COMPONENT_UNKNOWN");
37
122
 
38
123
  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
 
@@ -20,6 +21,8 @@ interface ISetup {
20
21
  Fee poolFee; // pool fee on net premium
21
22
  Fee stakingFee; // pool fee on staked capital from investor
22
23
  Fee performanceFee; // pool fee on profits from capital investors
24
+ bool isIntercepting; // intercepts nft transfers (for products)
25
+ address wallet;
23
26
  }
24
27
 
25
28
  struct DistributionSetupInfo {
@@ -38,6 +41,7 @@ interface ISetup {
38
41
  Fee stakingFee; // pool fee on staked capital from investor
39
42
  Fee performanceFee; // pool fee on profits from capital investors
40
43
  bool isIntercepting; // intercepts nft transfers (for bundles)
44
+ bool isConfirmingApplication; // confirms applications before they are underwritten
41
45
  address wallet;
42
46
  }
43
47
  }
@@ -0,0 +1,88 @@
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
+
42
+ function _initialize(
43
+ address owner,
44
+ bytes memory data
45
+ )
46
+ internal
47
+ initializer
48
+ virtual override
49
+ {
50
+ address initialOwner = address(0);
51
+ (_registryAddress, initialOwner) = abi.decode(data, (address, address));
52
+ // TODO while DistributionService is not deployed in DistributionServiceManager constructor
53
+ // owner is DistributionServiceManager deployer
54
+ _initializeService(_registryAddress, owner);
55
+
56
+ _registerInterface(type(IService).interfaceId);
57
+ _registerInterface(type(IDistributionService).interfaceId);
58
+ }
59
+
60
+
61
+ function getName() public pure override(IService, Service) returns(string memory name) {
62
+ return NAME;
63
+ }
64
+
65
+ function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal override {
66
+ ISetup.DistributionSetupInfo memory initialSetup = abi.decode(
67
+ initialObjData,
68
+ (ISetup.DistributionSetupInfo)
69
+ );
70
+ instance.createDistributionSetup(componentNftId, initialSetup);
71
+ }
72
+
73
+ function setFees(
74
+ Fee memory distributionFee
75
+ )
76
+ external
77
+ override
78
+ {
79
+ (IRegistry.ObjectInfo memory info , IInstance instance) = _getAndVerifyComponentInfoAndInstance(DISTRIBUTION());
80
+ InstanceReader instanceReader = instance.getInstanceReader();
81
+ NftId distributionNftId = info.nftId;
82
+
83
+ ISetup.DistributionSetupInfo memory distSetupInfo = instanceReader.getDistributionSetupInfo(distributionNftId);
84
+ distSetupInfo.distributionFee = distributionFee;
85
+
86
+ instance.updateDistributionSetup(distributionNftId, distSetupInfo, KEEP_STATE());
87
+ }
88
+ }
@@ -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 {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
+ // TODO this must have a role or own nft to register service
33
+ //registryService.registerService(_distributionService);
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(_distributionService));
40
+
41
+ // implies that after this constructor call only upgrade functionality is available
42
+ _isDeployed = true;
43
+ }
44
+
45
+ //--- view functions ----------------------------------------------------//
46
+ function getDistributionService()
47
+ external
48
+ view
49
+ returns (DistributionService distributionService)
50
+ {
51
+ return _distributionService;
52
+ }
53
+
54
+ }
@@ -3,9 +3,13 @@ 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";
7
9
 
8
10
  interface IPoolService is IService {
11
+ error ErrorIPoolServiceInsufficientAllowance(address bundleOwner, address tokenHandlerAddress, uint256 amount);
12
+
9
13
  function setFees(
10
14
  Fee memory poolFee,
11
15
  Fee memory stakingFee,
@@ -25,6 +29,8 @@ interface IPoolService is IService {
25
29
  Fee memory fee
26
30
  ) external;
27
31
 
32
+ function updateBundle(NftId instanceNftId, NftId bundleNftId, IBundle.BundleInfo memory bundleInfo, StateId state) external;
33
+
28
34
  // function fundBundle(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
29
35
 
30
36
  // function defundBundle(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
@@ -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 setRiskInfo(
30
+ function updateRisk(
28
31
  RiskId riskId,
29
- IRisk.RiskInfo memory data
32
+ bytes memory data
30
33
  ) external;
31
34
 
32
35
 
33
36
  function updateRiskState(
34
37
  RiskId riskId,
35
- StateId state
38
+ StateId newState
36
39
  ) external;
37
40
 
38
41
 
@@ -0,0 +1,204 @@
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, RoleId} from "../../types/RoleId.sol";
18
+ import {Fee, FeeLib} from "../../types/Fee.sol";
19
+ import {Version, VersionLib} from "../../types/Version.sol";
20
+ import {KEEP_STATE, StateId} 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
+ string constant POOL_SERVICE_NAME = "PoolService";
32
+
33
+ contract PoolService is
34
+ ComponentServiceBase,
35
+ IPoolService
36
+ {
37
+ using NftIdLib for NftId;
38
+
39
+ string public constant NAME = "PoolService";
40
+
41
+ address internal _registryAddress;
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
+ // TODO while PoolService is not deployed in PoolServiceManager constructor
54
+ // owner is PoolServiceManager deployer
55
+ _initializeService(_registryAddress, owner);
56
+
57
+ _registerInterface(type(IService).interfaceId);
58
+ _registerInterface(type(IPoolService).interfaceId);
59
+ }
60
+
61
+ function getName() public pure override(Service, IService) returns(string memory name) {
62
+ return NAME;
63
+ }
64
+
65
+ function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal override {
66
+ ISetup.PoolSetupInfo memory initialSetup = abi.decode(
67
+ initialObjData,
68
+ (ISetup.PoolSetupInfo)
69
+ );
70
+ instance.createPoolSetup(componentNftId, initialSetup);
71
+ }
72
+
73
+ function setFees(
74
+ Fee memory poolFee,
75
+ Fee memory stakingFee,
76
+ Fee memory performanceFee
77
+ )
78
+ external
79
+ override
80
+ {
81
+ (IRegistry.ObjectInfo memory poolInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
82
+ InstanceReader instanceReader = instance.getInstanceReader();
83
+ NftId poolNftId = poolInfo.nftId;
84
+
85
+ ISetup.PoolSetupInfo memory poolSetupInfo = instanceReader.getPoolSetupInfo(poolNftId);
86
+ poolSetupInfo.poolFee = poolFee;
87
+ poolSetupInfo.stakingFee = stakingFee;
88
+ poolSetupInfo.performanceFee = performanceFee;
89
+
90
+ instance.updatePoolSetup(poolNftId, poolSetupInfo, KEEP_STATE());
91
+ }
92
+
93
+ function createBundle(
94
+ address owner,
95
+ Fee memory fee,
96
+ uint256 stakingAmount,
97
+ uint256 lifetime,
98
+ bytes calldata filter
99
+ )
100
+ external
101
+ override
102
+ returns(NftId bundleNftId)
103
+ {
104
+ (IRegistry.ObjectInfo memory info, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
105
+ InstanceReader instanceReader = instance.getInstanceReader();
106
+ NftId poolNftId = info.nftId;
107
+
108
+ IBundle.BundleInfo memory bundleInfo = IBundle.BundleInfo(
109
+ poolNftId,
110
+ fee,
111
+ filter,
112
+ stakingAmount,
113
+ 0,
114
+ stakingAmount,
115
+ lifetime,
116
+ zeroTimestamp(),
117
+ zeroTimestamp()
118
+ );
119
+
120
+ // register bundle with registry
121
+ bundleNftId = getRegistryService().registerBundle(
122
+ IRegistry.ObjectInfo(
123
+ zeroNftId(),
124
+ poolNftId,
125
+ BUNDLE(),
126
+ false, // intercepting property for bundles is defined on pool
127
+ address(0),
128
+ owner,
129
+ abi.encode(bundleInfo)
130
+ )
131
+ );
132
+
133
+ // create bundle info in instance
134
+ instance.createBundle(bundleNftId, bundleInfo);
135
+
136
+ // TODO add bundle to pool in instance
137
+
138
+ _processStakingByTreasury(
139
+ instanceReader,
140
+ poolNftId,
141
+ bundleNftId,
142
+ stakingAmount);
143
+
144
+ // TODO add logging
145
+ }
146
+
147
+ function setBundleFee(
148
+ NftId bundleNftId,
149
+ Fee memory fee
150
+ )
151
+ external
152
+ override
153
+ {
154
+ (IRegistry.ObjectInfo memory info , IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
155
+ InstanceReader instanceReader = instance.getInstanceReader();
156
+ NftId poolNftId = info.nftId;
157
+
158
+ IBundle.BundleInfo memory bundleInfo = instanceReader.getBundleInfo(bundleNftId);
159
+ require(bundleInfo.poolNftId.gtz(), "ERROR:PLS-010:BUNDLE_UNKNOWN");
160
+ require(poolNftId == bundleInfo.poolNftId, "ERROR:PLS-011:BUNDLE_POOL_MISMATCH");
161
+
162
+ bundleInfo.fee = fee;
163
+
164
+ instance.updateBundle(bundleNftId, bundleInfo, KEEP_STATE());
165
+ }
166
+
167
+ function updateBundle(NftId instanceNftId, NftId bundleNftId, IBundle.BundleInfo memory bundleInfo, StateId state)
168
+ external
169
+ onlyService
170
+ {
171
+ IRegistry.ObjectInfo memory instanceInfo = getRegistry().getObjectInfo(instanceNftId);
172
+ IInstance instance = IInstance(instanceInfo.objectAddress);
173
+ instance.updateBundle(bundleNftId, bundleInfo, state);
174
+ }
175
+
176
+ function _processStakingByTreasury(
177
+ InstanceReader instanceReader,
178
+ NftId poolNftId,
179
+ NftId bundleNftId,
180
+ uint256 stakingAmount
181
+ )
182
+ internal
183
+ {
184
+ // process token transfer(s)
185
+ if(stakingAmount > 0) {
186
+ ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
187
+ TokenHandler tokenHandler = poolInfo.tokenHandler;
188
+ address bundleOwner = getRegistry().ownerOf(bundleNftId);
189
+ Fee memory stakingFee = poolInfo.stakingFee;
190
+
191
+ tokenHandler.transfer(
192
+ bundleOwner,
193
+ poolInfo.wallet,
194
+ stakingAmount
195
+ );
196
+
197
+
198
+ if (! FeeLib.feeIsZero(stakingFee)) {
199
+ (uint256 stakingFeeAmount, uint256 netAmount) = FeeLib.calculateFee(stakingFee, stakingAmount);
200
+ // TODO: track staking fees in pool's state (issue #177)
201
+ }
202
+ }
203
+ }
204
+ }
@@ -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
+ }