@etherisc/gif-next 0.0.2-b4fc06b-491 → 0.0.2-b63c0fc-410

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 (178) 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 +75 -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/IDistributionComponent.sol/IDistributionComponent.json +52 -0
  9. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  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 +112 -13
  13. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  14. package/artifacts/contracts/components/Product.sol/Product.json +39 -18
  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 +403 -1
  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 +124 -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 +143 -38
  51. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  52. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +129 -33
  53. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  54. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +51 -11
  55. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  56. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +5 -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 +18 -18
  73. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  74. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +657 -0
  75. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
  76. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +436 -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/IProductService.sol/IProductService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  82. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +796 -0
  83. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
  84. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +448 -0
  85. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  86. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  87. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +26 -0
  88. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  89. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +0 -19
  90. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  91. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  92. package/artifacts/contracts/registry/Registry.sol/Registry.json +60 -24
  93. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  94. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +20 -44
  95. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  96. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +46 -29
  97. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
  98. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +410 -0
  99. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  100. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  101. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  102. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  103. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  104. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  105. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  106. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  107. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  108. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  109. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  110. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  111. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +4 -4
  112. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
  113. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  114. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  115. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  116. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  117. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  118. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  119. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
  120. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  121. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  122. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  123. package/artifacts/contracts/test/TestService.sol/TestService.json +11 -11
  124. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  125. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  126. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  127. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  128. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  129. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  130. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  131. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  132. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  133. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  134. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  135. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  136. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  137. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  138. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  139. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  140. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  141. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  142. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  143. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  144. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  145. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  146. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  147. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  148. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  149. package/contracts/components/BaseComponent.sol +8 -3
  150. package/contracts/components/Distribution.sol +13 -13
  151. package/contracts/components/IBaseComponent.sol +1 -0
  152. package/contracts/components/IDistributionComponent.sol +3 -0
  153. package/contracts/components/Pool.sol +14 -26
  154. package/contracts/components/Product.sol +1 -1
  155. package/contracts/instance/AccessManagedSimple.sol +1 -8
  156. package/contracts/instance/IInstance.sol +15 -4
  157. package/contracts/instance/Instance.sol +16 -15
  158. package/contracts/instance/InstanceAccessManager.sol +1 -1
  159. package/contracts/instance/InstanceReader.sol +17 -1
  160. package/contracts/instance/InstanceService.sol +39 -7
  161. package/contracts/instance/base/ComponentServiceBase.sol +2 -10
  162. package/contracts/instance/module/IBundle.sol +1 -0
  163. package/contracts/instance/module/ISetup.sol +1 -0
  164. package/contracts/instance/service/DistributionService.sol +105 -0
  165. package/contracts/instance/service/DistributionServiceManager.sol +53 -0
  166. package/contracts/instance/service/PoolService.sol +211 -0
  167. package/contracts/instance/service/PoolServiceManager.sol +53 -0
  168. package/contracts/registry/IRegistry.sol +4 -0
  169. package/contracts/registry/IRegistryService.sol +0 -2
  170. package/contracts/registry/Registry.sol +23 -2
  171. package/contracts/registry/RegistryService.sol +2 -47
  172. package/contracts/registry/RegistryServiceManager.sol +21 -5
  173. package/contracts/registry/TokenRegistry.sol +111 -0
  174. package/contracts/shared/ERC165.sol +6 -2
  175. package/contracts/shared/Registerable.sol +1 -0
  176. package/contracts/types/RoleId.sol +6 -0
  177. package/contracts/types/StateId.sol +4 -0
  178. package/package.json +1 -1
@@ -12,15 +12,7 @@ import {Version, VersionPart, VersionLib} from "../../types/Version.sol";
12
12
 
13
13
  abstract contract ComponentServiceBase is Service {
14
14
 
15
- constructor(
16
- address registry,
17
- NftId registryNftId,
18
- address initialOwner
19
- )
20
- {
21
- _initializeService(registry, initialOwner);
22
- }
23
-
15
+ error CallerIsNotComponentOwner();
24
16
 
25
17
  function _getAndVerifyComponentInfoAndInstance(
26
18
  ObjectType objectType
@@ -32,7 +24,7 @@ abstract contract ComponentServiceBase is Service {
32
24
  IInstance instance
33
25
  )
34
26
  {
35
- NftId componentNftId = getRegistry().getNftId(msg.sender);
27
+ NftId componentNftId = _registry.getNftId(msg.sender);
36
28
  require(componentNftId.gtz(), "ERROR_COMPONENT_UNKNOWN");
37
29
 
38
30
  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
 
@@ -0,0 +1,105 @@
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
+ InstanceService internal _instanceService;
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
+
54
+ IRegistry registry = IRegistry(_registryAddress);
55
+ _instanceService = InstanceService(registry.getServiceAddress("InstanceService", getMajorVersion()));
56
+
57
+ _initializeService(_registryAddress, initialOwner);
58
+
59
+ _registerInterface(type(IService).interfaceId);
60
+ _registerInterface(type(IDistributionService).interfaceId);
61
+ }
62
+
63
+
64
+ function getName() public pure override(IService, Service) returns(string memory name) {
65
+ return NAME;
66
+ }
67
+
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");
78
+
79
+ IRegistryService registryService = getRegistryService();
80
+ (IRegistry.ObjectInfo memory distributionObjInfo, ) = registryService.registerDistribution(
81
+ distribution,
82
+ componentOwner
83
+ );
84
+ distributionNftId = distributionObjInfo.nftId;
85
+
86
+ ISetup.DistributionSetupInfo memory initialSetup = distribution.getInitialSetupInfo();
87
+ instance.createDistributionSetup(distributionNftId, initialSetup);
88
+ }
89
+
90
+ function setFees(
91
+ Fee memory distributionFee
92
+ )
93
+ external
94
+ override
95
+ {
96
+ (IRegistry.ObjectInfo memory info , IInstance instance) = _getAndVerifyComponentInfoAndInstance(DISTRIBUTION());
97
+ InstanceReader instanceReader = instance.getInstanceReader();
98
+ NftId distributionNftId = info.nftId;
99
+
100
+ ISetup.DistributionSetupInfo memory distSetupInfo = instanceReader.getDistributionSetupInfo(distributionNftId);
101
+ distSetupInfo.distributionFee = distributionFee;
102
+
103
+ instance.updateDistributionSetup(distributionNftId, distSetupInfo, KEEP_STATE());
104
+ }
105
+ }
@@ -0,0 +1,53 @@
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
+
33
+ registryService.registerService(_distributionService);
34
+
35
+ // link ownership of instance service manager ot nft owner of instance service
36
+ _linkToNftOwnable(
37
+ address(registryAddress),
38
+ address(_distributionService));
39
+
40
+ // implies that after this constructor call only upgrade functionality is available
41
+ _isDeployed = true;
42
+ }
43
+
44
+ //--- view functions ----------------------------------------------------//
45
+ function getDistributionService()
46
+ external
47
+ view
48
+ returns (DistributionService distributionService)
49
+ {
50
+ return _distributionService;
51
+ }
52
+
53
+ }
@@ -0,0 +1,211 @@
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} from "../../types/RoleId.sol";
18
+ import {Fee, FeeLib} from "../../types/Fee.sol";
19
+ import {Version, VersionLib} from "../../types/Version.sol";
20
+ import {KEEP_STATE} 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
+
32
+ string constant POOL_SERVICE_NAME = "PoolService";
33
+
34
+ contract PoolService is
35
+ ComponentServiceBase,
36
+ IPoolService
37
+ {
38
+ using NftIdLib for NftId;
39
+
40
+ string public constant NAME = "PoolService";
41
+
42
+ address internal _registryAddress;
43
+ InstanceService internal _instanceService;
44
+
45
+ function _initialize(
46
+ address owner,
47
+ bytes memory data
48
+ )
49
+ internal
50
+ initializer
51
+ virtual override
52
+ {
53
+ address initialOwner = address(0);
54
+ (_registryAddress, initialOwner) = abi.decode(data, (address, address));
55
+
56
+ IRegistry registry = IRegistry(_registryAddress);
57
+ _instanceService = InstanceService(registry.getServiceAddress("InstanceService", getMajorVersion()));
58
+
59
+ _initializeService(_registryAddress, initialOwner);
60
+
61
+ _registerInterface(type(IService).interfaceId);
62
+ _registerInterface(type(IPoolService).interfaceId);
63
+ }
64
+
65
+ function getName() public pure override(Service, IService) returns(string memory name) {
66
+ return NAME;
67
+ }
68
+
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
84
+ );
85
+ poolNftId = poolObjInfo.nftId;
86
+
87
+ ISetup.PoolSetupInfo memory initialSetup = pool.getInitialSetupInfo();
88
+ instance.createPoolSetup(poolNftId, initialSetup);
89
+ }
90
+
91
+ function setFees(
92
+ Fee memory poolFee,
93
+ Fee memory stakingFee,
94
+ Fee memory performanceFee
95
+ )
96
+ external
97
+ override
98
+ {
99
+ (IRegistry.ObjectInfo memory poolInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
100
+ InstanceReader instanceReader = instance.getInstanceReader();
101
+ NftId poolNftId = poolInfo.nftId;
102
+
103
+ ISetup.PoolSetupInfo memory poolSetupInfo = instanceReader.getPoolSetupInfo(poolNftId);
104
+ poolSetupInfo.poolFee = poolFee;
105
+ poolSetupInfo.stakingFee = stakingFee;
106
+ poolSetupInfo.performanceFee = performanceFee;
107
+
108
+ instance.updatePoolSetup(poolNftId, poolSetupInfo, KEEP_STATE());
109
+ }
110
+
111
+ function createBundle(
112
+ address owner,
113
+ Fee memory fee,
114
+ uint256 stakingAmount,
115
+ uint256 lifetime,
116
+ bytes calldata filter
117
+ )
118
+ external
119
+ override
120
+ returns(NftId bundleNftId)
121
+ {
122
+ (IRegistry.ObjectInfo memory info, IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
123
+ InstanceReader instanceReader = instance.getInstanceReader();
124
+ NftId poolNftId = info.nftId;
125
+
126
+ IBundle.BundleInfo memory bundleInfo = IBundle.BundleInfo(
127
+ poolNftId,
128
+ FeeLib.zeroFee(),
129
+ filter,
130
+ stakingAmount,
131
+ 0,
132
+ stakingAmount,
133
+ lifetime,
134
+ zeroTimestamp(),
135
+ zeroTimestamp()
136
+ );
137
+
138
+ // register bundle with registry
139
+ bundleNftId = getRegistryService().registerBundle(
140
+ IRegistry.ObjectInfo(
141
+ zeroNftId(),
142
+ poolNftId,
143
+ BUNDLE(),
144
+ false, // intercepting property for bundles is defined on pool
145
+ address(0),
146
+ owner,
147
+ abi.encode(bundleInfo)
148
+ )
149
+ );
150
+
151
+ // create bundle info in instance
152
+ instance.createBundle(bundleNftId, bundleInfo);
153
+
154
+ // TODO add bundle to pool in instance
155
+
156
+ // collect capital
157
+ _processStakingByTreasury(
158
+ instanceReader,
159
+ zeroNftId(),
160
+ poolNftId,
161
+ bundleNftId,
162
+ stakingAmount);
163
+
164
+ // TODO add logging
165
+ }
166
+
167
+ function setBundleFee(
168
+ NftId bundleNftId,
169
+ Fee memory fee
170
+ )
171
+ external
172
+ override
173
+ {
174
+ (IRegistry.ObjectInfo memory info , IInstance instance) = _getAndVerifyComponentInfoAndInstance(POOL());
175
+ InstanceReader instanceReader = instance.getInstanceReader();
176
+ NftId poolNftId = info.nftId;
177
+
178
+ IBundle.BundleInfo memory bundleInfo = instanceReader.getBundleInfo(bundleNftId);
179
+ require(bundleInfo.poolNftId.gtz(), "ERROR:PLS-010:BUNDLE_UNKNOWN");
180
+ require(poolNftId == bundleInfo.poolNftId, "ERROR:PLS-011:BUNDLE_POOL_MISMATCH");
181
+
182
+ bundleInfo.fee = fee;
183
+
184
+ instance.updateBundle(bundleNftId, bundleInfo, KEEP_STATE());
185
+ }
186
+
187
+
188
+
189
+ function _processStakingByTreasury(
190
+ InstanceReader instanceReader,
191
+ NftId productNftId,
192
+ NftId poolNftId,
193
+ NftId bundleNftId,
194
+ uint256 stakingAmount
195
+ )
196
+ internal
197
+ {
198
+ // process token transfer(s)
199
+ if(stakingAmount > 0) {
200
+ TokenHandler tokenHandler = TokenHandler(instanceReader.getTokenHandler(productNftId));
201
+ address bundleOwner = getRegistry().ownerOf(bundleNftId);
202
+ ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
203
+
204
+ tokenHandler.transfer(
205
+ bundleOwner,
206
+ poolInfo.wallet,
207
+ stakingAmount
208
+ );
209
+ }
210
+ }
211
+ }
@@ -0,0 +1,53 @@
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
+
33
+ registryService.registerService(_poolService);
34
+
35
+ // link ownership of instance service manager ot nft owner of instance service
36
+ _linkToNftOwnable(
37
+ address(registryAddress),
38
+ address(_poolService));
39
+
40
+ // implies that after this constructor call only upgrade functionality is available
41
+ _isDeployed = true;
42
+ }
43
+
44
+ //--- view functions ----------------------------------------------------//
45
+ function getPoolService()
46
+ external
47
+ view
48
+ returns (PoolService poolService)
49
+ {
50
+ return _poolService;
51
+ }
52
+
53
+ }
@@ -55,6 +55,10 @@ interface IRegistry is IERC165 {
55
55
 
56
56
  function setTokenActive(address token, VersionPart majorVersion, bool active) external;
57
57
 
58
+ function getMajorVersionMin() external view returns (VersionPart);
59
+
60
+ function getMajorVersionMax() external view returns (VersionPart);
61
+
58
62
  function getMajorVersion() external view returns (VersionPart);
59
63
 
60
64
  function getObjectCount() external view returns (uint256);
@@ -12,8 +12,6 @@ import {IBaseComponent} from "../components/IBaseComponent.sol";
12
12
 
13
13
  interface IRegistryService is IService {
14
14
 
15
- function registerToken(address tokenAddress) external returns(NftId nftId);
16
-
17
15
  function registerService(IService service) external returns(IRegistry.ObjectInfo memory info, bytes memory data);
18
16
 
19
17
  function registerInstance(IRegisterable instance)
@@ -28,7 +28,7 @@ contract Registry is
28
28
  ERC165,
29
29
  IRegistry
30
30
  {
31
- uint256 public constant GIF_MAJOR_VERSION_AT_DEPLOYMENT = 3; // at registry deploymnet time
31
+ uint256 public constant GIF_MAJOR_VERSION_AT_DEPLOYMENT = 3;
32
32
  address public constant NFT_LOCK_ADDRESS = address(0x1);
33
33
  uint256 public constant REGISTRY_SERVICE_TOKEN_SEQUENCE_ID = 3;
34
34
  string public constant EMPTY_URI = "";
@@ -98,6 +98,7 @@ contract Registry is
98
98
 
99
99
  // from IRegistry
100
100
 
101
+ /// @dev latest GIF release version
101
102
  function setMajorVersion(VersionPart newMajorVersion)
102
103
  external
103
104
  onlyOwner
@@ -181,6 +182,9 @@ contract Registry is
181
182
  emit LogRegistration(info);
182
183
  }
183
184
 
185
+ /// @dev token state is informative, registry have no clue about used tokens
186
+ // component owner is responsible for token selection and operations
187
+ // service MUST deny registration of component with inactive token
184
188
  function setTokenActive(address token, VersionPart majorVersion, bool active)
185
189
  external
186
190
  onlyOwner
@@ -209,10 +213,27 @@ contract Registry is
209
213
  emit LogTokenStateSet(token, majorVersion, active);
210
214
  }
211
215
 
212
- /// @dev latest GIF release version
216
+ /// @dev earliest GIF major version
217
+ function getMajorVersionMin() external view returns (VersionPart) {
218
+ return VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
219
+ }
220
+
221
+ // TODO make distinction between active an not yet active version
222
+ // need to be thought trough, not yet clear if necessary
223
+ // need to answer question: what is the latest version during the upgrade process?
224
+ // likely setting up a new gif version does not fit into a single tx
225
+ // in this case we might want to have a period where the latest version is
226
+ // in the process of being set up while the latest active version is 1 major release smaller
227
+ /// @dev latest GIF major version (might not yet be active)
228
+ function getMajorVersionMax() external view returns (VersionPart) {
229
+ return _majorVersion;
230
+ }
231
+
232
+ /// @dev latest active GIF release version
213
233
  function getMajorVersion() external view returns (VersionPart) {
214
234
  return _majorVersion;
215
235
  }
236
+
216
237
 
217
238
  function getObjectCount() external view override returns (uint256) {
218
239
  return _chainNft.totalSupply();
@@ -1,9 +1,7 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.20;
3
3
 
4
- import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
5
4
  import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
6
- import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
7
5
  import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";
8
6
 
9
7
  import {IRegistry} from "./IRegistry.sol";
@@ -22,7 +20,7 @@ import {Versionable} from "../../contracts/shared/Versionable.sol";
22
20
  import {IRegisterable} from "../../contracts/shared/IRegisterable.sol";
23
21
 
24
22
  import {RoleId, PRODUCT_OWNER_ROLE, POOL_OWNER_ROLE, ORACLE_OWNER_ROLE} from "../../contracts/types/RoleId.sol";
25
- import {ObjectType, REGISTRY, TOKEN, SERVICE, PRODUCT, ORACLE, POOL, TOKEN, INSTANCE, DISTRIBUTION, POLICY, BUNDLE} from "../../contracts/types/ObjectType.sol";
23
+ import {ObjectType, REGISTRY, SERVICE, PRODUCT, ORACLE, POOL, INSTANCE, DISTRIBUTION, POLICY, BUNDLE} from "../../contracts/types/ObjectType.sol";
26
24
  import {StateId, ACTIVE, PAUSED} from "../../contracts/types/StateId.sol";
27
25
  import {NftId, NftIdLib, zeroNftId} from "../../contracts/types/NftId.sol";
28
26
  import {Fee, FeeLib} from "../../contracts/types/Fee.sol";
@@ -41,10 +39,10 @@ contract RegistryService is
41
39
  {
42
40
  using NftIdLib for NftId;
43
41
 
42
+ // TODO move errors to interface contract
44
43
  error SelfRegistration();
45
44
  error NotRegistryOwner();
46
45
 
47
- error NotToken();
48
46
  error NotService();
49
47
  error NotInstance();
50
48
  error NotProduct();
@@ -58,7 +56,6 @@ contract RegistryService is
58
56
  error InvalidInitialOwner(address initialOwner);
59
57
  error InvalidAddress(address registerableAddress);
60
58
 
61
-
62
59
  // Initial value for constant variable has to be compile-time constant
63
60
  // TODO define types as constants?
64
61
  //ObjectType public constant SERVICE_TYPE = REGISTRY();
@@ -69,48 +66,6 @@ contract RegistryService is
69
66
 
70
67
  address public constant NFT_LOCK_ADDRESS = address(0x1);
71
68
 
72
- /// @dev
73
- // msg.sender - ONLY registry owner
74
- // CAN NOT register itself
75
- // CAN NOT register IRegisterable address
76
- // CAN register ONLY valid object-parent types combinations for TOKEN
77
- // IMPORTANT: MUST NOT call untrusted contract inbetween calls to registry/instance (trusted contracts)
78
- // motivation: registry/instance state may change during external call
79
- // TODO it may be usefull to have transferable token nft in order to delist token, make it invalid for new beginings
80
- // TODO: MUST prohibit registration of precompiles addresses
81
- function registerToken(address tokenAddress)
82
- external
83
- returns(NftId nftId)
84
- {
85
- if(msg.sender == tokenAddress) {
86
- revert SelfRegistration();
87
- }
88
-
89
- // MUST not revert if no ERC165 support
90
- if(tokenAddress.code.length == 0 ||
91
- ERC165Checker.supportsInterface(tokenAddress, type(IRegisterable).interfaceId)) {
92
- revert NotToken();
93
- }
94
-
95
- NftId registryNftId = _registry.getNftId(address(_registry));
96
-
97
- if(msg.sender != _registry.ownerOf(registryNftId)) {
98
- revert NotRegistryOwner();
99
- }
100
-
101
- IRegistry.ObjectInfo memory info = IRegistry.ObjectInfo(
102
- zeroNftId(), // any value
103
- registryNftId, // parent nft id
104
- TOKEN(),
105
- false, // isInterceptor
106
- tokenAddress,
107
- NFT_LOCK_ADDRESS,
108
- "" // any value
109
- );
110
-
111
- nftId = _registry.register(info);
112
- }
113
-
114
69
  /// @dev
115
70
  // msg.sender - ONLY registry owner
116
71
  // CAN NOT register itself