@spalladino is correct, this is related to the linearization of the inheritance graph. But it’s not that if we don’t add Initializable
everywhere some contracts may not linearize. It’s that we want the linearization to be exactly the same in openzeppelin-solidity
and openzeppelin-eth
, not only of the contracts in OpenZeppelin but of any contracts that users build by extending them. This prevents headaches when users adapt a contract to be upgradeable, and guarantees that the tests and analyses performed on openzeppelin-solidity
carry over to openzeppelin-eth
.
Adding Initializable
everywhere guarantees this will happen because of the way C3 linearization works. That is very complex to explain in detail in this post, but essentially if Initializable
is first in every list of parent contracts, it will end up first in the resulting linearized list, and the rest of the linearization will proceed as if Initializable
wasn’t there.