@etherisc/gif-next 0.0.2-bdd64e2-180 → 0.0.2-bf75dbb-287

Sign up to get free protection for your applications and to get access to all the features.
Files changed (204) hide show
  1. package/README.md +63 -1
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +126 -0
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +136 -62
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +88 -0
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +0 -52
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +28 -2
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  14. package/artifacts/contracts/components/Pool.sol/Pool.json +168 -102
  15. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  16. package/artifacts/contracts/components/Product.sol/Product.json +144 -64
  17. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
  18. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  35. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  36. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  37. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +4 -0
  38. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +1206 -0
  39. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +4 -0
  40. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +788 -0
  41. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +4 -0
  42. package/artifacts/contracts/instance/{AccessManagedSimple.sol/AccessManagedSimple.json → Cloneable.sol/Cloneable.json} +86 -2
  43. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
  44. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  45. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +963 -18
  46. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
  47. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.json +448 -0
  48. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  49. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +17 -1
  50. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  51. package/artifacts/contracts/instance/Instance.sol/Instance.json +143 -139
  52. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  53. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +55 -32
  54. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.dbg.json +4 -0
  55. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.json +763 -0
  56. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  57. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +74 -40
  58. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  59. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +196 -64
  60. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  61. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +72 -32
  62. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +4 -0
  63. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +285 -0
  64. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  65. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +56 -2
  66. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  67. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  68. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  69. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  70. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  71. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  72. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  73. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  74. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  75. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  76. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  77. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  78. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  79. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +16 -16
  80. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +83 -24
  82. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  83. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +26 -18
  84. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  85. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  86. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  87. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +167 -0
  88. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  89. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +40 -31
  90. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  91. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +281 -28
  92. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  93. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +36 -20
  94. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  95. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +1147 -0
  96. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
  97. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +488 -0
  98. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  99. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  100. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +2 -110
  101. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  102. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +94 -0
  103. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  104. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  105. package/artifacts/contracts/registry/Registry.sol/Registry.json +35 -146
  106. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  107. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +76 -20
  108. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  109. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +26 -34
  110. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  111. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +12 -12
  112. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  113. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  114. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  115. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  116. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  117. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  118. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  119. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  120. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  121. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  122. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  123. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +2 -2
  124. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
  125. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  126. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  127. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  128. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  129. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  130. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  131. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
  132. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  133. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  134. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  135. package/artifacts/contracts/test/TestService.sol/TestService.json +9 -9
  136. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  137. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  138. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  139. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  140. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  141. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  142. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  143. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  144. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  145. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  146. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  147. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  148. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +26 -3
  149. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  150. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  151. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  152. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  153. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  154. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  155. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  156. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  157. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  158. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  159. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  160. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  161. package/contracts/components/BaseComponent.sol +49 -8
  162. package/contracts/components/Distribution.sol +12 -15
  163. package/contracts/components/IBaseComponent.sol +6 -0
  164. package/contracts/components/IDistributionComponent.sol +0 -2
  165. package/contracts/components/IPoolComponent.sol +5 -1
  166. package/contracts/components/Pool.sol +40 -20
  167. package/contracts/components/Product.sol +33 -41
  168. package/contracts/instance/AccessManagerUpgradeableInitializeable.sol +23 -0
  169. package/contracts/instance/BundleManager.sol +129 -0
  170. package/contracts/instance/Cloneable.sol +46 -0
  171. package/contracts/instance/IInstance.sol +21 -4
  172. package/contracts/instance/IInstanceBase.sol +26 -0
  173. package/contracts/instance/IInstanceService.sol +7 -3
  174. package/contracts/instance/Instance.sol +30 -19
  175. package/contracts/instance/InstanceAccessManager.sol +6 -6
  176. package/contracts/instance/InstanceBase.sol +41 -0
  177. package/contracts/instance/InstanceReader.sol +9 -0
  178. package/contracts/instance/InstanceService.sol +114 -32
  179. package/contracts/instance/InstanceServiceManager.sol +6 -5
  180. package/contracts/instance/ObjectManager.sol +101 -0
  181. package/contracts/instance/base/ComponentServiceBase.sol +95 -2
  182. package/contracts/instance/module/ISetup.sol +3 -1
  183. package/contracts/instance/service/DistributionService.sol +8 -25
  184. package/contracts/instance/service/DistributionServiceManager.sol +6 -5
  185. package/contracts/instance/service/IPoolService.sol +16 -2
  186. package/contracts/instance/service/IProductService.sol +6 -3
  187. package/contracts/instance/service/PoolService.sol +118 -42
  188. package/contracts/instance/service/PoolServiceManager.sol +6 -5
  189. package/contracts/instance/service/ProductService.sol +570 -0
  190. package/contracts/instance/service/ProductServiceManager.sol +54 -0
  191. package/contracts/registry/IRegistry.sol +5 -18
  192. package/contracts/registry/IRegistryService.sol +28 -11
  193. package/contracts/registry/Registry.sol +4 -45
  194. package/contracts/registry/RegistryService.sol +30 -71
  195. package/contracts/shared/NftOwnable.sol +2 -4
  196. package/contracts/shared/Service.sol +1 -0
  197. package/contracts/types/NftIdSet.sol +26 -24
  198. package/contracts/types/RoleId.sol +1 -0
  199. package/package.json +1 -1
  200. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +0 -4
  201. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +0 -4
  202. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.json +0 -1132
  203. package/contracts/instance/AccessManagedSimple.sol +0 -115
  204. package/contracts/instance/AccessManagerSimple.sol +0 -692
@@ -4,15 +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
- error CallerIsNotComponentOwner();
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
+ }
16
109
 
17
110
  function _getAndVerifyComponentInfoAndInstance(
18
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
  }
@@ -38,7 +38,6 @@ contract DistributionService is
38
38
  string public constant NAME = "DistributionService";
39
39
 
40
40
  address internal _registryAddress;
41
- InstanceService internal _instanceService;
42
41
 
43
42
  function _initialize(
44
43
  address owner,
@@ -50,11 +49,9 @@ contract DistributionService is
50
49
  {
51
50
  address initialOwner = address(0);
52
51
  (_registryAddress, initialOwner) = abi.decode(data, (address, address));
53
-
54
- IRegistry registry = IRegistry(_registryAddress);
55
- _instanceService = InstanceService(registry.getServiceAddress("InstanceService", getMajorVersion()));
56
-
57
- _initializeService(_registryAddress, initialOwner);
52
+ // TODO while DistributionService is not deployed in DistributionServiceManager constructor
53
+ // owner is DistributionServiceManager deployer
54
+ _initializeService(_registryAddress, owner);
58
55
 
59
56
  _registerInterface(type(IService).interfaceId);
60
57
  _registerInterface(type(IDistributionService).interfaceId);
@@ -65,26 +62,12 @@ contract DistributionService is
65
62
  return NAME;
66
63
  }
67
64
 
68
- function register(address distributionComponentAddress)
69
- external
70
- returns (NftId distributionNftId)
71
- {
72
- address componentOwner = msg.sender;
73
- Distribution distribution = Distribution(distributionComponentAddress);
74
- IInstance instance = distribution.getInstance();
75
- INftOwnable nftOwnable = INftOwnable(address(instance));
76
-
77
- require(_instanceService.hasRole(componentOwner, DISTRIBUTION_OWNER_ROLE(), nftOwnable.getNftId()), "ERROR:DIS-001:NOT_DISTRIBUTION_OWNER_ROLE");
78
-
79
- IRegistryService registryService = getRegistryService();
80
- (IRegistry.ObjectInfo memory distributionObjInfo, ) = registryService.registerDistribution(
81
- distribution,
82
- componentOwner
65
+ function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal override {
66
+ ISetup.DistributionSetupInfo memory initialSetup = abi.decode(
67
+ initialObjData,
68
+ (ISetup.DistributionSetupInfo)
83
69
  );
84
- distributionNftId = distributionObjInfo.nftId;
85
-
86
- ISetup.DistributionSetupInfo memory initialSetup = distribution.getInitialSetupInfo();
87
- instance.createDistributionSetup(distributionNftId, initialSetup);
70
+ instance.createDistributionSetup(componentNftId, initialSetup);
88
71
  }
89
72
 
90
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
- registryService.registerService(_distributionService);
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
- address(registryAddress),
38
- address(_distributionService));
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
- // function lockBundle(NftId bundleNftId) external;
46
+ function lockBundle(NftId bundleNftId) external;
33
47
 
34
- // function unlockBundle(NftId bundleNftId) external;
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 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
 
@@ -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";
@@ -14,21 +15,21 @@ import {INftOwnable} from "../../shared/INftOwnable.sol";
14
15
 
15
16
  import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
16
17
  import {POOL, BUNDLE} from "../../types/ObjectType.sol";
17
- import {POOL_OWNER_ROLE} from "../../types/RoleId.sol";
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
@@ -40,7 +41,6 @@ contract PoolService is
40
41
  string public constant NAME = "PoolService";
41
42
 
42
43
  address internal _registryAddress;
43
- InstanceService internal _instanceService;
44
44
 
45
45
  function _initialize(
46
46
  address owner,
@@ -52,11 +52,9 @@ contract PoolService is
52
52
  {
53
53
  address initialOwner = address(0);
54
54
  (_registryAddress, initialOwner) = abi.decode(data, (address, address));
55
-
56
- IRegistry registry = IRegistry(_registryAddress);
57
- _instanceService = InstanceService(registry.getServiceAddress("InstanceService", getMajorVersion()));
58
-
59
- _initializeService(_registryAddress, initialOwner);
55
+ // TODO while PoolService is not deployed in PoolServiceManager constructor
56
+ // owner is PoolServiceManager deployer
57
+ _initializeService(_registryAddress, owner);
60
58
 
61
59
  _registerInterface(type(IService).interfaceId);
62
60
  _registerInterface(type(IPoolService).interfaceId);
@@ -66,26 +64,12 @@ contract PoolService is
66
64
  return NAME;
67
65
  }
68
66
 
69
- function register(address poolComponentAddress)
70
- external
71
- returns (NftId poolNftId)
72
- {
73
- address componentOwner = msg.sender;
74
- Pool pool = Pool(poolComponentAddress);
75
- IInstance instance = pool.getInstance();
76
- INftOwnable nftOwnable = INftOwnable(address(instance));
77
-
78
- require(_instanceService.hasRole(componentOwner, POOL_OWNER_ROLE(), nftOwnable.getNftId()), "ERROR:POS-001:NOT_POOL_OWNER_ROLE");
79
-
80
- IRegistryService registryService = getRegistryService();
81
- (IRegistry.ObjectInfo memory poolObjInfo, ) = registryService.registerPool(
82
- pool,
83
- componentOwner
67
+ function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal override {
68
+ ISetup.PoolSetupInfo memory initialSetup = abi.decode(
69
+ initialObjData,
70
+ (ISetup.PoolSetupInfo)
84
71
  );
85
- poolNftId = poolObjInfo.nftId;
86
-
87
- ISetup.PoolSetupInfo memory initialSetup = pool.getInitialSetupInfo();
88
- instance.createPoolSetup(poolNftId, initialSetup);
72
+ instance.createPoolSetup(componentNftId, initialSetup);
89
73
  }
90
74
 
91
75
  function setFees(
@@ -125,7 +109,7 @@ contract PoolService is
125
109
 
126
110
  IBundle.BundleInfo memory bundleInfo = IBundle.BundleInfo(
127
111
  poolNftId,
128
- FeeLib.zeroFee(),
112
+ fee,
129
113
  filter,
130
114
  stakingAmount,
131
115
  0,
@@ -151,15 +135,14 @@ contract PoolService is
151
135
  // create bundle info in instance
152
136
  instance.createBundle(bundleNftId, bundleInfo);
153
137
 
154
- // TODO add bundle to pool in instance
138
+ BundleManager bundleManager = instance.getBundleManager();
139
+ bundleManager.add(bundleNftId);
155
140
 
156
- // TODO collect capital
157
- // _processStakingByTreasury(
158
- // instanceReader,
159
- // zeroNftId(),
160
- // poolNftId,
161
- // bundleNftId,
162
- // stakingAmount);
141
+ _processStakingByTreasury(
142
+ instanceReader,
143
+ poolNftId,
144
+ bundleNftId,
145
+ stakingAmount);
163
146
 
164
147
  // TODO add logging
165
148
  }
@@ -184,11 +167,97 @@ contract PoolService is
184
167
  instance.updateBundle(bundleNftId, bundleInfo, KEEP_STATE());
185
168
  }
186
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);
187
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
+ }
188
258
 
189
259
  function _processStakingByTreasury(
190
260
  InstanceReader instanceReader,
191
- NftId productNftId,
192
261
  NftId poolNftId,
193
262
  NftId bundleNftId,
194
263
  uint256 stakingAmount
@@ -197,15 +266,22 @@ contract PoolService is
197
266
  {
198
267
  // process token transfer(s)
199
268
  if(stakingAmount > 0) {
200
- TokenHandler tokenHandler = TokenHandler(instanceReader.getTokenHandler(productNftId));
201
- address bundleOwner = getRegistry().ownerOf(bundleNftId);
202
269
  ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
203
-
270
+ TokenHandler tokenHandler = poolInfo.tokenHandler;
271
+ address bundleOwner = getRegistry().ownerOf(bundleNftId);
272
+ Fee memory stakingFee = poolInfo.stakingFee;
273
+
204
274
  tokenHandler.transfer(
205
275
  bundleOwner,
206
276
  poolInfo.wallet,
207
277
  stakingAmount
208
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
+ }
209
285
  }
210
286
  }
211
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
- registryService.registerService(_poolService);
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
- address(registryAddress),
38
- address(_poolService));
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;