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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) 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/A.sol/A.dbg.json +4 -0
  15. package/artifacts/contracts/experiment/A.sol/A.json +128 -0
  16. package/artifacts/contracts/experiment/A.sol/AShared.dbg.json +4 -0
  17. package/artifacts/contracts/experiment/A.sol/AShared.json +42 -0
  18. package/artifacts/contracts/experiment/B.sol/B.dbg.json +4 -0
  19. package/artifacts/contracts/experiment/B.sol/B.json +76 -0
  20. package/artifacts/contracts/experiment/C.sol/C.dbg.json +4 -0
  21. package/artifacts/contracts/experiment/C.sol/C.json +89 -0
  22. package/artifacts/contracts/experiment/IA.sol/IA.dbg.json +4 -0
  23. package/artifacts/contracts/experiment/IA.sol/IA.json +128 -0
  24. package/artifacts/contracts/experiment/IA.sol/ISharedA.dbg.json +4 -0
  25. package/artifacts/contracts/experiment/IA.sol/ISharedA.json +37 -0
  26. package/artifacts/contracts/experiment/IB.sol/IB.dbg.json +4 -0
  27. package/artifacts/contracts/experiment/IB.sol/IB.json +50 -0
  28. package/artifacts/contracts/experiment/IC.sol/IC.dbg.json +4 -0
  29. package/artifacts/contracts/experiment/IC.sol/IC.json +63 -0
  30. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +4 -0
  31. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +892 -0
  32. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +4 -0
  33. package/artifacts/contracts/instance/Instance.sol/Instance.json +1009 -0
  34. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +4 -0
  35. package/artifacts/contracts/instance/access/Access.sol/AccessModule.json +400 -0
  36. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +4 -0
  37. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.json +10 -0
  38. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +4 -0
  39. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +35 -0
  40. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +4 -0
  41. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +50 -0
  42. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +4 -0
  43. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.json +336 -0
  44. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
  45. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +327 -0
  46. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +4 -0
  47. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +105 -0
  48. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +4 -0
  49. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.json +10 -0
  50. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +4 -0
  51. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +179 -0
  52. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +4 -0
  53. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +245 -0
  54. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +4 -0
  55. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +94 -0
  56. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +4 -0
  57. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.json +24 -0
  58. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  59. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.json +10 -0
  60. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  61. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +231 -0
  62. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  63. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +231 -0
  64. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  65. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.json +10 -0
  66. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  67. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +149 -0
  68. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  69. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +162 -0
  70. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +4 -0
  71. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +75 -0
  72. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +4 -0
  73. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +114 -0
  74. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +4 -0
  75. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +75 -0
  76. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +4 -0
  77. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +125 -0
  78. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +4 -0
  79. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.json +24 -0
  80. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +4 -0
  81. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +166 -0
  82. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +4 -0
  83. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +271 -0
  84. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +4 -0
  85. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +49 -0
  86. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +4 -0
  87. package/artifacts/contracts/registry/Registry.sol/Registerable.json +166 -0
  88. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +4 -0
  89. package/artifacts/contracts/registry/Registry.sol/Registry.json +289 -0
  90. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +4 -0
  91. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +60 -0
  92. package/contracts/components/Component.sol +62 -0
  93. package/contracts/components/IPool.sol +9 -0
  94. package/contracts/components/IProduct.sol +11 -0
  95. package/contracts/components/Pool.sol +29 -0
  96. package/contracts/components/Product.sol +65 -0
  97. package/contracts/experiment/A.sol +56 -0
  98. package/contracts/experiment/B.sol +23 -0
  99. package/contracts/experiment/C.sol +28 -0
  100. package/contracts/experiment/IA.sol +18 -0
  101. package/contracts/experiment/IB.sol +9 -0
  102. package/contracts/experiment/IC.sol +11 -0
  103. package/contracts/instance/IInstance.sol +20 -0
  104. package/contracts/instance/Instance.sol +63 -0
  105. package/contracts/instance/access/Access.sol +218 -0
  106. package/contracts/instance/access/IAccess.sol +83 -0
  107. package/contracts/instance/component/ComponentModule.sol +259 -0
  108. package/contracts/instance/component/IComponent.sol +94 -0
  109. package/contracts/instance/policy/IPolicy.sol +66 -0
  110. package/contracts/instance/policy/PolicyModule.sol +106 -0
  111. package/contracts/instance/pool/IPoolModule.sol +40 -0
  112. package/contracts/instance/pool/PoolModule.sol +83 -0
  113. package/contracts/instance/product/IProductService.sol +45 -0
  114. package/contracts/instance/product/ProductService.sol +105 -0
  115. package/contracts/registry/IRegistry.sol +66 -0
  116. package/contracts/registry/Registry.sol +197 -0
  117. package/package.json +7 -6
  118. package/artifacts/contracts/Dip.sol/DIP.dbg.json +0 -4
  119. package/artifacts/contracts/Dip.sol/DIP.json +0 -338
  120. package/artifacts/contracts/Lock.sol/Lock.dbg.json +0 -4
  121. package/artifacts/contracts/Lock.sol/Lock.json +0 -74
  122. package/contracts/Dip.sol +0 -26
  123. package/contracts/Lock.sol +0 -34
@@ -0,0 +1,9 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IComponentContract} from "../instance/component/IComponent.sol";
5
+
6
+ // just marker interface for now
7
+ interface IPoolComponent is
8
+ IComponentContract
9
+ { }
@@ -0,0 +1,11 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IComponentContract} from "../instance/component/IComponent.sol";
5
+
6
+ interface IProductComponent is
7
+ IComponentContract
8
+ {
9
+
10
+ function getPoolNftId() external view returns(uint256 poolNftId);
11
+ }
@@ -0,0 +1,29 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IPoolComponent} from "./IPool.sol";
5
+ import {Component} from "./Component.sol";
6
+
7
+
8
+ contract Pool is
9
+ Component,
10
+ IPoolComponent
11
+ {
12
+
13
+ constructor(
14
+ address registry,
15
+ address instance
16
+ )
17
+ Component(registry, instance)
18
+ { }
19
+
20
+ // from registerable
21
+ function getType() public view override returns(uint256) {
22
+ return _registry.POOL();
23
+ }
24
+
25
+ // from registerable
26
+ function getData() external view override returns(bytes memory data) {
27
+ return bytes(abi.encode(getInstance().getNftId()));
28
+ }
29
+ }
@@ -0,0 +1,65 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IProductService} from "../instance/product/IProductService.sol";
5
+ import {Component} from "./Component.sol";
6
+ import {IProductComponent} from "./IProduct.sol";
7
+
8
+
9
+ contract Product is
10
+ Component,
11
+ IProductComponent
12
+ {
13
+ IProductService private _productService;
14
+ address private _pool;
15
+
16
+ constructor(
17
+ address registry,
18
+ address instance,
19
+ address pool
20
+ )
21
+ Component(registry, instance)
22
+ {
23
+ _productService = _instance.getProductService();
24
+ _pool = pool;
25
+ }
26
+
27
+ function _createApplication(
28
+ address applicationOwner,
29
+ uint256 sumInsuredAmount,
30
+ uint256 premiumAmount,
31
+ uint256 lifetime,
32
+ uint256 bundleNftId
33
+ )
34
+ internal
35
+ returns(uint256 nftId)
36
+ {
37
+ nftId = _productService.createApplication(
38
+ applicationOwner,
39
+ sumInsuredAmount,
40
+ premiumAmount,
41
+ lifetime,
42
+ bundleNftId
43
+ );
44
+ }
45
+
46
+ function _underwrite(uint256 nftId)
47
+ internal
48
+ {
49
+ _productService.underwrite(nftId);
50
+ }
51
+
52
+ function getPoolNftId() external view override returns(uint256 poolNftId) {
53
+ return _registry.getNftId(_pool);
54
+ }
55
+
56
+ // from registerable
57
+ function getType() public view override returns(uint256) {
58
+ return _registry.PRODUCT();
59
+ }
60
+
61
+ // from registerable
62
+ function getData() external view override returns(bytes memory data) {
63
+ return bytes(abi.encode(getInstance().getNftId()));
64
+ }
65
+ }
@@ -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 newA) external override { _x = newA; }
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 newA) external override { _x = newA; }
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,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
+ IComponentModule,
16
+ IProductModule,
17
+ IPolicyModule,
18
+ IPoolModule
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
+ }