I am using Initializable.sol in order to use the minimal proxy pattern. However, I don't understand why the initialize function (example below from OZ docs) is public rather than external. It seems like the contract will never call its own initialize but instead another contract will. What am I missing?
// contracts/MyContract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
contract MyContract is Initializable {
function initialize(
address arg1,
uint256 arg2,
bytes memory arg3
) public payable initializer {
// "constructor" code...
}
}