false
true
0

Contract Address Details

0xCB13Ca54A9744aFA2586E6232b94a58cF9B5E25C

Contract Name
AccessManager
Creator
0x000006–a90503 at 0x95896c–a0e766
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
539 Transactions
Transfers
0 Transfers
Gas Used
52,273,236
Last Balance Update
25905124
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
AccessManager




Optimization enabled
false
Compiler version
v0.8.26+commit.8a97fa7a




EVM Version
paris




Verified at
2024-09-24T13:20:14.185474Z

contracts/Classes/AccessManager.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "./Access.sol"; // Assuming AuthLib includes all the functionality as discussed

/**
 * @title AccessManager
 * @dev A contract for managing role-based access control. Allows accounts to be granted or revoked roles, and checks for required ranks.
 * This contract uses the AuthLib library for role management.
 */
contract AccessManager {
    using AuthLib for AuthLib.RoleData;

    // State variable for storing role data
    AuthLib.RoleData private roleData;

    // Event declarations for logging changes in role assignments
    event RoleGranted(address indexed account, AuthLib.Rank role);
    event RoleRevoked(address indexed account);
    modifier onlyGladiator() {
        require(checkRole(msg.sender,  AuthLib.Rank.GLADIATOR), "Access Restricted");
        _;
    }

    modifier onlySenator() {
        require(checkRole(msg.sender,  AuthLib.Rank.SENATOR), "Access Restricted");
        _;
    }

    modifier onlyConsul() {
        require(checkRole(msg.sender,  AuthLib.Rank.CONSUL),"Access Restricted");
        _;
    }

    modifier onlyLegatus() {
        require(checkRole(msg.sender,  AuthLib.Rank.LEGATUS),"Access Restricted");
        _;
    }
                    
    modifier onlyPreatormaximus() {
        require(checkRole(msg.sender,  AuthLib.Rank.PREATORMAXIMUS),"Access Restricted");
        _;
    }
       uint256 private locked = 1;

    modifier nonReentrant() virtual {
        require(locked == 1, "REENTRANCY");

        locked = 2;

        _;

        locked = 1;
    }
    /**
     * @dev Constructor that grants the contract deployer the highest role (PREATORMAXIMUS).
     */
    constructor() {
        // Grant the deployer the highest role initially
        roleData.grantRole(msg.sender, AuthLib.Rank.PREATORMAXIMUS);
    }

    /**
     * @notice Grants a specific role to an account.
     * @dev Only accounts with the CONSUL or higher role can grant roles.
     * @param account The address of the account to grant the role to.
     * @param rank The rank (role) to assign to the account.
     */
    function grantRole(address account, AuthLib.Rank rank) public {
        // Check if the caller has sufficient privileges (CONSUL or higher)
        require(
            roleData.getHighestRankForAccount(msg.sender) >= AuthLib.Rank.CONSUL,
            "Insufficient privileges to grant roles."
        );
        // Grant the role to the specified account
        roleData.grantRole(account, rank);
        // Emit an event for logging
        emit RoleGranted(account, rank);
    }

    /**
     * @notice Revokes a role from a specific account.
     * @dev Only accounts with the CONSUL or higher role can revoke roles.
     * @param account The address of the account to revoke the role from.
     */
    function revokeRole(address account) public {
        // Check if the caller has sufficient privileges (CONSUL or higher)
        require(
            roleData.getHighestRankForAccount(msg.sender) >= AuthLib.Rank.CONSUL,
            "Insufficient privileges to revoke roles."
        );
        // Revoke the role from the specified account
        roleData.revokeRole(account);
        // Emit an event for logging
        emit RoleRevoked(account);
    }

    /**
     * @notice Checks if an account has a specific role or higher.
     * @param account The address of the account to check.
     * @param rank The required rank to check against.
     * @return True if the account holds the required rank or higher, false otherwise.
     */
    function checkRole(address account, AuthLib.Rank rank) public view returns (bool) {
        // Check if the account has the specified role or higher
        return roleData.getHighestRankForAccount(account) >= rank;
    }

    /**
     * @notice Returns the highest rank (role) assigned to an account.
     * @param account The address of the account to query.
     * @return The rank held by the account.
     */
    function getAccountRank(address account) public view returns (AuthLib.Rank) {
        // Retrieve the highest rank assigned to the account
        return roleData.getHighestRankForAccount(account);
    }
}
        

contracts/Classes/Access.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

/**
 * @title AuthLib
 * @dev A library for managing role-based access control (RBAC) using ranks. Allows accounts to be granted or revoked roles, and checks for required ranks.
 */
library AuthLib {
    // Custom error for unauthorized account access
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    // Enum representing different ranks in the system
    enum Rank {
        PRINCEPS,
        GLADIATOR,
        LEGATUS,
        SENATOR,
        CONSUL,       
        PREATORMAXIMUS
    }

    // Registry structure to store keys and their corresponding ranks
    struct Registry {
        uint256[] keys;  // Array to hold registered keys
        mapping(uint256 => uint256) indexOf;  // Maps key to its index in the keys array
        mapping(uint256 => bool) inserted;    // Tracks whether a key is inserted
        mapping(uint256 => Rank) keyRoles;    // Maps key to its assigned rank
    }

    // RoleData structure for managing roles of accounts
    struct RoleData {
        Registry registry;                  // Holds the registry for keys and roles
        mapping(address => Rank) ranks;     // Maps accounts to their assigned ranks
    }

    // Events
    event RoleGranted(address indexed account, Rank role);
    event RoleRevoked(address indexed account, Rank role);

    /**
     * @dev Registers a key with a specified rank in the registry.
     * @param _registry The registry where the key will be stored.
     * @param key The key to register (typically the address cast to uint256).
     * @param rank The rank to assign to the key.
     */
    function Register(Registry storage _registry, uint256 key, Rank rank) public {
        if (!_registry.inserted[key]) {
            _registry.inserted[key] = true;
            _registry.indexOf[key] = _registry.keys.length;
            _registry.keys.push(key);
            _registry.keyRoles[key] = rank;  // Store the rank with the key
        } else {
            // Update the rank if already registered
            _registry.keyRoles[key] = rank;
        }
    }

    /**
     * @dev Removes a key from the registry.
     * @param _registry The registry from which the key will be removed.
     * @param key The key to remove.
     */
    function Remove(Registry storage _registry, uint256 key) public {
        if (!_registry.inserted[key]) return;
        delete _registry.inserted[key];
        uint256 index = _registry.indexOf[key];
        uint256 lastKey = _registry.keys[_registry.keys.length - 1];
        _registry.keys[index] = lastKey;
        _registry.indexOf[lastKey] = index;
        delete _registry.indexOf[key];
        _registry.keys.pop();
        delete _registry.keyRoles[key];  // Remove the associated role
    }

    /**
     * @dev Grants a role (rank) to an account. This updates the registry and emits a RoleGranted event.
     * @param roleData The RoleData struct that holds the registry and ranks.
     * @param account The account to grant the role to.
     * @param rank The rank to assign to the account.
     */
    function grantRole(RoleData storage roleData, address account, Rank rank) public {
        uint256 key = uint256(uint160(account)); 
        roleData.ranks[account] = rank;
        Register(roleData.registry, key, rank);
        emit RoleGranted(account, rank);  // Emit event for granting role
    }

    /**
     * @dev Revokes a role (rank) from an account. This updates the registry and emits a RoleRevoked event.
     * @param roleData The RoleData struct that holds the registry and ranks.
     * @param account The account from which the role will be revoked.
     */
    function revokeRole(RoleData storage roleData, address account) public {
        uint256 key = uint256(uint160(account)); 
        Rank role = roleData.ranks[account];  // Capture the role before removal for the event
        delete roleData.ranks[account];
        Remove(roleData.registry, key);
        emit RoleRevoked(account, role);  // Emit event for revoking role
    }

    /**
     * @dev Checks whether an account holds the required role (rank) or higher.
     * @param roleData The RoleData struct that holds the registry and ranks.
     * @param requiredRank The minimum required rank for the account.
     * @param account The account to check for the required rank.
     */
    function checkRole(RoleData storage roleData, Rank requiredRank, address account) public view {
        require(roleData.ranks[account] >= requiredRank, "AccessControlUnauthorizedAccount");
    }

    /**
     * @dev Retrieves the highest rank assigned to an account.
     * @param roleData The RoleData struct that holds the registry and ranks.
     * @param account The account whose rank is being queried.
     * @return The highest rank held by the account.
     */
    function getHighestRankForAccount(RoleData storage roleData, address account) public view returns (Rank) {
        return roleData.ranks[account];
    }
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","storageLayout"],"":["ast"]}},"optimizer":{"runs":200,"enabled":false},"libraries":{"contracts/Classes/Access.sol":{"AuthLib":"0xc4d8811f729b26847b4619da49698be6f94bb912"}},"evmVersion":"paris"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"RoleGranted","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"uint8","name":"role","internalType":"enum AuthLib.Rank","indexed":false}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkRole","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint8","name":"rank","internalType":"enum AuthLib.Rank"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum AuthLib.Rank"}],"name":"getAccountRank","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint8","name":"rank","internalType":"enum AuthLib.Rank"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"address","name":"account","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x6080604052600160055534801561001557600080fd5b50600073c4d8811f729b26847b4619da49698be6f94bb91263337b2d8290913360056040518463ffffffff1660e01b815260040161005593929190610149565b60006040518083038186803b15801561006d57600080fd5b505af4158015610081573d6000803e3d6000fd5b50505050610180565b8082525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100bc82610091565b9050919050565b6100cc816100b1565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60068110610112576101116100d2565b5b50565b600081905061012382610101565b919050565b600061013382610115565b9050919050565b61014381610128565b82525050565b600060608201905061015e600083018661008a565b61016b60208301856100c3565b610178604083018461013a565b949350505050565b6109458061018f6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806323a3ad72146100515780633e8402361461008157806380e52e3f1461009d578063a89027f8146100b9575b600080fd5b61006b600480360381019061006691906105de565b6100e9565b6040516100789190610639565b60405180910390f35b61009b600480360381019061009691906105de565b610197565b005b6100b760048036038101906100b29190610654565b61033b565b005b6100d360048036038101906100ce9190610654565b6104d1565b6040516100e091906106f8565b60405180910390f35b60008160058111156100fe576100fd610681565b5b600073c4d8811f729b26847b4619da49698be6f94bb9126301dba04c9091866040518363ffffffff1660e01b815260040161013a929190610729565b602060405180830381865af4158015610157573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017b9190610767565b600581111561018d5761018c610681565b5b1015905092915050565b600460058111156101ab576101aa610681565b5b600073c4d8811f729b26847b4619da49698be6f94bb9126301dba04c9091336040518363ffffffff1660e01b81526004016101e7929190610729565b602060405180830381865af4158015610204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102289190610767565b600581111561023a57610239610681565b5b101561027b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027290610817565b60405180910390fd5b600073c4d8811f729b26847b4619da49698be6f94bb91263337b2d82909184846040518463ffffffff1660e01b81526004016102b993929190610846565b60006040518083038186803b1580156102d157600080fd5b505af41580156102e5573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff167faa259565575c834bc07e74dca784b4071676133ac78513b431afb6ee7edae1218260405161032f91906106f8565b60405180910390a25050565b6004600581111561034f5761034e610681565b5b600073c4d8811f729b26847b4619da49698be6f94bb9126301dba04c9091336040518363ffffffff1660e01b815260040161038b929190610729565b602060405180830381865af41580156103a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103cc9190610767565b60058111156103de576103dd610681565b5b101561041f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610416906108ef565b60405180910390fd5b600073c4d8811f729b26847b4619da49698be6f94bb912631fe3a8a39091836040518363ffffffff1660e01b815260040161045b929190610729565b60006040518083038186803b15801561047357600080fd5b505af4158015610487573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167f6107a4a5447a4208ba14e3ec240bccf0a93828124ccf501af04601031070b18360405160405180910390a250565b60008073c4d8811f729b26847b4619da49698be6f94bb9126301dba04c9091846040518363ffffffff1660e01b815260040161050e929190610729565b602060405180830381865af415801561052b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054f9190610767565b9050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006105868261055b565b9050919050565b6105968161057b565b81146105a157600080fd5b50565b6000813590506105b38161058d565b92915050565b600681106105c657600080fd5b50565b6000813590506105d8816105b9565b92915050565b600080604083850312156105f5576105f4610556565b5b6000610603858286016105a4565b9250506020610614858286016105c9565b9150509250929050565b60008115159050919050565b6106338161061e565b82525050565b600060208201905061064e600083018461062a565b92915050565b60006020828403121561066a57610669610556565b5b6000610678848285016105a4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600681106106c1576106c0610681565b5b50565b60008190506106d2826106b0565b919050565b60006106e2826106c4565b9050919050565b6106f2816106d7565b82525050565b600060208201905061070d60008301846106e9565b92915050565b8082525050565b6107238161057b565b82525050565b600060408201905061073e6000830185610713565b61074b602083018461071a565b9392505050565b600081519050610761816105b9565b92915050565b60006020828403121561077d5761077c610556565b5b600061078b84828501610752565b91505092915050565b600082825260208201905092915050565b7f496e73756666696369656e742070726976696c6567657320746f206772616e7460008201527f20726f6c65732e00000000000000000000000000000000000000000000000000602082015250565b6000610801602783610794565b915061080c826107a5565b604082019050919050565b60006020820190508181036000830152610830816107f4565b9050919050565b610840816106d7565b82525050565b600060608201905061085b6000830186610713565b610868602083018561071a565b6108756040830184610837565b949350505050565b7f496e73756666696369656e742070726976696c6567657320746f207265766f6b60008201527f6520726f6c65732e000000000000000000000000000000000000000000000000602082015250565b60006108d9602883610794565b91506108e48261087d565b604082019050919050565b60006020820190508181036000830152610908816108cc565b905091905056fea2646970667358221220fbc0336c2cd6176f3432dd07e1fcf25e49f77480fe41ad38df558de9796eb11164736f6c634300081a0033

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806323a3ad72146100515780633e8402361461008157806380e52e3f1461009d578063a89027f8146100b9575b600080fd5b61006b600480360381019061006691906105de565b6100e9565b6040516100789190610639565b60405180910390f35b61009b600480360381019061009691906105de565b610197565b005b6100b760048036038101906100b29190610654565b61033b565b005b6100d360048036038101906100ce9190610654565b6104d1565b6040516100e091906106f8565b60405180910390f35b60008160058111156100fe576100fd610681565b5b600073c4d8811f729b26847b4619da49698be6f94bb9126301dba04c9091866040518363ffffffff1660e01b815260040161013a929190610729565b602060405180830381865af4158015610157573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017b9190610767565b600581111561018d5761018c610681565b5b1015905092915050565b600460058111156101ab576101aa610681565b5b600073c4d8811f729b26847b4619da49698be6f94bb9126301dba04c9091336040518363ffffffff1660e01b81526004016101e7929190610729565b602060405180830381865af4158015610204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102289190610767565b600581111561023a57610239610681565b5b101561027b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027290610817565b60405180910390fd5b600073c4d8811f729b26847b4619da49698be6f94bb91263337b2d82909184846040518463ffffffff1660e01b81526004016102b993929190610846565b60006040518083038186803b1580156102d157600080fd5b505af41580156102e5573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff167faa259565575c834bc07e74dca784b4071676133ac78513b431afb6ee7edae1218260405161032f91906106f8565b60405180910390a25050565b6004600581111561034f5761034e610681565b5b600073c4d8811f729b26847b4619da49698be6f94bb9126301dba04c9091336040518363ffffffff1660e01b815260040161038b929190610729565b602060405180830381865af41580156103a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103cc9190610767565b60058111156103de576103dd610681565b5b101561041f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610416906108ef565b60405180910390fd5b600073c4d8811f729b26847b4619da49698be6f94bb912631fe3a8a39091836040518363ffffffff1660e01b815260040161045b929190610729565b60006040518083038186803b15801561047357600080fd5b505af4158015610487573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167f6107a4a5447a4208ba14e3ec240bccf0a93828124ccf501af04601031070b18360405160405180910390a250565b60008073c4d8811f729b26847b4619da49698be6f94bb9126301dba04c9091846040518363ffffffff1660e01b815260040161050e929190610729565b602060405180830381865af415801561052b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054f9190610767565b9050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006105868261055b565b9050919050565b6105968161057b565b81146105a157600080fd5b50565b6000813590506105b38161058d565b92915050565b600681106105c657600080fd5b50565b6000813590506105d8816105b9565b92915050565b600080604083850312156105f5576105f4610556565b5b6000610603858286016105a4565b9250506020610614858286016105c9565b9150509250929050565b60008115159050919050565b6106338161061e565b82525050565b600060208201905061064e600083018461062a565b92915050565b60006020828403121561066a57610669610556565b5b6000610678848285016105a4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600681106106c1576106c0610681565b5b50565b60008190506106d2826106b0565b919050565b60006106e2826106c4565b9050919050565b6106f2816106d7565b82525050565b600060208201905061070d60008301846106e9565b92915050565b8082525050565b6107238161057b565b82525050565b600060408201905061073e6000830185610713565b61074b602083018461071a565b9392505050565b600081519050610761816105b9565b92915050565b60006020828403121561077d5761077c610556565b5b600061078b84828501610752565b91505092915050565b600082825260208201905092915050565b7f496e73756666696369656e742070726976696c6567657320746f206772616e7460008201527f20726f6c65732e00000000000000000000000000000000000000000000000000602082015250565b6000610801602783610794565b915061080c826107a5565b604082019050919050565b60006020820190508181036000830152610830816107f4565b9050919050565b610840816106d7565b82525050565b600060608201905061085b6000830186610713565b610868602083018561071a565b6108756040830184610837565b949350505050565b7f496e73756666696369656e742070726976696c6567657320746f207265766f6b60008201527f6520726f6c65732e000000000000000000000000000000000000000000000000602082015250565b60006108d9602883610794565b91506108e48261087d565b604082019050919050565b60006020820190508181036000830152610908816108cc565b905091905056fea2646970667358221220fbc0336c2cd6176f3432dd07e1fcf25e49f77480fe41ad38df558de9796eb11164736f6c634300081a0033

External libraries