@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.
- package/README.md +95 -1
- package/artifacts/contracts/components/Component.sol/Component.dbg.json +4 -0
- package/artifacts/contracts/components/Component.sol/Component.json +179 -0
- package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +4 -0
- package/artifacts/contracts/components/Component.sol/InstanceLinked.json +35 -0
- package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +4 -0
- package/artifacts/contracts/components/IPool.sol/IPoolComponent.json +179 -0
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +4 -0
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +192 -0
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +4 -0
- package/artifacts/contracts/components/Pool.sol/Pool.json +195 -0
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +4 -0
- package/artifacts/contracts/components/Product.sol/Product.json +213 -0
- package/artifacts/contracts/experiment/A.sol/A.dbg.json +4 -0
- package/artifacts/contracts/experiment/A.sol/A.json +128 -0
- package/artifacts/contracts/experiment/A.sol/AShared.dbg.json +4 -0
- package/artifacts/contracts/experiment/A.sol/AShared.json +42 -0
- package/artifacts/contracts/experiment/B.sol/B.dbg.json +4 -0
- package/artifacts/contracts/experiment/B.sol/B.json +76 -0
- package/artifacts/contracts/experiment/C.sol/C.dbg.json +4 -0
- package/artifacts/contracts/experiment/C.sol/C.json +89 -0
- package/artifacts/contracts/experiment/IA.sol/IA.dbg.json +4 -0
- package/artifacts/contracts/experiment/IA.sol/IA.json +128 -0
- package/artifacts/contracts/experiment/IA.sol/ISharedA.dbg.json +4 -0
- package/artifacts/contracts/experiment/IA.sol/ISharedA.json +37 -0
- package/artifacts/contracts/experiment/IB.sol/IB.dbg.json +4 -0
- package/artifacts/contracts/experiment/IB.sol/IB.json +50 -0
- package/artifacts/contracts/experiment/IC.sol/IC.dbg.json +4 -0
- package/artifacts/contracts/experiment/IC.sol/IC.json +63 -0
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +4 -0
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +892 -0
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +4 -0
- package/artifacts/contracts/instance/Instance.sol/Instance.json +1009 -0
- package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +4 -0
- package/artifacts/contracts/instance/access/Access.sol/AccessModule.json +400 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +4 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccess.json +10 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +4 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +35 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +4 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +50 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +4 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.json +336 -0
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +327 -0
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +4 -0
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +105 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponent.json +10 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +179 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +245 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +94 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.json +24 -0
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.json +10 -0
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +231 -0
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +231 -0
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +4 -0
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.json +10 -0
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +149 -0
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +162 -0
- package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +4 -0
- package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +75 -0
- package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +4 -0
- package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +114 -0
- package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +4 -0
- package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +75 -0
- package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +4 -0
- package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +125 -0
- package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +4 -0
- package/artifacts/contracts/registry/IRegistry.sol/IOwnable.json +24 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +4 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +166 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +4 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +271 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +4 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +49 -0
- package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +4 -0
- package/artifacts/contracts/registry/Registry.sol/Registerable.json +166 -0
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +4 -0
- package/artifacts/contracts/registry/Registry.sol/Registry.json +289 -0
- package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +4 -0
- package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +60 -0
- package/contracts/components/Component.sol +62 -0
- package/contracts/components/IPool.sol +9 -0
- package/contracts/components/IProduct.sol +11 -0
- package/contracts/components/Pool.sol +29 -0
- package/contracts/components/Product.sol +65 -0
- package/contracts/experiment/A.sol +56 -0
- package/contracts/experiment/B.sol +23 -0
- package/contracts/experiment/C.sol +28 -0
- package/contracts/experiment/IA.sol +18 -0
- package/contracts/experiment/IB.sol +9 -0
- package/contracts/experiment/IC.sol +11 -0
- package/contracts/instance/IInstance.sol +20 -0
- package/contracts/instance/Instance.sol +63 -0
- package/contracts/instance/access/Access.sol +218 -0
- package/contracts/instance/access/IAccess.sol +83 -0
- package/contracts/instance/component/ComponentModule.sol +259 -0
- package/contracts/instance/component/IComponent.sol +94 -0
- package/contracts/instance/policy/IPolicy.sol +66 -0
- package/contracts/instance/policy/PolicyModule.sol +106 -0
- package/contracts/instance/pool/IPoolModule.sol +40 -0
- package/contracts/instance/pool/PoolModule.sol +83 -0
- package/contracts/instance/product/IProductService.sol +45 -0
- package/contracts/instance/product/ProductService.sol +105 -0
- package/contracts/registry/IRegistry.sol +66 -0
- package/contracts/registry/Registry.sol +197 -0
- package/package.json +7 -6
- package/artifacts/contracts/Dip.sol/DIP.dbg.json +0 -4
- package/artifacts/contracts/Dip.sol/DIP.json +0 -338
- package/artifacts/contracts/Lock.sol/Lock.dbg.json +0 -4
- package/artifacts/contracts/Lock.sol/Lock.json +0 -74
- package/contracts/Dip.sol +0 -26
- package/contracts/Lock.sol +0 -34
@@ -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,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
|
+
}
|