One of the most interesting features of smart contracts is that they can grant intricate access permissions to their users. Smart contract developers can allow anyone to use their contracts or they can set up conditions as to who has access to certain features of the contracts. One of the easiest ways to do that is to hardcode the conditions that have to be met in order to allow a particular user to call a specific feature of the contract, for example by using the Michelson instruction **IF** .
However, you may also want to give your users the ability to allow or reject a certain transaction by saving it into a bigmap in the contract for later reference. This is what permits outlined in the TZIP-17 standard do. In a nutshell, permits approve transactions in advance and record these approvals in a contract for later processing by third parties.