Solidity

Initializer Function

An initializer is a one-time setup function used instead of a constructor when a smart contract is deployed behind an upgradeable proxy.

It sets the owner, roles, and config for a proxy because the implementation constructor does not initialize proxy storage.

Initializer Functions Explained in Detail

An initializer is a normal function that performs constructor-like setup for an upgradeable proxy. Proxies do not run the implementation constructor in proxy storage, so setup must happen through an initializer called on the proxy.

Smart contract example

A proxy deployment should call initialize(owner) once. If anyone can call it later, they may become owner.

contract Vault is Initializable {
    address public owner;

    function initialize(address _owner) external initializer {
        owner = _owner;
    }
}

Initializer Functions in Auditing

Bad initializer handling can give attackers ownership, roles, minting rights, upgrade rights, or control over protocol configuration. That makes initializer review part of access control review.

Uninitialized implementations are also risky. Attackers may initialize the implementation directly and abuse implementation-only logic.

Red flags in code

  • initialize lacks an initializer or equivalent one-time guard.

  • Initializer is not called during proxy deployment.

  • Parent initializers are missing or called twice.

  • Reinitializer can be called by anyone.

  • Implementation contract is left unlocked.

  • Constructor still contains important setup logic.

  • Initial values are assigned in state variable declarations for upgradeable contracts.

How to test or review it

  • Confirm initialization happens atomically with proxy deployment.

  • Try calling initialize twice. The second call should revert.

  • Try initializing from an unauthorized account.

  • Review parent contracts and upgrade modules.

  • Confirm every required parent initializer is called once and in the correct order.

  • Compare this term with proxy initialization, which describes the broader deployment failure mode.

  • Check storage assumptions too, because initializer writes can expose a storage collision after an upgrade.

Sources