@etherisc/gif-next 0.0.2-bca36d7-613 → 0.0.2-bdd64e2-180

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 (185) hide show
  1. package/README.md +4 -0
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +13 -0
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +75 -15
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +13 -0
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +52 -0
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  12. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  13. package/artifacts/contracts/components/Pool.sol/Pool.json +112 -13
  14. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  15. package/artifacts/contracts/components/Product.sol/Product.json +39 -18
  16. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
  18. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +2 -2
  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/SM.sol/SM.json +2 -2
  35. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  36. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
  37. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  38. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  39. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +1 -1
  40. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.json +0 -13
  41. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +1 -1
  42. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
  43. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  44. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +403 -1
  45. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  46. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  47. package/artifacts/contracts/instance/Instance.sol/Instance.json +124 -101
  48. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  49. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +34 -47
  50. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  51. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +143 -38
  52. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  53. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +169 -33
  54. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  55. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +71 -11
  56. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  57. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +5 -0
  58. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  59. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  60. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  61. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  62. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +2 -2
  63. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  64. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
  65. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  66. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  67. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  68. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  69. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  70. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  71. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  72. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  73. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +18 -18
  74. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  75. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +657 -0
  76. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
  77. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +436 -0
  78. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  79. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  80. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  82. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  83. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +796 -0
  84. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
  85. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +448 -0
  86. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  87. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  88. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +309 -0
  89. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  90. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +0 -19
  91. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  92. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  93. package/artifacts/contracts/registry/Registry.sol/Registry.json +258 -24
  94. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  95. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +20 -44
  96. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  97. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +49 -28
  98. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
  99. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +410 -0
  100. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  101. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  102. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  103. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  104. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  105. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  106. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  107. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  108. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  109. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  110. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  111. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  112. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +4 -4
  113. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
  114. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  115. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  116. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  117. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
  118. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  119. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  120. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  121. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
  122. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  123. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  124. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  125. package/artifacts/contracts/test/TestService.sol/TestService.json +11 -11
  126. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  127. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  128. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  129. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  130. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +2 -2
  131. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  132. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  133. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  134. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  135. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  136. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  137. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  138. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  139. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  140. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  141. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  142. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  143. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  144. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  145. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  146. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  147. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  148. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  149. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  150. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  151. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  152. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  153. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  154. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +22 -3
  155. package/contracts/components/BaseComponent.sol +8 -3
  156. package/contracts/components/Distribution.sol +13 -13
  157. package/contracts/components/IBaseComponent.sol +1 -0
  158. package/contracts/components/IDistributionComponent.sol +3 -0
  159. package/contracts/components/Pool.sol +15 -27
  160. package/contracts/components/Product.sol +1 -1
  161. package/contracts/instance/AccessManagedSimple.sol +1 -8
  162. package/contracts/instance/IInstance.sol +15 -4
  163. package/contracts/instance/Instance.sol +16 -15
  164. package/contracts/instance/InstanceAccessManager.sol +1 -1
  165. package/contracts/instance/InstanceReader.sol +17 -1
  166. package/contracts/instance/InstanceService.sol +51 -7
  167. package/contracts/instance/base/ComponentServiceBase.sol +2 -10
  168. package/contracts/instance/module/IBundle.sol +1 -0
  169. package/contracts/instance/module/ISetup.sol +1 -0
  170. package/contracts/instance/service/DistributionService.sol +105 -0
  171. package/contracts/instance/service/DistributionServiceManager.sol +53 -0
  172. package/contracts/instance/service/PoolService.sol +211 -0
  173. package/contracts/instance/service/PoolServiceManager.sol +53 -0
  174. package/contracts/registry/IRegistry.sol +38 -2
  175. package/contracts/registry/IRegistryService.sol +0 -2
  176. package/contracts/registry/Registry.sol +94 -28
  177. package/contracts/registry/RegistryService.sol +2 -47
  178. package/contracts/registry/RegistryServiceManager.sol +21 -5
  179. package/contracts/registry/TokenRegistry.sol +111 -0
  180. package/contracts/shared/ERC165.sol +6 -2
  181. package/contracts/shared/Registerable.sol +1 -0
  182. package/contracts/types/RoleId.sol +7 -0
  183. package/contracts/types/StateId.sol +4 -0
  184. package/contracts/types/Version.sol +4 -1
  185. package/package.json +1 -1
@@ -11,13 +11,15 @@ import {IInstance} from "../instance/IInstance.sol";
11
11
  import {IInstance} from "../instance/IInstance.sol";
12
12
  import {IComponentOwnerService} from "../instance/service/IComponentOwnerService.sol";
13
13
  import {IBaseComponent} from "./IBaseComponent.sol";
14
- import {NftId} from "../types/NftId.sol";
14
+ import {NftId, zeroNftId, NftIdLib} from "../types/NftId.sol";
15
15
  import {ObjectType} from "../types/ObjectType.sol";
16
16
 
17
17
  abstract contract BaseComponent is
18
18
  Registerable,
19
19
  IBaseComponent
20
20
  {
21
+ using NftIdLib for NftId;
22
+
21
23
  IComponentOwnerService internal _componentOwnerService;
22
24
 
23
25
  address internal _deployer;
@@ -29,7 +31,6 @@ abstract contract BaseComponent is
29
31
  constructor(
30
32
  address registry,
31
33
  NftId instanceNftId,
32
- NftId productNftId,
33
34
  address token,
34
35
  ObjectType componentType,
35
36
  bool isInterceptor,
@@ -49,7 +50,6 @@ abstract contract BaseComponent is
49
50
  _componentOwnerService = _instance.getComponentOwnerService();
50
51
  _wallet = address(this);
51
52
  _token = IERC20Metadata(token);
52
- _productNftId = productNftId;
53
53
 
54
54
  _registerInterface(type(IBaseComponent).interfaceId);
55
55
  }
@@ -80,6 +80,11 @@ abstract contract BaseComponent is
80
80
  return _instance;
81
81
  }
82
82
 
83
+ function setProductNftId(NftId productNftId) public override onlyOwner {
84
+ require(_productNftId.eq(zeroNftId()), "product nft id already set");
85
+ _productNftId = productNftId;
86
+ }
87
+
83
88
  function getProductNftId() public view override returns (NftId productNftId) {
84
89
  return _productNftId;
85
90
  }
@@ -38,20 +38,19 @@ contract Distribution is
38
38
  constructor(
39
39
  address registry,
40
40
  NftId instanceNftId,
41
- NftId productNftId,
42
41
  // TODO refactor into tokenNftId
43
42
  address token,
44
43
  bool verifying,
45
44
  Fee memory distributionFee,
46
45
  address initialOwner
47
46
  )
48
- BaseComponent(registry, instanceNftId, productNftId, token, DISTRIBUTION(), true, initialOwner)
47
+ BaseComponent(registry, instanceNftId, token, DISTRIBUTION(), true, initialOwner)
49
48
  {
50
49
  _isVerifying = verifying;
51
50
  _initialDistributionFee = distributionFee;
52
51
 
52
+ _distributionService = _instance.getDistributionService();
53
53
  // TODO: reactivate when services are available again
54
- // _distributionService = _instance.getDistributionService();
55
54
  // _productService = _instance.getProductService();
56
55
 
57
56
  _registerInterface(type(IDistributionComponent).interfaceId);
@@ -122,20 +121,21 @@ contract Distribution is
122
121
  return false;
123
122
  }
124
123
 
125
- function getSetupInfo() public view returns (ISetup.DistributionSetupInfo memory setupInfo) {
126
- if (getNftId().eq(zeroNftId())) {
127
- return ISetup.DistributionSetupInfo(
128
- _productNftId,
129
- TokenHandler(address(0)),
130
- _initialDistributionFee,
131
- _isVerifying,
132
- address(0)
133
- );
134
- }
124
+ function getInitialSetupInfo() public view returns (ISetup.DistributionSetupInfo memory setupInfo) {
125
+ return ISetup.DistributionSetupInfo(
126
+ _productNftId,
127
+ TokenHandler(address(_token)),
128
+ _initialDistributionFee,
129
+ _isVerifying,
130
+ address(this)
131
+ );
132
+ }
135
133
 
134
+ function getSetupInfo() public view returns (ISetup.DistributionSetupInfo memory setupInfo) {
136
135
  InstanceReader reader = _instance.getInstanceReader();
137
136
  return reader.getDistributionSetupInfo(getNftId());
138
137
  }
138
+
139
139
 
140
140
  /// @dev returns true iff the component needs to be called when selling/renewing policis
141
141
  function isVerifying() external view returns (bool verifying) {
@@ -19,6 +19,7 @@ interface IBaseComponent is IRegisterable {
19
19
 
20
20
  function getInstance() external view returns (IInstance instance);
21
21
 
22
+ function setProductNftId(NftId productNftId) external;
22
23
  function getProductNftId() external view returns (NftId productNftId);
23
24
 
24
25
  }
@@ -4,9 +4,12 @@ pragma solidity ^0.8.19;
4
4
  import {Fee} from "../types/Fee.sol";
5
5
  import {ReferralId} from "../types/Referral.sol";
6
6
  import {NftId} from "../types/NftId.sol";
7
+ import {ISetup} from "../instance/module/ISetup.sol";
7
8
 
8
9
  interface IDistributionComponent {
9
10
 
11
+ function getInitialSetupInfo() external view returns (ISetup.DistributionSetupInfo memory setupInfo);
12
+
10
13
  function setFees(
11
14
  Fee memory distributionFee
12
15
  ) external;
@@ -55,7 +55,6 @@ contract Pool is BaseComponent, IPoolComponent {
55
55
  constructor(
56
56
  address registry,
57
57
  NftId instanceNftId,
58
- NftId productNftId,
59
58
  // TODO refactor into tokenNftId
60
59
  address token,
61
60
  bool isInterceptor,
@@ -66,7 +65,7 @@ contract Pool is BaseComponent, IPoolComponent {
66
65
  Fee memory performanceFee,
67
66
  address initialOwner
68
67
  )
69
- BaseComponent(registry, instanceNftId, productNftId, token, POOL(), isInterceptor, initialOwner)
68
+ BaseComponent(registry, instanceNftId, token, POOL(), isInterceptor, initialOwner)
70
69
  {
71
70
  _isVerifying = verifying;
72
71
  // TODO add validation
@@ -75,8 +74,8 @@ contract Pool is BaseComponent, IPoolComponent {
75
74
  _initialStakingFee = stakingFee;
76
75
  _initialPerformanceFee = performanceFee;
77
76
 
77
+ _poolService = _instance.getPoolService();
78
78
  // TODO: reactivate when services are available again
79
- // _poolService = _instance.getPoolService();
80
79
  // _productService = _instance.getProductService();
81
80
 
82
81
  _registerInterface(type(IPoolComponent).interfaceId);
@@ -169,21 +168,19 @@ contract Pool is BaseComponent, IPoolComponent {
169
168
  _poolService.setBundleFee(bundleNftId, fee);
170
169
  }
171
170
 
171
+ function getInitialSetupInfo() public view returns (ISetup.PoolSetupInfo memory setupInfo) {
172
+ return ISetup.PoolSetupInfo(
173
+ _productNftId,
174
+ TokenHandler(address(_token)),
175
+ _collateralizationLevel,
176
+ _initialPoolFee,
177
+ _initialStakingFee,
178
+ _initialPerformanceFee,
179
+ _isVerifying,
180
+ _wallet
181
+ );
182
+ }
172
183
  function getSetupInfo() public view returns (ISetup.PoolSetupInfo memory setupInfo) {
173
- // TODO fix this
174
- if (getNftId().eq(zeroNftId())) {
175
- return ISetup.PoolSetupInfo(
176
- _productNftId,
177
- TokenHandler(address(0)),
178
- _collateralizationLevel,
179
- _initialPoolFee,
180
- _initialStakingFee,
181
- _initialPerformanceFee,
182
- _isVerifying,
183
- _wallet
184
- );
185
- }
186
-
187
184
  InstanceReader reader = _instance.getInstanceReader();
188
185
  return reader.getPoolSetupInfo(getNftId());
189
186
  }
@@ -206,16 +203,7 @@ contract Pool is BaseComponent, IPoolComponent {
206
203
  return (
207
204
  info,
208
205
  abi.encode(
209
- ISetup.PoolSetupInfo(
210
- getProductNftId(),
211
- TokenHandler(address(0)),
212
- _collateralizationLevel,
213
- _initialPoolFee,
214
- _initialStakingFee,
215
- _initialPerformanceFee,
216
- _isVerifying,
217
- _wallet
218
- )
206
+ getInitialSetupInfo()
219
207
  )
220
208
  );
221
209
  }
@@ -49,7 +49,7 @@ contract Product is BaseComponent, IProductComponent {
49
49
  Fee memory productFee,
50
50
  Fee memory processingFee,
51
51
  address initialOwner
52
- ) BaseComponent(registry, instanceNftid, zeroNftId(), token, PRODUCT(), isInterceptor, initialOwner) {
52
+ ) BaseComponent(registry, instanceNftid, token, PRODUCT(), isInterceptor, initialOwner) {
53
53
  // TODO add validation
54
54
  // TODO: reactivate when services are available again
55
55
  // _productService = _instance.getProductService();
@@ -24,14 +24,7 @@ abstract contract AccessManagedSimple is Context, IAccessManaged {
24
24
 
25
25
  bool private _consumingSchedule;
26
26
 
27
- /**
28
- * @dev Initializes the contract connected to an initial authority.
29
- */
30
- constructor(address initialAuthority) {
31
- initialize(initialAuthority);
32
- }
33
-
34
- function initialize(address initialAuthority) public {
27
+ function initializeAccessManagedSimple(address initialAuthority) internal {
35
28
  require(!_initialized, "AccessManaged: already initialized");
36
29
  _setAuthority(initialAuthority);
37
30
  _initialized = true;
@@ -9,20 +9,31 @@ import {IComponentOwnerService} from "./service/IComponentOwnerService.sol";
9
9
  import {IDistributionService} from "./service/IDistributionService.sol";
10
10
  import {IPoolService} from "./service/IPoolService.sol";
11
11
  import {IProductService} from "./service/IProductService.sol";
12
+ import {IBundle} from "./module/IBundle.sol";
12
13
  import {ISetup} from "./module/ISetup.sol";
13
14
  import {NftId} from "../types/NftId.sol";
15
+ import {StateId} from "../types/StateId.sol";
14
16
 
15
17
  interface IInstance is IERC165 {
16
18
 
17
19
  function getComponentOwnerService() external view returns (IComponentOwnerService);
18
- // TODO: renable these when we have the services
19
- // function getDistributionService() external view returns (IDistributionService);
20
+ function getDistributionService() external view returns (IDistributionService);
20
21
  // function getProductService() external view returns (IProductService);
21
- // function getPoolService() external view returns (IPoolService);
22
+ function getPoolService() external view returns (IPoolService);
22
23
 
23
24
  function createProductSetup(NftId productNftId, ISetup.ProductSetupInfo memory setup) external;
25
+
24
26
  function createDistributionSetup(NftId distributionNftId, ISetup.DistributionSetupInfo memory setup) external;
25
- function createPoolSetup(NftId distributionNftId, ISetup.PoolSetupInfo memory setup) external;
27
+ function updateDistributionSetup(NftId distributionNftId, ISetup.DistributionSetupInfo memory setup, StateId newState) external;
28
+ function updateDistributionSetupState(NftId distributionNftId, StateId newState) external;
29
+
30
+ function createPoolSetup(NftId poolNftId, ISetup.PoolSetupInfo memory setup) external;
31
+ function updatePoolSetup(NftId poolNftId, ISetup.PoolSetupInfo memory setup, StateId newState) external;
32
+ function updatePoolSetupState(NftId poolNftId, StateId newState) external;
33
+
34
+ function createBundle(NftId bundleNftId, IBundle.BundleInfo memory bundle) external;
35
+ function updateBundle(NftId bundleNftId, IBundle.BundleInfo memory bundle, StateId newState) external;
36
+ function updateBundleState(NftId bundleNftId, StateId newState) external;
26
37
 
27
38
  function getInstanceReader() external view returns (InstanceReader);
28
39
  }
@@ -25,6 +25,8 @@ import {ERC165} from "../shared/ERC165.sol";
25
25
  import {Registerable} from "../shared/Registerable.sol";
26
26
  import {ComponentOwnerService} from "./service/ComponentOwnerService.sol";
27
27
  import {IComponentOwnerService} from "./service/IComponentOwnerService.sol";
28
+ import {IDistributionService} from "./service/IDistributionService.sol";
29
+ import {IPoolService} from "./service/IPoolService.sol";
28
30
  import {VersionPart} from "../types/Version.sol";
29
31
 
30
32
  contract Instance is
@@ -53,7 +55,6 @@ contract Instance is
53
55
  InstanceReader internal _instanceReader;
54
56
 
55
57
  constructor(address accessManagerAddress, address registryAddress, NftId registryNftId)
56
- AccessManagedSimple(accessManagerAddress)
57
58
  {
58
59
  initialize(accessManagerAddress, registryAddress, registryNftId, msg.sender);
59
60
  }
@@ -61,6 +62,8 @@ contract Instance is
61
62
  function initialize(address accessManagerAddress, address registryAddress, NftId registryNftId, address initialOwner) public {
62
63
  require(!_initialized, "Contract instance has already been initialized");
63
64
 
65
+ initializeAccessManagedSimple(accessManagerAddress);
66
+
64
67
  _accessManager = AccessManagerSimple(accessManagerAddress);
65
68
  _createRole(RoleIdLib.toRoleId(ADMIN_ROLE), "AdminRole", false, false);
66
69
  _createRole(RoleIdLib.toRoleId(PUBLIC_ROLE), "PublicRole", false, false);
@@ -218,16 +221,16 @@ contract Instance is
218
221
  }
219
222
 
220
223
  //--- PoolSetup ------------------------------------------------------//
221
- function createPoolSetup(NftId distributionNftId, ISetup.PoolSetupInfo memory setup) external restricted() {
222
- create(_toNftKey32(distributionNftId, POOL()), abi.encode(setup));
224
+ function createPoolSetup(NftId poolNftId, ISetup.PoolSetupInfo memory setup) external restricted() {
225
+ create(_toNftKey32(poolNftId, POOL()), abi.encode(setup));
223
226
  }
224
227
 
225
- function updatePoolSetup(NftId distributionNftId, ISetup.PoolSetupInfo memory setup, StateId newState) external restricted() {
226
- update(_toNftKey32(distributionNftId, POOL()), abi.encode(setup), newState);
228
+ function updatePoolSetup(NftId poolNftId, ISetup.PoolSetupInfo memory setup, StateId newState) external restricted() {
229
+ update(_toNftKey32(poolNftId, POOL()), abi.encode(setup), newState);
227
230
  }
228
231
 
229
- function updatePoolSetupState(NftId distributionNftId, StateId newState) external restricted() {
230
- updateState(_toNftKey32(distributionNftId, POOL()), newState);
232
+ function updatePoolSetupState(NftId poolNftId, StateId newState) external restricted() {
233
+ updateState(_toNftKey32(poolNftId, POOL()), newState);
231
234
  }
232
235
 
233
236
  //--- DistributorType ---------------------------------------------------//
@@ -416,20 +419,18 @@ contract Instance is
416
419
  return ComponentOwnerService(_registry.getServiceAddress("ComponentOwnerService", VersionPart.wrap(3)));
417
420
  }
418
421
 
419
- // TODO reactivate when services are available
420
- // function getDistributionService() external view returns (IDistributionService) {
421
- // return DistributionService(_registry.getServiceAddress("DistributionService", VersionPart.wrap(3)));
422
- // }
422
+ function getDistributionService() external view returns (IDistributionService) {
423
+ return IDistributionService(_registry.getServiceAddress("DistributionService", VersionPart.wrap(3)));
424
+ }
423
425
 
424
426
  // TODO reactivate when services are available
425
427
  // function getProductService() external view returns (IProductService) {
426
428
  // return ProductService(_registry.getServiceAddress("ProductService", VersionPart.wrap(3)));
427
429
  // }
428
430
 
429
- // TODO reactivate when services are available
430
- // function getPoolService() external view returns (IPoolService) {
431
- // return PoolService(_registry.getServiceAddress("PoolService", VersionPart.wrap(3)));
432
- // }
431
+ function getPoolService() external view returns (IPoolService) {
432
+ return IPoolService(_registry.getServiceAddress("PoolService", VersionPart.wrap(3)));
433
+ }
433
434
 
434
435
  function setInstanceReader(InstanceReader instanceReader) external restricted() {
435
436
  require(address(_instanceReader) == address(0), "InstanceReader is set");
@@ -79,9 +79,9 @@ contract InstanceAccessManager is
79
79
  AccessManagerSimple internal _accessManager;
80
80
 
81
81
  constructor(address accessManager)
82
- AccessManagedSimple(accessManager)
83
82
  {
84
83
  _accessManager = AccessManagerSimple(accessManager);
84
+ initializeAccessManagedSimple(accessManager);
85
85
 
86
86
  _createRole(RoleIdLib.toRoleId(_accessManager.ADMIN_ROLE()), ADMIN_ROLE_NAME, false, false);
87
87
  _createRole(RoleIdLib.toRoleId(_accessManager.PUBLIC_ROLE()), PUBLIC_ROLE_NAME, false, false);
@@ -7,7 +7,7 @@ import {DistributorType} from "../types/DistributorType.sol";
7
7
  import {Fee, FeeLib} from "../types/Fee.sol";
8
8
  import {Key32} from "../types/Key32.sol";
9
9
  import {NftId} from "../types/NftId.sol";
10
- import {ObjectType, DISTRIBUTOR, DISTRIBUTION, INSTANCE, PRODUCT, POLICY, POOL, TREASURY} from "../types/ObjectType.sol";
10
+ import {ObjectType, DISTRIBUTOR, DISTRIBUTION, INSTANCE, PRODUCT, POLICY, POOL, TREASURY, BUNDLE} from "../types/ObjectType.sol";
11
11
  import {ReferralId, ReferralStatus, ReferralLib, REFERRAL_OK, REFERRAL_ERROR_UNKNOWN, REFERRAL_ERROR_EXPIRED, REFERRAL_ERROR_EXHAUSTED} from "../types/Referral.sol";
12
12
  import {Registerable} from "../shared/Registerable.sol";
13
13
  import {RiskId} from "../types/RiskId.sol";
@@ -15,6 +15,7 @@ import {UFixed, MathLib, UFixedLib} from "../types/UFixed.sol";
15
15
  import {Version} from "../types/Version.sol";
16
16
 
17
17
  import {IRegistry} from "../registry/IRegistry.sol";
18
+ import {IBundle} from "../instance/module/IBundle.sol";
18
19
  import {IDistribution} from "../instance/module/IDistribution.sol";
19
20
  import {IInstance} from "./IInstance.sol";
20
21
  import {IKeyValueStore} from "../instance/base/IKeyValueStore.sol";
@@ -114,6 +115,17 @@ contract InstanceReader {
114
115
  return abi.decode(data, (ITreasury.TreasuryInfo));
115
116
  }
116
117
  }
118
+
119
+ function getBundleInfo(NftId bundleNftId)
120
+ public
121
+ view
122
+ returns (IBundle.BundleInfo memory info)
123
+ {
124
+ bytes memory data = _store.getData(toBundleKey(bundleNftId));
125
+ if (data.length > 0) {
126
+ return abi.decode(data, (IBundle.BundleInfo));
127
+ }
128
+ }
117
129
 
118
130
  function getDistributorTypeInfo(DistributorType distributorType)
119
131
  public
@@ -259,6 +271,10 @@ contract InstanceReader {
259
271
  return distributionNftId.toKey32(DISTRIBUTION());
260
272
  }
261
273
 
274
+ function toBundleKey(NftId poolNftId) public pure returns (Key32) {
275
+ return poolNftId.toKey32(BUNDLE());
276
+ }
277
+
262
278
  function toPoolKey(NftId poolNftId) public pure returns (Key32) {
263
279
  return poolNftId.toKey32(POOL());
264
280
  }
@@ -15,7 +15,9 @@ import {Service} from "../../contracts/shared/Service.sol";
15
15
  import {IService} from "../shared/IService.sol";
16
16
  import {ContractDeployerLib} from "../shared/ContractDeployerLib.sol";
17
17
  import {NftId, NftIdLib, zeroNftId} from "../../contracts/types/NftId.sol";
18
+ import {RoleId} from "../types/RoleId.sol";
18
19
  import {VersionLib} from "../types/Version.sol";
20
+ import {ADMIN_ROLE, INSTANCE_SERVICE_ROLE, DISTRIBUTION_SERVICE_ROLE, POOL_SERVICE_ROLE} from "../types/RoleId.sol";
19
21
 
20
22
  contract InstanceService is Service, IInstanceService {
21
23
 
@@ -37,13 +39,17 @@ contract InstanceService is Service, IInstanceService {
37
39
  InstanceReader clonedInstanceReader
38
40
  )
39
41
  {
42
+ address instanceOwner = msg.sender;
40
43
  Registry registry = Registry(_registryAddress);
41
44
  NftId registryNftId = registry.getNftId(_registryAddress);
42
45
  address registryServiceAddress = registry.getServiceAddress("RegistryService", VersionLib.toVersion(3, 0, 0).toMajorPart());
43
46
  RegistryService registryService = RegistryService(registryServiceAddress);
44
47
 
48
+ // initially set the authority of the access managar to this (being the instance service).
49
+ // This will allow the instance service to bootstrap the authorizations of the instance
50
+ // and then transfer the ownership of the access manager to the instance owner once everything is setup
45
51
  clonedAccessManager = AccessManagerSimple(Clones.clone(_accessManagerMaster));
46
- clonedAccessManager.initialize(msg.sender);
52
+ clonedAccessManager.initialize(address(this));
47
53
 
48
54
  clonedInstance = Instance(Clones.clone(_instanceMaster));
49
55
  clonedInstance.initialize(address(clonedAccessManager), _registryAddress, registryNftId, msg.sender);
@@ -53,9 +59,43 @@ contract InstanceService is Service, IInstanceService {
53
59
  clonedInstanceReader = InstanceReader(Clones.clone(address(_instanceReaderMaster)));
54
60
  clonedInstanceReader.initialize(_registryAddress, instanceNftId);
55
61
 
62
+ _grantInitialAuthorizations(clonedAccessManager, clonedInstance);
63
+
64
+ clonedInstance.setInstanceReader(clonedInstanceReader);
65
+
66
+ // to complete setup switch instance ownership to the instance owner
67
+ // TODO: use a role less powerful than admin, maybe INSTANCE_ADMIN (does not exist yet)
68
+ clonedAccessManager.grantRole(ADMIN_ROLE().toInt(), instanceOwner, 0);
69
+ clonedAccessManager.revokeRole(ADMIN_ROLE().toInt(), address(this));
70
+
56
71
  emit LogInstanceCloned(address(clonedAccessManager), address(clonedInstance), address(clonedInstanceReader), instanceNftId);
57
72
  }
58
73
 
74
+ function _grantInitialAuthorizations(AccessManagerSimple clonedAccessManager, Instance clonedInstance) internal {
75
+ address distributionServiceAddress = _registry.getServiceAddress("DistributionService", VersionLib.toVersion(3, 0, 0).toMajorPart());
76
+ clonedAccessManager.grantRole(DISTRIBUTION_SERVICE_ROLE().toInt(), distributionServiceAddress, 0);
77
+ bytes4[] memory instanceDistributionServiceSelectors = new bytes4[](2);
78
+ instanceDistributionServiceSelectors[0] = clonedInstance.createDistributionSetup.selector;
79
+ instanceDistributionServiceSelectors[1] = clonedInstance.updateDistributionSetup.selector;
80
+ clonedAccessManager.setTargetFunctionRole(
81
+ address(clonedInstance),
82
+ instanceDistributionServiceSelectors,
83
+ DISTRIBUTION_SERVICE_ROLE().toInt());
84
+
85
+ address poolServiceAddress = _registry.getServiceAddress("PoolService", VersionLib.toVersion(3, 0, 0).toMajorPart());
86
+ clonedAccessManager.grantRole(POOL_SERVICE_ROLE().toInt(), address(poolServiceAddress), 0);
87
+ bytes4[] memory instancePoolServiceSelectors = new bytes4[](4);
88
+ instancePoolServiceSelectors[0] = clonedInstance.createPoolSetup.selector;
89
+ instancePoolServiceSelectors[1] = clonedInstance.updatePoolSetup.selector;
90
+ instancePoolServiceSelectors[2] = clonedInstance.createBundle.selector;
91
+ instancePoolServiceSelectors[3] = clonedInstance.updateBundle.selector;
92
+ clonedAccessManager.setTargetFunctionRole(
93
+ address(clonedInstance),
94
+ instancePoolServiceSelectors,
95
+ POOL_SERVICE_ROLE().toInt());
96
+
97
+ }
98
+
59
99
  function setAccessManagerMaster(address accessManagerMaster) external {
60
100
  require(
61
101
  _accessManagerMaster == address(0),
@@ -121,18 +161,22 @@ contract InstanceService is Service, IInstanceService {
121
161
  address initialOwner = address(0);
122
162
  (_registryAddress, initialOwner) = abi.decode(data, (address, address));
123
163
 
124
- // // TODO register instance in registry
125
- IRegistry registry = IRegistry(_registryAddress);
126
- NftId registryNftId = registry.getNftId(_registryAddress);
127
-
128
164
  _initializeService(_registryAddress, initialOwner);
129
165
 
130
166
  _registerInterface(type(IService).interfaceId);
131
167
  _registerInterface(type(IInstanceService).interfaceId);
132
168
  }
133
169
 
134
- function getInstance() external view returns (Instance) {
135
- return Instance(address(this));
170
+ function hasRole(address account, RoleId role, NftId instanceNftId) external view returns (bool) {
171
+ IRegistry.ObjectInfo memory instanceObjectInfo = getRegistry().getObjectInfo(instanceNftId);
172
+ address instanceAddress = instanceObjectInfo.objectAddress;
173
+ Instance instance = Instance(instanceAddress);
174
+ AccessManagerSimple accessManager = AccessManagerSimple(instance.authority());
175
+ (bool isMember, uint32 executionDelay) = accessManager.hasRole(role.toInt(), account);
176
+ if (executionDelay > 0) {
177
+ return false;
178
+ }
179
+ return isMember;
136
180
  }
137
181
  }
138
182
 
@@ -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_ROLE");
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
+ }