Three hundred and five lines to do a job you already watched done in two hundred and six. Read it across four boards and the extra hundred turn out to be one idea repeated: every operation split in two, so that balances only ever move in one place.
In checkpoint four you read a complete ERC20 in two hundred and six lines. Solmate's: terse, self-contained, every operation written out exactly once. This is OpenZeppelin's, the file most tokens on Ethereum inherit from, and it does the identical job in three hundred and five.
It will not fit on one board. So it arrives in four, each showing more of the file than the last, numbered exactly as the file numbers itself. Right now you have lines 1 to 47: the paperwork, what the contract keeps, and the constructor.
Line 29 opens the contract, and four names follow the word `is`. Solmate's ERC20 followed nothing at all. This one inherits from Context, from IERC20 and IERC20Metadata, and from IERC20Errors, and lines 6 to 9 say where each of the four lives.
Three of those four are shapes rather than code. The two interfaces name the functions this file promises to have. IERC20Errors names the errors it is allowed to revert with. Context is the only one carrying a body, and you meet its single function in a moment.
Five things stored, on lines 30 to 37, and every one of them `private`. Look inside the mappings. The key has a name: `address account`, `address spender`. The compiler ignores those names completely, and you do not, which tells you precisely who they were written for.
And the constructor takes two arguments. A name and a symbol, on line 44, assigned on 45 and 46, done. Solmate's constructor also took the number of decimals. This one does not, and the next board shows you where that number went instead.
The board has grown to line 167, and nine public functions sit on it. Six only read. `decimals` on line 77 is one of the six, and it hands back eighteen from a function body rather than from storage, which is why the constructor on line 44 needed no third argument.
Solmate declared its balances mapping `public` and let the compiler write the getter. This file declares `_balances` private on line 30 and writes the getter itself, on lines 87 and 88. Same answer to a caller, four more lines, one difference worth naming.