Missing parent contract initialization in upgradeable contract
The contract uses non-upgradeable parent contracts (ReentrancyGuard) instead of their upgradeable versions and skips parent initializer calls, leaving _status in the wrong storage context.
Description
The contract is currently implemented as a non-upgradeable contract: it uses non-upgradeable parent contracts (ReentrancyGuard) instead of their upgradeable versions (ReentrancyGuardUpgradeable) and fails to initialize parent contracts properly. This creates two issues:
- Wrong contract type: Uses
ReentrancyGuardwhich has a constructor that sets_status = _NOT_ENTEREDin implementation contract storage, not proxy storage. - Missing parent initialization: The
initialize()function does not call parent initializers.
Current problematic code:
// Wrong import: should be ReentrancyGuardUpgradeableimport {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";// Using non-upgradeable contractcontract KnowledgeMarket is Initializable, ERC4908, ReentrancyGuard {// Missing parent initializationsfunction initialize(address payable _treasury, uint32 _fee) public initializer {if (_treasury == address(0)) revert ZeroAddress();if (_fee > 10000) revert InvalidFee();platformTreasury = _treasury;platformFeePercent = _fee;// Missing: __ERC721_init(), __ReentrancyGuard_init()}
ReentrancyGuardconstructor sets_status = 1in implementation contract storage.- In a proxy pattern, this initialization happens in the wrong storage context.
ReentrancyGuardUpgradeablerequires explicit__ReentrancyGuard_init()call.- Without proper initialization,
_statusdefaults to 0, butnonReentrantmodifier checks_status != _ENTERED(2), so it still works by accident.
Impact
Inconsistent storage layout in upgradeable proxy patterns; latent reentrancy guard semantics depend on default values rather than explicit initialization, complicating future upgrades.
Recommendation
- Change imports to upgradeable versions (
ReentrancyGuardUpgradeable). - Update contract inheritance.
- Initialize all parent contracts properly in
initialize:
function initialize(address payable _treasury, uint32 _fee) public initializer {__ERC721_init("Knowledge Market Access", "KMA");__ERC721Enumerable_init();__ReentrancyGuard_init();if (_treasury == address(0)) revert ZeroAddress();if (_fee > 10000) revert InvalidFee();platformTreasury = _treasury;platformFeePercent = _fee;}
Resolution
Ipal Network: Confirmed. We agreed with the recommendation.
Zealynx: Not Fixed: The KnowledgeMarket.sol contract still lacks proper parent contract initialization. It should use ReentrancyGuardUpgradeable and call __ReentrancyGuard_init() in the initialize function.
UPDATE: Fixed.

