@etherisc/gif-next 0.0.2-ebbe63d → 0.0.2-f619be3-760

Sign up to get free protection for your applications and to get access to all the features.
Files changed (208) hide show
  1. package/README.md +144 -1
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +4 -0
  3. package/artifacts/contracts/components/Component.sol/Component.json +205 -0
  4. package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +4 -0
  5. package/artifacts/contracts/components/Component.sol/InstanceLinked.json +35 -0
  6. package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +4 -0
  7. package/artifacts/contracts/components/IPool.sol/IPoolComponent.json +255 -0
  8. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +74 -0
  10. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +4 -0
  11. package/artifacts/contracts/components/Pool.sol/Pool.json +328 -0
  12. package/artifacts/contracts/components/Product.sol/Product.dbg.json +4 -0
  13. package/artifacts/contracts/components/Product.sol/Product.json +346 -0
  14. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +4 -0
  15. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +105 -0
  16. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +4 -0
  17. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +105 -0
  18. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +4 -0
  19. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +128 -0
  20. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +4 -0
  21. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +42 -0
  22. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +4 -0
  23. package/artifacts/contracts/experiment/inheritance/B.sol/B.json +76 -0
  24. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +4 -0
  25. package/artifacts/contracts/experiment/inheritance/C.sol/C.json +89 -0
  26. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +4 -0
  27. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.json +128 -0
  28. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +4 -0
  29. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.json +37 -0
  30. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +4 -0
  31. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.json +50 -0
  32. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +4 -0
  33. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.json +63 -0
  34. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +4 -0
  35. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +59 -0
  36. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +4 -0
  37. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.json +124 -0
  38. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +4 -0
  39. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.json +74 -0
  40. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +4 -0
  41. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +124 -0
  42. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +4 -0
  43. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +207 -0
  44. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +4 -0
  45. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +10 -0
  46. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +4 -0
  47. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +10 -0
  48. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +4 -0
  49. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1479 -0
  50. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +4 -0
  51. package/artifacts/contracts/instance/Instance.sol/Instance.json +1725 -0
  52. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +4 -0
  53. package/artifacts/contracts/instance/access/Access.sol/AccessModule.json +400 -0
  54. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +4 -0
  55. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.json +10 -0
  56. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +4 -0
  57. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +35 -0
  58. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +4 -0
  59. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +50 -0
  60. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +4 -0
  61. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.json +336 -0
  62. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
  63. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +299 -0
  64. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +4 -0
  65. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +202 -0
  66. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +4 -0
  67. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.json +10 -0
  68. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +4 -0
  69. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +205 -0
  70. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +4 -0
  71. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +217 -0
  72. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +4 -0
  73. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +141 -0
  74. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +4 -0
  75. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.json +24 -0
  76. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.dbg.json +4 -0
  77. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.json +134 -0
  78. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.dbg.json +4 -0
  79. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.json +182 -0
  80. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.dbg.json +4 -0
  81. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.json +221 -0
  82. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  83. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.json +10 -0
  84. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  85. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +254 -0
  86. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  87. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +254 -0
  88. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  89. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.json +10 -0
  90. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  91. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +129 -0
  92. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  93. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +155 -0
  94. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +4 -0
  95. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +75 -0
  96. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +4 -0
  97. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +127 -0
  98. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +4 -0
  99. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +75 -0
  100. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +4 -0
  101. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +196 -0
  102. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.dbg.json +4 -0
  103. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.json +10 -0
  104. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.dbg.json +4 -0
  105. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.json +490 -0
  106. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.dbg.json +4 -0
  107. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.json +45 -0
  108. package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +4 -0
  109. package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.json +490 -0
  110. package/artifacts/contracts/mock/Dip.sol/DIP.dbg.json +4 -0
  111. package/artifacts/contracts/mock/Dip.sol/DIP.json +338 -0
  112. package/artifacts/contracts/mock/TestPool.sol/TestPool.dbg.json +4 -0
  113. package/artifacts/contracts/mock/TestPool.sol/TestPool.json +294 -0
  114. package/artifacts/contracts/mock/TestProduct.sol/TestProduct.dbg.json +4 -0
  115. package/artifacts/contracts/mock/TestProduct.sol/TestProduct.json +384 -0
  116. package/artifacts/contracts/mock/Usdc.sol/USDC.dbg.json +4 -0
  117. package/artifacts/contracts/mock/Usdc.sol/USDC.json +338 -0
  118. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +4 -0
  119. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +534 -0
  120. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +4 -0
  121. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +452 -0
  122. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +4 -0
  123. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.json +24 -0
  124. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +4 -0
  125. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +166 -0
  126. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +4 -0
  127. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +188 -0
  128. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +4 -0
  129. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +49 -0
  130. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +4 -0
  131. package/artifacts/contracts/registry/Registry.sol/Registerable.json +166 -0
  132. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +4 -0
  133. package/artifacts/contracts/registry/Registry.sol/Registry.json +256 -0
  134. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +4 -0
  135. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +60 -0
  136. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +4 -0
  137. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +174 -0
  138. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +4 -0
  139. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +10 -0
  140. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +4 -0
  141. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +92 -0
  142. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +4 -0
  143. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +92 -0
  144. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +4 -0
  145. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +92 -0
  146. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +4 -0
  147. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +174 -0
  148. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +4 -0
  149. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +479 -0
  150. package/contracts/components/Component.sol +77 -0
  151. package/contracts/components/IPool.sol +15 -0
  152. package/contracts/components/IProduct.sol +16 -0
  153. package/contracts/components/Pool.sol +52 -0
  154. package/contracts/components/Product.sol +89 -0
  155. package/contracts/experiment/errors/Require.sol +38 -0
  156. package/contracts/experiment/errors/Revert.sol +44 -0
  157. package/contracts/experiment/inheritance/A.sol +53 -0
  158. package/contracts/experiment/inheritance/B.sol +28 -0
  159. package/contracts/experiment/inheritance/C.sol +34 -0
  160. package/contracts/experiment/inheritance/IA.sol +13 -0
  161. package/contracts/experiment/inheritance/IB.sol +10 -0
  162. package/contracts/experiment/inheritance/IC.sol +12 -0
  163. package/contracts/experiment/statemachine/Dummy.sol +27 -0
  164. package/contracts/experiment/statemachine/ISM.sol +25 -0
  165. package/contracts/experiment/statemachine/README.md +112 -0
  166. package/contracts/experiment/statemachine/SM.sol +57 -0
  167. package/contracts/experiment/statemachine/SimpleStateMachine.sol +31 -0
  168. package/contracts/experiment/types/TypeA.sol +47 -0
  169. package/contracts/experiment/types/TypeB.sol +29 -0
  170. package/contracts/instance/IInstance.sol +25 -0
  171. package/contracts/instance/Instance.sol +72 -0
  172. package/contracts/instance/access/Access.sol +165 -0
  173. package/contracts/instance/access/IAccess.sol +63 -0
  174. package/contracts/instance/component/ComponentModule.sol +274 -0
  175. package/contracts/instance/component/IComponent.sol +74 -0
  176. package/contracts/instance/lifecycle/ILifecycle.sol +47 -0
  177. package/contracts/instance/lifecycle/LifecycleModule.sol +88 -0
  178. package/contracts/instance/policy/IPolicy.sol +50 -0
  179. package/contracts/instance/policy/PolicyModule.sol +114 -0
  180. package/contracts/instance/pool/IPoolModule.sol +23 -0
  181. package/contracts/instance/pool/PoolModule.sol +81 -0
  182. package/contracts/instance/product/IProductService.sol +36 -0
  183. package/contracts/instance/product/ProductService.sol +136 -0
  184. package/contracts/instance/treasury/ITreasury.sol +91 -0
  185. package/contracts/instance/treasury/TokenHandler.sol +24 -0
  186. package/contracts/instance/treasury/TreasuryModule.sol +168 -0
  187. package/contracts/mock/TestPool.sol +16 -0
  188. package/contracts/mock/TestProduct.sol +39 -0
  189. package/contracts/mock/Usdc.sol +26 -0
  190. package/contracts/registry/ChainNft.sol +135 -0
  191. package/contracts/registry/IChainNft.sol +21 -0
  192. package/contracts/registry/IRegistry.sol +67 -0
  193. package/contracts/registry/Registry.sol +182 -0
  194. package/contracts/types/Blocknumber.sol +118 -0
  195. package/contracts/types/ChainId.sol +38 -0
  196. package/contracts/types/Fee.sol +32 -0
  197. package/contracts/types/NftId.sol +51 -0
  198. package/contracts/types/ObjectType.sol +107 -0
  199. package/contracts/types/StateId.sol +91 -0
  200. package/contracts/types/Timestamp.sol +102 -0
  201. package/contracts/types/UFixed.sol +210 -0
  202. package/package.json +19 -9
  203. package/artifacts/contracts/Dip.sol/DIP.dbg.json +0 -4
  204. package/artifacts/contracts/Dip.sol/DIP.json +0 -338
  205. package/artifacts/contracts/Lock.sol/Lock.dbg.json +0 -4
  206. package/artifacts/contracts/Lock.sol/Lock.json +0 -74
  207. package/contracts/Lock.sol +0 -34
  208. /package/contracts/{Dip.sol → mock/Dip.sol} +0 -0
@@ -0,0 +1,72 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {Registerable} from "../registry/Registry.sol";
5
+ import {IRegistry} from "../registry/IRegistry.sol";
6
+
7
+ import {IAccessModule, AccessModule} from "./access/Access.sol";
8
+ import {LifecycleModule} from "./lifecycle/LifecycleModule.sol";
9
+ import {ComponentModule} from "./component/ComponentModule.sol";
10
+ import {ProductModule} from "./product/ProductService.sol";
11
+ import {PolicyModule} from "./policy/PolicyModule.sol";
12
+ import {PoolModule} from "./pool/PoolModule.sol";
13
+ import {TreasuryModule} from "./treasury/TreasuryModule.sol";
14
+
15
+ import {IInstance} from "./IInstance.sol";
16
+ import {ObjectType, INSTANCE} from "../types/ObjectType.sol";
17
+ import {NftId, toNftId} from "../types/NftId.sol";
18
+
19
+ contract Instance is
20
+ Registerable,
21
+ AccessModule,
22
+ LifecycleModule,
23
+ ComponentModule,
24
+ PolicyModule,
25
+ PoolModule,
26
+ ProductModule,
27
+ TreasuryModule,
28
+ IInstance
29
+ {
30
+ constructor(
31
+ address registry,
32
+ address componentOwnerService,
33
+ address productService
34
+ )
35
+ Registerable(registry)
36
+ AccessModule()
37
+ ComponentModule(componentOwnerService)
38
+ PolicyModule(productService)
39
+ ProductModule(productService)
40
+ PoolModule(productService)
41
+ // solhint-disable-next-line no-empty-blocks
42
+ {
43
+
44
+ }
45
+
46
+ // from registerable
47
+ function register() external override returns (NftId nftId) {
48
+ require(
49
+ address(_registry) != address(0),
50
+ "ERROR:PRD-001:REGISTRY_ZERO"
51
+ );
52
+ return _registry.register(address(this));
53
+ }
54
+
55
+ // from registerable
56
+ function getParentNftId() public pure override returns (NftId) {
57
+ // TODO add self registry and exchange 0 for_registry.getNftId();
58
+ // define parent tree for all registerables
59
+ // eg 0 <- chain(mainnet) <- global registry <- chain registry <- instance <- component <- policy/bundle
60
+ return toNftId(0);
61
+ }
62
+
63
+ // from registerable
64
+ function getType() external pure override returns (ObjectType objectType) {
65
+ return INSTANCE();
66
+ }
67
+
68
+ // from registerable
69
+ function getData() external pure override returns (bytes memory data) {
70
+ return bytes(abi.encode(0));
71
+ }
72
+ }
@@ -0,0 +1,165 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ // role admin handling of oz doesn't fit nft ownability
5
+ // import {AccessControlEnumerable} from "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
6
+ import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
7
+
8
+ import {IAccessModule} from "./IAccess.sol";
9
+
10
+ abstract contract AccessModule is IAccessModule {
11
+ string public constant PRODUCT_OWNER = "ProductOwner";
12
+ string public constant ORACLE_OWNER = "OracleOwner";
13
+ string public constant POOL_OWNER = "PoolOwner";
14
+
15
+ using EnumerableSet for EnumerableSet.AddressSet;
16
+
17
+ event LogAccessRoleGranted(bytes32 role, address member, bool isMember);
18
+
19
+ mapping(bytes32 role => RoleInfo info) private _info;
20
+ bytes32[] private _roles;
21
+
22
+ bytes32 private immutable _productOwnerRole;
23
+ bytes32 private immutable _oracleOwnerRole;
24
+ bytes32 private immutable _poolOwnerRole;
25
+
26
+ mapping(bytes32 role => mapping(address member => bool isMember))
27
+ private _isRoleMember;
28
+ mapping(bytes32 role => EnumerableSet.AddressSet) private _roleMembers;
29
+
30
+ modifier onlyOwner() {
31
+ require(msg.sender == this.getOwner(), "ERROR:ACM-001:NOT_OWNER");
32
+ _;
33
+ }
34
+
35
+ constructor() {
36
+ _productOwnerRole = _createRole(PRODUCT_OWNER);
37
+ _oracleOwnerRole = _createRole(ORACLE_OWNER);
38
+ _poolOwnerRole = _createRole(POOL_OWNER);
39
+ }
40
+
41
+ function PRODUCT_OWNER_ROLE() public view override returns (bytes32 role) {
42
+ return _productOwnerRole;
43
+ }
44
+
45
+ function ORACLE_OWNER_ROLE() public view override returns (bytes32 role) {
46
+ return _oracleOwnerRole;
47
+ }
48
+
49
+ function POOL_OWNER_ROLE() public view override returns (bytes32 role) {
50
+ return _poolOwnerRole;
51
+ }
52
+
53
+ function createRole(
54
+ string memory roleName
55
+ ) external override onlyOwner returns (bytes32 role) {
56
+ return _createRole(roleName);
57
+ }
58
+
59
+ function _createRole(
60
+ string memory roleName
61
+ ) internal returns (bytes32 role) {
62
+ RoleInfo memory info = RoleInfo(0, roleName, true);
63
+
64
+ role = _setRoleInfo(info);
65
+ }
66
+
67
+ // TODO move to module
68
+ function disableRole(bytes32 role) external override onlyOwner {
69
+ RoleInfo memory info = _info[role];
70
+ require(info.id == role, "ERROR:AOS-001:ROLE_DOES_NOT_EXIST");
71
+
72
+ info.isActive = false;
73
+ _setRoleInfo(info);
74
+ }
75
+
76
+ // TODO move to module
77
+ function enableRole(bytes32 role) external override onlyOwner {
78
+ RoleInfo memory info = _info[role];
79
+ require(info.id == role, "ERROR:AOS-002:ROLE_DOES_NOT_EXIST");
80
+
81
+ info.isActive = true;
82
+ _setRoleInfo(info);
83
+ }
84
+
85
+ function grantRole(
86
+ bytes32 role,
87
+ address member
88
+ ) external override onlyOwner {
89
+ require(_info[role].id == role, "ERROR:ACM-010:ROLE_NOT_EXISTING");
90
+ require(_info[role].isActive, "ERROR:ACM-011:ROLE_NOT_ACTIVE");
91
+
92
+ _isRoleMember[role][member] = true;
93
+ _roleMembers[role].add(member);
94
+
95
+ emit LogAccessRoleGranted(role, member, _isRoleMember[role][member]);
96
+ }
97
+
98
+ function revokeRole(
99
+ bytes32 role,
100
+ address member
101
+ ) external override onlyOwner {
102
+ require(_info[role].id == role, "ERROR:ACM-020:ROLE_NOT_EXISTING");
103
+
104
+ _isRoleMember[role][member] = false;
105
+ _roleMembers[role].remove(member);
106
+ }
107
+
108
+ function hasRole(
109
+ bytes32 role,
110
+ address member
111
+ ) external view override returns (bool) {
112
+ return _isRoleMember[role][member];
113
+ }
114
+
115
+ function getRoleInfo(
116
+ bytes32 role
117
+ ) external view override returns (RoleInfo memory info) {
118
+ return _info[role];
119
+ }
120
+
121
+ function getRole(
122
+ uint256 idx
123
+ ) external view override returns (bytes32 role) {
124
+ return _roles[idx];
125
+ }
126
+
127
+ function getRoleCount() external view override returns (uint256 roles) {
128
+ return _roles.length;
129
+ }
130
+
131
+ function getRoleMemberCount(
132
+ bytes32 role
133
+ ) public view override returns (uint256 roleMembers) {
134
+ return _roleMembers[role].length();
135
+ }
136
+
137
+ function getRoleMember(
138
+ bytes32 role,
139
+ uint256 idx
140
+ ) public view override returns (address roleMembers) {
141
+ return _roleMembers[role].at(idx);
142
+ }
143
+
144
+ function getRoleForName(
145
+ string memory roleName
146
+ ) public pure override returns (bytes32 role) {
147
+ return keccak256(abi.encode(roleName));
148
+ }
149
+
150
+ function _setRoleInfo(
151
+ RoleInfo memory info
152
+ ) internal returns (bytes32 role) {
153
+ role = info.id;
154
+
155
+ if (role == bytes32(0)) {
156
+ role = getRoleForName(info.name);
157
+ // TODO check that this is a new role id
158
+
159
+ info.id = role;
160
+ _roles.push(role);
161
+ }
162
+
163
+ _info[role] = info;
164
+ }
165
+ }
@@ -0,0 +1,63 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IOwnable, IRegistryLinked} from "../../registry/IRegistry.sol";
5
+
6
+ interface IAccess {
7
+ struct RoleInfo {
8
+ bytes32 id;
9
+ string name;
10
+ bool isActive;
11
+ }
12
+ }
13
+
14
+ interface IAccessCheckRole {
15
+ function hasRole(bytes32 role, address member) external view returns (bool);
16
+ }
17
+
18
+ interface IAccessComponentTypeRoles {
19
+ function PRODUCT_OWNER_ROLE() external view returns (bytes32 role);
20
+
21
+ function ORACLE_OWNER_ROLE() external view returns (bytes32 role);
22
+
23
+ function POOL_OWNER_ROLE() external view returns (bytes32 role);
24
+ }
25
+
26
+ interface IAccessModule is
27
+ IOwnable,
28
+ IRegistryLinked,
29
+ IAccess,
30
+ IAccessComponentTypeRoles,
31
+ IAccessCheckRole
32
+ {
33
+ function createRole(string memory roleName) external returns (bytes32 role);
34
+
35
+ function enableRole(bytes32 role) external;
36
+
37
+ function disableRole(bytes32 role) external;
38
+
39
+ function grantRole(bytes32 role, address member) external;
40
+
41
+ function revokeRole(bytes32 role, address member) external;
42
+
43
+ function getRole(uint256 idx) external view returns (bytes32 role);
44
+
45
+ function getRoleInfo(
46
+ bytes32 role
47
+ ) external view returns (RoleInfo memory info);
48
+
49
+ function getRoleForName(
50
+ string memory roleName
51
+ ) external pure returns (bytes32 role);
52
+
53
+ function getRoleCount() external view returns (uint256 roles);
54
+
55
+ function getRoleMemberCount(
56
+ bytes32 role
57
+ ) external view returns (uint256 roleMembers);
58
+
59
+ function getRoleMember(
60
+ bytes32 role,
61
+ uint256 idx
62
+ ) external view returns (address roleMembers);
63
+ }
@@ -0,0 +1,274 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
5
+
6
+ import {RegistryLinked} from "../../registry/Registry.sol";
7
+ import {IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
8
+ import {IAccessComponentTypeRoles, IAccessCheckRole} from "../access/IAccess.sol";
9
+ import {IInstance} from "../IInstance.sol";
10
+
11
+ import {LifecycleModule} from "../lifecycle/LifecycleModule.sol";
12
+ import {ITreasuryModule} from "../treasury/ITreasury.sol";
13
+ import {TreasuryModule} from "../treasury/TreasuryModule.sol";
14
+ import {IComponent, IComponentContract, IComponentModule, IComponentOwnerService} from "./IComponent.sol";
15
+ import {IProductComponent} from "../../components/IProduct.sol";
16
+ import {IPoolComponent} from "../../components/IPool.sol";
17
+ import {IPoolModule} from "../pool/IPoolModule.sol";
18
+ import {ObjectType, PRODUCT, ORACLE, POOL} from "../../types/ObjectType.sol";
19
+ import {StateId, ACTIVE, PAUSED} from "../../types/StateId.sol";
20
+ import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
21
+ import {Fee, zeroFee} from "../../types/Fee.sol";
22
+
23
+ abstract contract ComponentModule is
24
+ IRegistryLinked,
25
+ IAccessComponentTypeRoles,
26
+ IAccessCheckRole,
27
+ IComponentModule
28
+ {
29
+ using NftIdLib for NftId;
30
+
31
+ mapping(NftId nftId => ComponentInfo info) private _componentInfo;
32
+ mapping(address cAddress => NftId nftId) private _nftIdByAddress;
33
+ NftId[] private _nftIds;
34
+
35
+ mapping(ObjectType cType => bytes32 role) private _componentOwnerRole;
36
+
37
+ // TODO maybe move this to Instance contract as internal variable?
38
+ LifecycleModule private _lifecycleModule;
39
+ TreasuryModule private _treasuryModule;
40
+ IPoolModule private _poolModule;
41
+ IComponentOwnerService private _componentOwnerService;
42
+
43
+ modifier onlyComponentOwnerService() {
44
+ require(
45
+ address(_componentOwnerService) == msg.sender,
46
+ "ERROR:CMP-001:NOT_OWNER_SERVICE"
47
+ );
48
+ _;
49
+ }
50
+
51
+ constructor(address componentOwnerService) {
52
+ address componentAddress = address(this);
53
+ _lifecycleModule = LifecycleModule(componentAddress);
54
+ _treasuryModule = TreasuryModule(componentAddress);
55
+ _poolModule = IPoolModule(componentAddress);
56
+ _componentOwnerService = ComponentOwnerService(componentOwnerService);
57
+ }
58
+
59
+ function registerComponent(
60
+ IComponentContract component
61
+ ) external override onlyComponentOwnerService returns (NftId nftId) {
62
+ ObjectType objectType = component.getType();
63
+ bytes32 typeRole = getRoleForType(objectType);
64
+ require(
65
+ this.hasRole(typeRole, component.getInitialOwner()),
66
+ "ERROR:CMP-004:TYPE_ROLE_MISSING"
67
+ );
68
+
69
+ nftId = this.getRegistry().register(address(component));
70
+ IERC20Metadata token = component.getToken();
71
+ address wallet = component.getWallet();
72
+
73
+ // create component info
74
+ _componentInfo[nftId] = ComponentInfo(
75
+ nftId,
76
+ _lifecycleModule.getInitialState(objectType),
77
+ token
78
+ );
79
+
80
+ // component type specific registration actions
81
+ if (component.getType() == PRODUCT()) {
82
+ IProductComponent product = IProductComponent(address(component));
83
+ NftId poolNftId = product.getPoolNftId();
84
+ require(poolNftId.gtz(), "ERROR:CMP-005:POOL_UNKNOWN");
85
+ // validate pool token and product token are same
86
+
87
+ // register with tresury
88
+ // implement and add validation
89
+ NftId distributorNftId = zeroNftId();
90
+ _treasuryModule.registerProduct(
91
+ nftId,
92
+ distributorNftId,
93
+ poolNftId,
94
+ token,
95
+ wallet,
96
+ product.getPolicyFee(),
97
+ product.getProcessingFee()
98
+ );
99
+ } else if (component.getType() == POOL()) {
100
+ IPoolComponent pool = IPoolComponent(address(component));
101
+
102
+ // register with pool
103
+ _poolModule.registerPool(nftId);
104
+
105
+ // register with tresury
106
+ _treasuryModule.registerPool(
107
+ nftId,
108
+ wallet,
109
+ pool.getStakingFee(),
110
+ pool.getPerformanceFee()
111
+ );
112
+ }
113
+ // TODO add distribution
114
+
115
+ _nftIdByAddress[address(component)] = nftId;
116
+ _nftIds.push(nftId);
117
+
118
+ // TODO add loggingx
119
+ }
120
+
121
+ function getComponentOwnerService()
122
+ external
123
+ view
124
+ override
125
+ returns (IComponentOwnerService)
126
+ {
127
+ return _componentOwnerService;
128
+ }
129
+
130
+ function setComponentInfo(
131
+ ComponentInfo memory info
132
+ ) external onlyComponentOwnerService returns (NftId nftId) {
133
+ nftId = info.nftId;
134
+ require(
135
+ nftId.gtz() && _componentInfo[nftId].nftId.eq(nftId),
136
+ "ERROR:CMP-006:COMPONENT_UNKNOWN"
137
+ );
138
+
139
+ // TODO decide if state changes should have explicit functions and not
140
+ // just a generic setXYZInfo and implicit state transitions
141
+ // when in doubt go for the explicit approach ...
142
+ ObjectType objectType = this.getRegistry().getInfo(nftId).objectType;
143
+ _lifecycleModule.checkAndLogTransition(
144
+ nftId,
145
+ objectType,
146
+ _componentInfo[nftId].state,
147
+ info.state
148
+ );
149
+ _componentInfo[nftId] = info;
150
+ }
151
+
152
+ function getComponentInfo(
153
+ NftId nftId
154
+ ) external view override returns (ComponentInfo memory) {
155
+ return _componentInfo[nftId];
156
+ }
157
+
158
+ function getComponentId(
159
+ address componentAddress
160
+ ) external view returns (NftId componentNftId) {
161
+ return _nftIdByAddress[componentAddress];
162
+ }
163
+
164
+ function getComponentId(
165
+ uint256 idx
166
+ ) external view override returns (NftId componentNftId) {
167
+ return _nftIds[idx];
168
+ }
169
+
170
+ function components()
171
+ external
172
+ view
173
+ override
174
+ returns (uint256 numberOfCompnents)
175
+ {
176
+ return _nftIds.length;
177
+ }
178
+
179
+ function getRoleForType(
180
+ ObjectType cType
181
+ ) public view returns (bytes32 role) {
182
+ if (cType == PRODUCT()) {
183
+ return this.PRODUCT_OWNER_ROLE();
184
+ }
185
+ if (cType == POOL()) {
186
+ return this.POOL_OWNER_ROLE();
187
+ }
188
+ if (cType == ORACLE()) {
189
+ return this.ORACLE_OWNER_ROLE();
190
+ }
191
+ }
192
+ }
193
+
194
+ // this is actually the component owner service
195
+ contract ComponentOwnerService is
196
+ RegistryLinked,
197
+ IComponent,
198
+ IComponentOwnerService
199
+ {
200
+ using NftIdLib for NftId;
201
+
202
+ modifier onlyComponentOwner(IComponentContract component) {
203
+ NftId nftId = _registry.getNftId(address(component));
204
+ require(nftId.gtz(), "ERROR:COS-001:COMPONENT_UNKNOWN");
205
+ require(
206
+ msg.sender == _registry.getOwner(nftId),
207
+ "ERROR:COS-002:NOT_OWNER"
208
+ );
209
+ _;
210
+ }
211
+
212
+ constructor(
213
+ address registry
214
+ ) RegistryLinked(registry) // solhint-disable-next-line no-empty-blocks
215
+ {
216
+
217
+ }
218
+
219
+ function register(
220
+ IComponentContract component
221
+ ) external override returns (NftId nftId) {
222
+ require(
223
+ msg.sender == component.getInitialOwner(),
224
+ "ERROR:COS-003:NOT_OWNER"
225
+ );
226
+
227
+ IInstance instance = component.getInstance();
228
+ nftId = instance.registerComponent(component);
229
+ }
230
+
231
+ function lock(
232
+ IComponentContract component
233
+ ) external override onlyComponentOwner(component) {
234
+ IInstance instance = component.getInstance();
235
+ ComponentInfo memory info = instance.getComponentInfo(
236
+ component.getNftId()
237
+ );
238
+ require(info.nftId.gtz(), "ERROR_COMPONENT_UNKNOWN");
239
+
240
+ info.state = PAUSED();
241
+ // setComponentInfo checks for valid state changes
242
+ instance.setComponentInfo(info);
243
+ }
244
+
245
+ function unlock(
246
+ IComponentContract component
247
+ ) external override onlyComponentOwner(component) {
248
+ IInstance instance = component.getInstance();
249
+ ComponentInfo memory info = instance.getComponentInfo(
250
+ component.getNftId()
251
+ );
252
+ require(info.nftId.gtz(), "ERROR_COMPONENT_UNKNOWN");
253
+
254
+ info.state = ACTIVE();
255
+ // setComponentInfo checks for valid state changes
256
+ instance.setComponentInfo(info);
257
+ }
258
+
259
+ function setProductFees(
260
+ IComponentContract product,
261
+ Fee memory policyFee,
262
+ Fee memory processingFee
263
+ ) external override onlyComponentOwner(product) {
264
+ require(product.getType() == PRODUCT(), "ERROR_NOT_PRODUCT");
265
+
266
+ address instanceAddress = address(product.getInstance());
267
+ ITreasuryModule treasuryModule = ITreasuryModule(instanceAddress);
268
+ treasuryModule.setProductFees(
269
+ product.getNftId(),
270
+ policyFee,
271
+ processingFee
272
+ );
273
+ }
274
+ }
@@ -0,0 +1,74 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
5
+
6
+ import {IOwnable, IRegistryLinked, IRegisterable} from "../../registry/IRegistry.sol";
7
+ import {IInstance} from "../IInstance.sol";
8
+ import {StateId} from "../../types/StateId.sol";
9
+ import {NftId} from "../../types/NftId.sol";
10
+ import {Fee} from "../../types/Fee.sol";
11
+ import {UFixed} from "../../types/UFixed.sol";
12
+
13
+ interface IComponent {
14
+ // component dynamic info (static info kept in registry)
15
+ struct ComponentInfo {
16
+ NftId nftId;
17
+ StateId state;
18
+ IERC20Metadata token;
19
+ }
20
+ }
21
+
22
+ interface IInstanceLinked {
23
+ // function setInstance(address instance) external;
24
+ function getInstance() external view returns (IInstance instance);
25
+ }
26
+
27
+ interface IComponentContract is IRegisterable, IInstanceLinked, IComponent {
28
+ function getToken() external view returns (IERC20Metadata token);
29
+
30
+ function getWallet() external view returns (address walletAddress);
31
+ }
32
+
33
+ interface IComponentOwnerService is IRegistryLinked {
34
+ function register(
35
+ IComponentContract component
36
+ ) external returns (NftId nftId);
37
+
38
+ function lock(IComponentContract component) external;
39
+
40
+ function unlock(IComponentContract component) external;
41
+
42
+ function setProductFees(
43
+ IComponentContract product,
44
+ Fee memory policyFee,
45
+ Fee memory processingFee
46
+ ) external;
47
+ }
48
+
49
+ interface IComponentModule is IOwnable, IRegistryLinked, IComponent {
50
+ function registerComponent(
51
+ IComponentContract component
52
+ ) external returns (NftId nftId);
53
+
54
+ function setComponentInfo(
55
+ ComponentInfo memory info
56
+ ) external returns (NftId componentNftId);
57
+
58
+ function getComponentInfo(
59
+ NftId nftId
60
+ ) external view returns (ComponentInfo memory info);
61
+
62
+ function getComponentId(
63
+ address componentAddress
64
+ ) external view returns (NftId nftId);
65
+
66
+ function getComponentId(uint256 idx) external view returns (NftId nftId);
67
+
68
+ function components() external view returns (uint256 numberOfCompnents);
69
+
70
+ function getComponentOwnerService()
71
+ external
72
+ view
73
+ returns (IComponentOwnerService);
74
+ }
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {ObjectType} from "../../types/ObjectType.sol";
5
+ import {StateId, toStateId, zeroStateId} from "../../types/StateId.sol";
6
+ import {NftId} from "../../types/NftId.sol";
7
+
8
+ interface ILifecycle {
9
+ event LogComponentStateChanged(
10
+ NftId nftId,
11
+ ObjectType objectType,
12
+ StateId fromStateId,
13
+ StateId toStateId
14
+ );
15
+ event LogBundleStateChanged(
16
+ NftId nftId,
17
+ StateId fromStateId,
18
+ StateId toStateId
19
+ );
20
+ event LogPolicyStateChanged(
21
+ NftId nftId,
22
+ StateId fromStateId,
23
+ StateId toStateId
24
+ );
25
+ // event LogClaimStateChanged(NftId nftId, ClaimId claimId, StateId fromStateId, StateId toStateId);
26
+ // event LogPayoutStateChanged(NftId nftId, ClaimId claimId, PayoutId payoutId, StateId fromStateId, StateId toStateId);
27
+
28
+ error ErrorNoLifecycle(NftId nftId, ObjectType objectType);
29
+ error ErrorInvalidStateTransition(
30
+ NftId nftId,
31
+ ObjectType objectType,
32
+ StateId fromStateId,
33
+ StateId toStateId
34
+ );
35
+ }
36
+
37
+ interface ILifecycleModule is ILifecycle {
38
+ function getInitialState(
39
+ ObjectType objectType
40
+ ) external view returns (StateId);
41
+
42
+ function isValidTransition(
43
+ ObjectType objectType,
44
+ StateId fromId,
45
+ StateId toId
46
+ ) external view returns (bool);
47
+ }