@etherisc/gif-next 0.0.2-ebbe63d → 0.0.2-ed4dd55

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. package/README.md +95 -1
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +4 -0
  3. package/artifacts/contracts/components/Component.sol/Component.json +179 -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 +179 -0
  8. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +192 -0
  10. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +4 -0
  11. package/artifacts/contracts/components/Pool.sol/Pool.json +195 -0
  12. package/artifacts/contracts/components/Product.sol/Product.dbg.json +4 -0
  13. package/artifacts/contracts/components/Product.sol/Product.json +213 -0
  14. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +4 -0
  15. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +128 -0
  16. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +4 -0
  17. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +42 -0
  18. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +4 -0
  19. package/artifacts/contracts/experiment/inheritance/B.sol/B.json +76 -0
  20. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +4 -0
  21. package/artifacts/contracts/experiment/inheritance/C.sol/C.json +89 -0
  22. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +4 -0
  23. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.json +128 -0
  24. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +4 -0
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.json +37 -0
  26. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +4 -0
  27. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.json +50 -0
  28. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +4 -0
  29. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.json +63 -0
  30. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +4 -0
  31. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +10 -0
  32. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +4 -0
  33. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +10 -0
  34. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +4 -0
  35. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +892 -0
  36. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +4 -0
  37. package/artifacts/contracts/instance/Instance.sol/Instance.json +1009 -0
  38. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +4 -0
  39. package/artifacts/contracts/instance/access/Access.sol/AccessModule.json +400 -0
  40. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +4 -0
  41. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.json +10 -0
  42. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +4 -0
  43. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +35 -0
  44. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +4 -0
  45. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +50 -0
  46. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +4 -0
  47. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.json +336 -0
  48. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
  49. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +327 -0
  50. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +4 -0
  51. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +105 -0
  52. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +4 -0
  53. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.json +10 -0
  54. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +4 -0
  55. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +179 -0
  56. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +4 -0
  57. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +245 -0
  58. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +4 -0
  59. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +94 -0
  60. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +4 -0
  61. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.json +24 -0
  62. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  63. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.json +10 -0
  64. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  65. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +231 -0
  66. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  67. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +231 -0
  68. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  69. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.json +10 -0
  70. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  71. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +149 -0
  72. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  73. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +162 -0
  74. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +4 -0
  75. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +75 -0
  76. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +4 -0
  77. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +114 -0
  78. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +4 -0
  79. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +75 -0
  80. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +4 -0
  81. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +125 -0
  82. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +4 -0
  83. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +534 -0
  84. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +4 -0
  85. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +452 -0
  86. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +4 -0
  87. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.json +24 -0
  88. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +4 -0
  89. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +166 -0
  90. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +4 -0
  91. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +279 -0
  92. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +4 -0
  93. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +49 -0
  94. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +4 -0
  95. package/artifacts/contracts/registry/Registry.sol/Registerable.json +166 -0
  96. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +4 -0
  97. package/artifacts/contracts/registry/Registry.sol/Registry.json +305 -0
  98. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +4 -0
  99. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +60 -0
  100. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +4 -0
  101. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +10 -0
  102. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +4 -0
  103. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +10 -0
  104. package/contracts/components/Component.sol +62 -0
  105. package/contracts/components/IPool.sol +9 -0
  106. package/contracts/components/IProduct.sol +11 -0
  107. package/contracts/components/Pool.sol +29 -0
  108. package/contracts/components/Product.sol +65 -0
  109. package/contracts/experiment/inheritance/A.sol +56 -0
  110. package/contracts/experiment/inheritance/B.sol +23 -0
  111. package/contracts/experiment/inheritance/C.sol +28 -0
  112. package/contracts/experiment/inheritance/IA.sol +18 -0
  113. package/contracts/experiment/inheritance/IB.sol +9 -0
  114. package/contracts/experiment/inheritance/IC.sol +11 -0
  115. package/contracts/experiment/types/TypeA.sol +42 -0
  116. package/contracts/experiment/types/TypeB.sol +24 -0
  117. package/contracts/instance/IInstance.sol +20 -0
  118. package/contracts/instance/Instance.sol +63 -0
  119. package/contracts/instance/access/Access.sol +218 -0
  120. package/contracts/instance/access/IAccess.sol +83 -0
  121. package/contracts/instance/component/ComponentModule.sol +259 -0
  122. package/contracts/instance/component/IComponent.sol +94 -0
  123. package/contracts/instance/policy/IPolicy.sol +66 -0
  124. package/contracts/instance/policy/PolicyModule.sol +106 -0
  125. package/contracts/instance/pool/IPoolModule.sol +40 -0
  126. package/contracts/instance/pool/PoolModule.sol +83 -0
  127. package/contracts/instance/product/IProductService.sol +45 -0
  128. package/contracts/instance/product/ProductService.sol +105 -0
  129. package/contracts/registry/ChainNft.sol +173 -0
  130. package/contracts/registry/IChainNft.sol +18 -0
  131. package/contracts/registry/IRegistry.sol +68 -0
  132. package/contracts/registry/Registry.sol +176 -0
  133. package/contracts/types/ChainId.sol +24 -0
  134. package/contracts/types/NftId.sol +25 -0
  135. package/package.json +7 -6
  136. package/artifacts/contracts/Dip.sol/DIP.dbg.json +0 -4
  137. package/artifacts/contracts/Dip.sol/DIP.json +0 -338
  138. package/artifacts/contracts/Lock.sol/Lock.dbg.json +0 -4
  139. package/artifacts/contracts/Lock.sol/Lock.json +0 -74
  140. package/contracts/Dip.sol +0 -26
  141. package/contracts/Lock.sol +0 -34
@@ -0,0 +1,56 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IA, ISharedA} from "./IA.sol";
5
+ import {B} from "./B.sol";
6
+ import {C} from "./C.sol";
7
+
8
+ /*
9
+
10
+ # dependency graph
11
+
12
+ B <...+
13
+ ^ |
14
+ | |
15
+ A --> C
16
+
17
+ - A is the main contract
18
+ - A provides functionality implemented by modules B and C
19
+ - B and C rely on functionality shared by A
20
+ - C accesses functionality of module B
21
+
22
+ # chisel session
23
+
24
+ import {A} from "./contracts/experiment/A.sol";
25
+ A a = new A();
26
+ uint(a.getA())
27
+ uint(a.getB()))
28
+ uint(a.getC())
29
+ uint(a.getAfromB())
30
+ uint(a.getAfromC())
31
+ uint(a.getBfromC())
32
+ a.setA(100);
33
+ a.setB(10);
34
+ a.setC(20);
35
+ */
36
+
37
+ contract AShared is ISharedA {
38
+
39
+ uint256 private _x;
40
+
41
+ constructor() {
42
+ _x = 42;
43
+ }
44
+
45
+ function getA() external view override returns(uint256) { return _x; }
46
+ function setA(uint256 newA) external override { _x = newA; }
47
+ }
48
+
49
+ contract A is
50
+ AShared,
51
+ B,
52
+ C,
53
+ IA
54
+ {
55
+
56
+ }
@@ -0,0 +1,23 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {ISharedA} from "./IA.sol";
5
+ import {IB} from "./IB.sol";
6
+
7
+ abstract contract B is ISharedA, IB {
8
+
9
+ // names of private variables can be re-used in inheritance
10
+ uint256 private _x;
11
+
12
+ constructor() {
13
+ _x = 1;
14
+ }
15
+
16
+ // access own state
17
+ function getB() external view override returns(uint256) { return _x; }
18
+ function setB(uint256 newB) external override { _x = newB; }
19
+
20
+ // access state from parent contract A
21
+ function getAfromB() external view override returns(uint256) { return this.getA(); }
22
+
23
+ }
@@ -0,0 +1,28 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {ISharedA} from "./IA.sol";
5
+ import {IB} from "./IB.sol";
6
+ import {IC} from "./IC.sol";
7
+
8
+ abstract contract C is ISharedA, IC {
9
+
10
+ uint256 private _x;
11
+
12
+ constructor() {
13
+ _x = 2;
14
+ }
15
+
16
+ // access own state
17
+ function getC() external view override returns(uint256) { return _x; }
18
+ function setC(uint256 newC) external override { _x = newC; }
19
+
20
+ // access state from parent contract A
21
+ function getAfromC() external view override returns(uint256) { return this.getA(); }
22
+
23
+ // access state from other module B
24
+ function getBfromC() external view override returns(uint256) {
25
+ IB b = IB(address(this));
26
+ return b.getB();
27
+ }
28
+ }
@@ -0,0 +1,18 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IB} from "./IB.sol";
5
+ import {IC} from "./IC.sol";
6
+
7
+ interface ISharedA {
8
+
9
+ function getA() external view returns(uint256);
10
+ function setA(uint256 newA) external;
11
+ }
12
+
13
+ interface IA is
14
+ ISharedA,
15
+ IB,
16
+ IC
17
+ {
18
+ }
@@ -0,0 +1,9 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ interface IB {
5
+
6
+ function getAfromB() external view returns(uint256);
7
+ function getB() external view returns(uint256);
8
+ function setB(uint256 newA) external;
9
+ }
@@ -0,0 +1,11 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ interface IC {
5
+
6
+ function getAfromC() external view returns(uint256);
7
+ function getBfromC() external view returns(uint256);
8
+
9
+ function getC() external view returns(uint256);
10
+ function setC(uint256 newA) external;
11
+ }
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ /*
5
+ # chisel session for user defined types
6
+
7
+ import {TypeA, toTypeA} from "./contracts/experiment/types/TypeA.sol";
8
+ TypeA a = toTypeA(1);
9
+ TypeA b = toTypeA(2);
10
+ uint(a.toInt())
11
+ uint(b.toInt())
12
+ a == b
13
+ a != b
14
+
15
+ import {TypeB, toTypeB} from "./contracts/experiment/types/TypeB.sol";
16
+ TypeB x = toTypeB(33);
17
+ uint(x.toInt())
18
+ a == x; // -> error
19
+ a.toInt() == x.toInt() // -> no error
20
+ */
21
+
22
+ // bytes5 allows for chain ids up to 13 digits
23
+ type TypeA is uint248;
24
+
25
+ // type bindings
26
+ using {
27
+ eqTypeA as ==,
28
+ neTypeA as !=,
29
+ TypeALib.toInt
30
+ } for TypeA global;
31
+
32
+ // general pure free functions
33
+ function toTypeA(uint256 typeA) pure returns(TypeA) { return TypeA.wrap(uint248(typeA)); }
34
+
35
+ // pure free functions for operators
36
+ function eqTypeA(TypeA a, TypeA b) pure returns(bool isSame) { return TypeA.unwrap(a) == TypeA.unwrap(b); }
37
+ function neTypeA(TypeA a, TypeA b) pure returns(bool isDifferent) { return TypeA.unwrap(a) != TypeA.unwrap(b); }
38
+
39
+ // library functions that operate on user defined type
40
+ library TypeALib {
41
+ function toInt(TypeA typeA) internal pure returns(uint256) { return uint256(TypeA.unwrap(typeA)); }
42
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ // bytes5 allows for chain ids up to 13 digits
5
+ type TypeB is uint248;
6
+
7
+ // type bindings
8
+ using {
9
+ eqTypeB as ==,
10
+ addTypeB as +,
11
+ TypeBLib.toInt
12
+ } for TypeB global;
13
+
14
+ // general pure free functions
15
+ function toTypeB(uint256 x) pure returns(TypeB) { return TypeB.wrap(uint248(x)); }
16
+
17
+ // pure free functions for operators
18
+ function eqTypeB(TypeB a, TypeB b) pure returns(bool isSame) { return TypeB.unwrap(a) == TypeB.unwrap(b); }
19
+ function addTypeB(TypeB a, TypeB b) pure returns(TypeB sum) { return TypeB.wrap(TypeB.unwrap(a) + TypeB.unwrap(b)); }
20
+
21
+ // library functions that operate on user defined type
22
+ library TypeBLib {
23
+ function toInt(TypeB b) internal pure returns(uint256) { return uint256(TypeB.unwrap(b)); }
24
+ }
@@ -0,0 +1,20 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IRegisterable} from "../registry/IRegistry.sol";
5
+ import {IAccessModule} from "./access/IAccess.sol";
6
+ import {IComponentModule} from "./component/IComponent.sol";
7
+ import {IProductModule} from "./product/IProductService.sol";
8
+ import {IPolicyModule} from "./policy/IPolicy.sol";
9
+ import {IPoolModule} from "./pool/IPoolModule.sol";
10
+
11
+
12
+ interface IInstance is
13
+ IRegisterable,
14
+ IAccessModule,
15
+ IPolicyModule,
16
+ IPoolModule,
17
+ IComponentModule,
18
+ IProductModule
19
+ { }
20
+
@@ -0,0 +1,63 @@
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 {ComponentModule} from "./component/ComponentModule.sol";
9
+ import {ProductModule} from "./product/ProductService.sol";
10
+ import {PolicyModule} from "./policy/PolicyModule.sol";
11
+ import {PoolModule} from "./pool/PoolModule.sol";
12
+
13
+ import {IInstance} from "./IInstance.sol";
14
+
15
+ contract Instance is
16
+ Registerable,
17
+ AccessModule,
18
+ ComponentModule,
19
+ PolicyModule,
20
+ PoolModule,
21
+ ProductModule,
22
+ IInstance
23
+ {
24
+
25
+ constructor(
26
+ address registry,
27
+ address componentOwnerService,
28
+ address productService
29
+ )
30
+ Registerable(registry)
31
+ AccessModule()
32
+ ComponentModule(componentOwnerService)
33
+ PolicyModule(productService)
34
+ ProductModule(productService)
35
+ PoolModule(productService)
36
+ { }
37
+
38
+ // from registerable
39
+ function register() external override returns(uint256 id) {
40
+ require(address(_registry) != address(0), "ERROR:PRD-001:REGISTRY_ZERO");
41
+ return _registry.register(address(this));
42
+ }
43
+
44
+ // from registerable
45
+ function getParentNftId() public view override returns(uint256) {
46
+ // TODO add self registry and exchange 0 for_registry.getNftId();
47
+ // define parent tree for all registerables
48
+ // eg 0 <- chain(mainnet) <- global registry <- chain registry <- instance <- component <- policy/bundle
49
+ return 0;
50
+ }
51
+
52
+ // from registerable
53
+ function getType() external view override returns(uint256 objectType) {
54
+ return _registry.INSTANCE();
55
+ }
56
+
57
+ // from registerable
58
+ function getData() external view override returns(bytes memory data) {
59
+ return bytes(abi.encode(0));
60
+ }
61
+
62
+
63
+ }
@@ -0,0 +1,218 @@
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
+
11
+ abstract contract AccessModule is
12
+ IAccessModule
13
+ {
14
+ string constant public PRODUCT_OWNER = "ProductOwner";
15
+ string constant public ORACLE_OWNER = "OracleOwner";
16
+ string constant public POOL_OWNER = "PoolOwner";
17
+
18
+ using EnumerableSet for EnumerableSet.AddressSet;
19
+
20
+ event LogAccessRoleGranted(bytes32 role, address member, bool isMember);
21
+
22
+ mapping(bytes32 role => RoleInfo info) private _info;
23
+ bytes32 [] private _roles;
24
+
25
+ bytes32 private immutable _productOwnerRole;
26
+ bytes32 private immutable _oracleOwnerRole;
27
+ bytes32 private immutable _poolOwnerRole;
28
+
29
+ mapping(bytes32 role => mapping(address member => bool isMember)) private _isRoleMember;
30
+ mapping(bytes32 role => EnumerableSet.AddressSet) private _roleMembers;
31
+
32
+ modifier onlyOwner() {
33
+ require(msg.sender == this.getOwner(), "ERROR:ACM-001:NOT_OWNER");
34
+ _;
35
+ }
36
+
37
+ constructor() {
38
+ _productOwnerRole = _createRole(PRODUCT_OWNER);
39
+ _oracleOwnerRole = _createRole(ORACLE_OWNER);
40
+ _poolOwnerRole = _createRole(POOL_OWNER);
41
+ }
42
+
43
+ function PRODUCT_OWNER_ROLE() public view override returns(bytes32 role) { return _productOwnerRole; }
44
+ function ORACLE_OWNER_ROLE() public view override returns(bytes32 role) { return _oracleOwnerRole; }
45
+ function POOL_OWNER_ROLE() public view override returns(bytes32 role) { return _poolOwnerRole; }
46
+
47
+
48
+ function createRole(string memory roleName)
49
+ external
50
+ override
51
+ onlyOwner
52
+ returns(bytes32 role)
53
+ {
54
+ return _createRole(roleName);
55
+ }
56
+
57
+ function _createRole(string memory roleName)
58
+ internal
59
+ returns(bytes32 role)
60
+ {
61
+ RoleInfo memory info = RoleInfo(
62
+ 0,
63
+ roleName,
64
+ true
65
+ );
66
+
67
+ role = _setRoleInfo(info);
68
+
69
+
70
+ }
71
+
72
+ // TODO move to module
73
+ function disableRole(bytes32 role)
74
+ external
75
+ override
76
+ onlyOwner
77
+ {
78
+ RoleInfo memory info = _info[role];
79
+ require(info.id == role, "ERROR:AOS-001:ROLE_DOES_NOT_EXIST");
80
+
81
+ info.isActive = false;
82
+ _setRoleInfo(info);
83
+
84
+
85
+ }
86
+
87
+ // TODO move to module
88
+ function enableRole(bytes32 role)
89
+ external
90
+ override
91
+ onlyOwner
92
+ {
93
+ RoleInfo memory info = _info[role];
94
+ require(info.id == role, "ERROR:AOS-002:ROLE_DOES_NOT_EXIST");
95
+
96
+ info.isActive = true;
97
+ _setRoleInfo(info);
98
+
99
+
100
+ }
101
+
102
+ function grantRole(bytes32 role, address member)
103
+ external
104
+ override
105
+ onlyOwner
106
+ {
107
+ require(_info[role].id == role, "ERROR:ACM-010:ROLE_NOT_EXISTING");
108
+ require(_info[role].isActive, "ERROR:ACM-011:ROLE_NOT_ACTIVE");
109
+
110
+ _isRoleMember[role][member] = true;
111
+ _roleMembers[role].add(member);
112
+
113
+ emit LogAccessRoleGranted(role, member, _isRoleMember[role][member]);
114
+ }
115
+
116
+
117
+ function revokeRole(bytes32 role, address member)
118
+ external
119
+ override
120
+ onlyOwner
121
+ {
122
+ require(_info[role].id == role, "ERROR:ACM-020:ROLE_NOT_EXISTING");
123
+
124
+ _isRoleMember[role][member] = false;
125
+ _roleMembers[role].remove(member);
126
+
127
+
128
+ }
129
+
130
+
131
+ function hasRole(bytes32 role, address member)
132
+ external
133
+ view
134
+ override
135
+ returns(bool)
136
+ {
137
+ return _isRoleMember[role][member];
138
+ }
139
+
140
+
141
+ function getRoleInfo(bytes32 role)
142
+ external
143
+ override
144
+ view
145
+ returns(RoleInfo memory info)
146
+ {
147
+ return _info[role];
148
+ }
149
+
150
+
151
+ function getRole(uint256 idx)
152
+ external
153
+ override
154
+ view
155
+ returns(bytes32 role)
156
+ {
157
+ return _roles[idx];
158
+ }
159
+
160
+
161
+ function getRoleCount()
162
+ external
163
+ override
164
+ view
165
+ returns(uint256 roles)
166
+ {
167
+ return _roles.length;
168
+ }
169
+
170
+ function getRoleMemberCount(bytes32 role)
171
+ public
172
+ override
173
+ view
174
+ returns(uint256 roleMembers)
175
+ {
176
+ return _roleMembers[role].length();
177
+ }
178
+
179
+ function getRoleMember(bytes32 role, uint256 idx)
180
+ public
181
+ override
182
+ view
183
+ returns(address roleMembers)
184
+ {
185
+ return _roleMembers[role].at(idx);
186
+ }
187
+
188
+ function getRoleForName(string memory roleName)
189
+ public
190
+ override
191
+ pure
192
+ returns(bytes32 role)
193
+ {
194
+ return keccak256(abi.encode(roleName));
195
+ }
196
+
197
+
198
+ function _setRoleInfo(RoleInfo memory info)
199
+ internal
200
+ returns(bytes32 role)
201
+ {
202
+ role = info.id;
203
+
204
+ if(role == bytes32(0)) {
205
+ role = getRoleForName(info.name);
206
+ // TODO check that this is a new role id
207
+
208
+ info.id = role;
209
+ _roles.push(role);
210
+
211
+
212
+ }
213
+
214
+ _info[role] = info;
215
+
216
+
217
+ }
218
+ }
@@ -0,0 +1,83 @@
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
+
8
+ struct RoleInfo {
9
+ bytes32 id;
10
+ string name;
11
+ bool isActive;
12
+ }
13
+ }
14
+
15
+ interface IAccessCheckRole {
16
+
17
+ function hasRole(bytes32 role, address member)
18
+ external
19
+ view
20
+ returns(bool);
21
+ }
22
+
23
+ interface IAccessComponentTypeRoles {
24
+ function PRODUCT_OWNER_ROLE() external view returns(bytes32 role);
25
+ function ORACLE_OWNER_ROLE() external view returns(bytes32 role);
26
+ function POOL_OWNER_ROLE() external view returns(bytes32 role);
27
+ }
28
+
29
+
30
+ interface IAccessModule is
31
+ IOwnable,
32
+ IRegistryLinked,
33
+ IAccess,
34
+ IAccessComponentTypeRoles,
35
+ IAccessCheckRole
36
+ {
37
+
38
+ function createRole(string memory roleName)
39
+ external
40
+ returns(bytes32 role);
41
+
42
+ function enableRole(bytes32 role)
43
+ external;
44
+
45
+ function disableRole(bytes32 role)
46
+ external;
47
+
48
+ function grantRole(bytes32 role, address member)
49
+ external;
50
+
51
+ function revokeRole(bytes32 role, address member)
52
+ external;
53
+
54
+ function getRole(uint256 idx)
55
+ external
56
+ view
57
+ returns(bytes32 role);
58
+
59
+ function getRoleInfo(bytes32 role)
60
+ external
61
+ view
62
+ returns(RoleInfo memory info);
63
+
64
+ function getRoleForName(string memory roleName)
65
+ external
66
+ pure
67
+ returns(bytes32 role);
68
+
69
+ function getRoleCount()
70
+ external
71
+ view
72
+ returns(uint256 roles);
73
+
74
+ function getRoleMemberCount(bytes32 role)
75
+ external
76
+ view
77
+ returns(uint256 roleMembers);
78
+
79
+ function getRoleMember(bytes32 role, uint256 idx)
80
+ external
81
+ view
82
+ returns(address roleMembers);
83
+ }