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

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 (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;