mirror of
https://github.com/Instadapp/dsa-connectors.git
synced 2024-07-29 22:37:00 +00:00
feat: 🎸 separate out contracts and fit them for our usecase
This commit is contained in:
parent
e565ab7590
commit
169b411142
|
@ -41,50 +41,29 @@ import "@openzeppelin/contracts/utils/Context.sol";
|
|||
* grant and revoke this role. Extra precautions should be taken to secure
|
||||
* accounts that have been granted it.
|
||||
*/
|
||||
abstract contract AccessControl is Context {
|
||||
interface IndexInterface {
|
||||
function master() external view returns (address);
|
||||
}
|
||||
|
||||
contract InstaAccessControl is Context {
|
||||
using EnumerableSet for EnumerableSet.AddressSet;
|
||||
using Address for address;
|
||||
|
||||
struct RoleData {
|
||||
EnumerableSet.AddressSet members;
|
||||
bytes32 adminRole;
|
||||
}
|
||||
mapping(bytes32 => EnumerableSet.AddressSet) private _roles;
|
||||
|
||||
mapping(bytes32 => RoleData) private _roles;
|
||||
|
||||
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
|
||||
|
||||
/**
|
||||
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
|
||||
*
|
||||
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
|
||||
* {RoleAdminChanged} not being emitted signaling this.
|
||||
*
|
||||
* _Available since v3.1._
|
||||
*/
|
||||
event RoleAdminChanged(
|
||||
bytes32 indexed role,
|
||||
bytes32 indexed previousAdminRole,
|
||||
bytes32 indexed newAdminRole
|
||||
);
|
||||
IndexInterface public constant instaIndex =
|
||||
IndexInterface(0x2971AdFa57b20E5a416aE5a708A8655A9c74f723);
|
||||
|
||||
/**
|
||||
* @dev Emitted when `account` is granted `role`.
|
||||
*
|
||||
* `sender` is the account that originated the contract call, an admin role
|
||||
* bearer except when using {_setupRole}.
|
||||
*/
|
||||
event RoleGranted(
|
||||
bytes32 indexed role,
|
||||
address indexed account,
|
||||
address indexed sender
|
||||
);
|
||||
event RoleGranted(bytes32 indexed role, address indexed account);
|
||||
|
||||
/**
|
||||
* @dev Emitted when `account` is revoked `role`.
|
||||
*
|
||||
* `sender` is the account that originated the contract call:
|
||||
* - if using `revokeRole`, it is the admin role bearer
|
||||
* - if using `revokeRole`, it is the insta master
|
||||
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
|
||||
*/
|
||||
event RoleRevoked(
|
||||
|
@ -93,11 +72,19 @@ abstract contract AccessControl is Context {
|
|||
address indexed sender
|
||||
);
|
||||
|
||||
modifier onlyMaster {
|
||||
require(
|
||||
instaIndex.master() == _msgSender(),
|
||||
"AccessControl: sender must be master"
|
||||
);
|
||||
_;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Returns `true` if `account` has been granted `role`.
|
||||
*/
|
||||
function hasRole(bytes32 role, address account) public view returns (bool) {
|
||||
return _roles[role].members.contains(account);
|
||||
return _roles[role].contains(account);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -105,7 +92,7 @@ abstract contract AccessControl is Context {
|
|||
* together with {getRoleMember} to enumerate all bearers of a role.
|
||||
*/
|
||||
function getRoleMemberCount(bytes32 role) public view returns (uint256) {
|
||||
return _roles[role].members.length();
|
||||
return _roles[role].length();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -125,17 +112,7 @@ abstract contract AccessControl is Context {
|
|||
view
|
||||
returns (address)
|
||||
{
|
||||
return _roles[role].members.at(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Returns the admin role that controls `role`. See {grantRole} and
|
||||
* {revokeRole}.
|
||||
*
|
||||
* To change a role's admin, use {_setRoleAdmin}.
|
||||
*/
|
||||
function getRoleAdmin(bytes32 role) public view returns (bytes32) {
|
||||
return _roles[role].adminRole;
|
||||
return _roles[role].at(index);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -146,13 +123,13 @@ abstract contract AccessControl is Context {
|
|||
*
|
||||
* Requirements:
|
||||
*
|
||||
* - the caller must have `DEFAULT_ADMIN_ROLE` role.
|
||||
* - the caller must be the master.
|
||||
*/
|
||||
function grantRole(bytes32 role, address account) public virtual {
|
||||
require(
|
||||
hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
|
||||
"AccessControl: sender must be the master admin"
|
||||
);
|
||||
function grantRole(bytes32 role, address account)
|
||||
public
|
||||
virtual
|
||||
onlyMaster
|
||||
{
|
||||
_grantRole(role, account);
|
||||
}
|
||||
|
||||
|
@ -163,13 +140,13 @@ abstract contract AccessControl is Context {
|
|||
*
|
||||
* Requirements:
|
||||
*
|
||||
* - the caller must have `DEFAULT_ADMIN_ROLE` role.
|
||||
* - the caller must be the master.
|
||||
*/
|
||||
function revokeRole(bytes32 role, address account) public virtual {
|
||||
require(
|
||||
hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
|
||||
"AccessControl: sender must be the master admin"
|
||||
);
|
||||
function revokeRole(bytes32 role, address account)
|
||||
public
|
||||
virtual
|
||||
onlyMaster
|
||||
{
|
||||
_revokeRole(role, account);
|
||||
}
|
||||
|
||||
|
@ -216,24 +193,14 @@ abstract contract AccessControl is Context {
|
|||
_grantRole(role, account);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Sets `adminRole` as ``role``'s admin role.
|
||||
*
|
||||
* Emits a {RoleAdminChanged} event.
|
||||
*/
|
||||
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
|
||||
emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
|
||||
_roles[role].adminRole = adminRole;
|
||||
}
|
||||
|
||||
function _grantRole(bytes32 role, address account) private {
|
||||
if (_roles[role].members.add(account)) {
|
||||
emit RoleGranted(role, account, _msgSender());
|
||||
if (_roles[role].add(account)) {
|
||||
emit RoleGranted(role, account);
|
||||
}
|
||||
}
|
||||
|
||||
function _revokeRole(bytes32 role, address account) private {
|
||||
if (_roles[role].members.remove(account)) {
|
||||
if (_roles[role].remove(account)) {
|
||||
emit RoleRevoked(role, account, _msgSender());
|
||||
}
|
||||
}
|
|
@ -1,29 +1,14 @@
|
|||
pragma solidity ^0.7.0;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import {AccessControl} from "./AccessControl.sol";
|
||||
|
||||
interface IndexInterface {
|
||||
function master() external view returns (address);
|
||||
}
|
||||
|
||||
contract InstaMappings is AccessControl {
|
||||
IndexInterface public constant instaIndex =
|
||||
IndexInterface(0x2971AdFa57b20E5a416aE5a708A8655A9c74f723);
|
||||
|
||||
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
|
||||
|
||||
constructor() {
|
||||
_setupRole(DEFAULT_ADMIN_ROLE, instaIndex.master());
|
||||
_setRoleAdmin(DEFAULT_ADMIN_ROLE, ADMIN_ROLE);
|
||||
_setupRole(ADMIN_ROLE, address(this));
|
||||
}
|
||||
import {InstaAccessControl} from "./InstaAccessControl.sol";
|
||||
|
||||
contract InstaMappings is InstaAccessControl {
|
||||
function getMappingContractRole(address mappingContract)
|
||||
public
|
||||
pure
|
||||
returns (bytes32 role)
|
||||
{
|
||||
{
|
||||
bytes memory encoded = abi.encode(mappingContract);
|
||||
assembly {
|
||||
role := mload(add(encoded, 32))
|
||||
|
|
Loading…
Reference in New Issue
Block a user