forked from DecentralizedClimateFoundation/DCIPs
105 lines
2.4 KiB
Solidity
105 lines
2.4 KiB
Solidity
|
// SPDX-License-Identifier: CC0-1.0
|
||
|
pragma solidity ^0.8.7;
|
||
|
import "../contracts/interfaces/IEIP6366Core.sol";
|
||
|
import "../contracts/interfaces/IEIP6366Error.sol";
|
||
|
|
||
|
/**
|
||
|
* @dev Centralized definition of all possible permissions and roles
|
||
|
*/
|
||
|
contract APermissioned {
|
||
|
IEIP6366Core private opt;
|
||
|
|
||
|
/**
|
||
|
* @dev No permission
|
||
|
*/
|
||
|
uint256 internal constant PERMISSION_NONE = 0;
|
||
|
|
||
|
/**
|
||
|
* @dev Blacklisted
|
||
|
*/
|
||
|
uint256 internal constant PERMISSION_DENIED = 2 ** 0;
|
||
|
|
||
|
/**
|
||
|
* @dev Permission to vote
|
||
|
*/
|
||
|
uint256 internal constant PERMISSION_VOTE = 2 ** 1;
|
||
|
|
||
|
/**
|
||
|
* @dev Permission to transfer permission token
|
||
|
*/
|
||
|
uint256 internal constant PERMISSION_TRANSFER = 2 ** 2;
|
||
|
|
||
|
/**
|
||
|
* @dev Permission to execute
|
||
|
*/
|
||
|
uint256 internal constant PERMISSION_EXECUTE = 2 ** 3;
|
||
|
|
||
|
/**
|
||
|
* @dev Permission to create
|
||
|
*/
|
||
|
uint256 internal constant PERMISSION_CREATE = 2 ** 4;
|
||
|
|
||
|
/**
|
||
|
* @dev Admin role
|
||
|
*/
|
||
|
uint256 internal constant ROLE_ADMIN =
|
||
|
PERMISSION_VOTE | PERMISSION_EXECUTE | PERMISSION_CREATE;
|
||
|
|
||
|
/**
|
||
|
* @dev Operator role
|
||
|
*/
|
||
|
uint256 internal constant ROLE_OPERATOR =
|
||
|
PERMISSION_EXECUTE | PERMISSION_VOTE;
|
||
|
|
||
|
/**
|
||
|
* @dev Allow the actor who has required permission
|
||
|
*/
|
||
|
modifier allowOwner(uint256 _required) {
|
||
|
if (!opt.permissionRequire(opt.permissionOf(msg.sender), _required)) {
|
||
|
revert IEIP6366Error.AccessDenied(
|
||
|
msg.sender,
|
||
|
msg.sender,
|
||
|
_required
|
||
|
);
|
||
|
}
|
||
|
_;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dev Deny blacklisted address
|
||
|
*/
|
||
|
modifier notBlacklisted() {
|
||
|
if (
|
||
|
opt.permissionRequire(
|
||
|
opt.permissionOf(msg.sender),
|
||
|
PERMISSION_DENIED
|
||
|
)
|
||
|
) {
|
||
|
revert IEIP6366Error.AccessDenied(
|
||
|
msg.sender,
|
||
|
msg.sender,
|
||
|
PERMISSION_DENIED
|
||
|
);
|
||
|
}
|
||
|
_;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dev Allow permission owner or delegatee
|
||
|
*/
|
||
|
modifier allow(address _owner, uint256 _required) {
|
||
|
// The actor should be the permission owner or delegatee
|
||
|
if (!opt.hasPermission(_owner, msg.sender, _required)) {
|
||
|
revert IEIP6366Error.AccessDenied(_owner, msg.sender, _required);
|
||
|
}
|
||
|
_;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dev Constructor
|
||
|
*/
|
||
|
constructor(address _opt) {
|
||
|
opt = IEIP6366Core(_opt);
|
||
|
}
|
||
|
}
|