This example shows how to use OpenZeppelin's AccessControl in Solidity. First, the contract imports AccessControl and defines a role ADMIN_ROLE as a bytes32 hash. In the constructor, the deployer is given the ADMIN_ROLE using _grantRole. When adminFunction is called, the onlyRole modifier checks if the caller has ADMIN_ROLE. If yes, the function runs; if no, the call reverts with an error. The execution table traces deployment and calls, showing role assignments and checks. The variable tracker shows how roles mapping changes. Key moments clarify why calls revert without roles and how roles are assigned. The quiz tests understanding of role checks and assignments. This pattern helps secure smart contracts by controlling who can call sensitive functions.