- like using a "require" statement but making it reusable for other functions as well
- an `indexed` variable will let you filter by that value in the logs
- inheritance: when a smart contract inherits from another one, it means that the child contract gets all of the attributes, methods, functionality that is public or internal
- you can inherit from multiple parent contracts in Solidity
- like in C#, the `virtual` function allows for a function to be overridden by child contracts