Solidity

Transparent Proxy

A transparent proxy is an upgradeable proxy pattern where admin calls are handled by the proxy while non-admin calls are delegated to the implementation.

Users reach the implementation through the proxy, but the proxy admin uses a separate upgrade path.

Transparent Proxy Explained in Detail

A transparent proxy separates admin behavior from user behavior. Non-admin callers are delegated to the implementation. Admin callers use the proxy's upgrade and admin functions instead of reaching implementation functions through the proxy.

This separation reduces function-selector confusion, but it also creates behavior auditors must test explicitly.

Smart contract example

An admin who calls an implementation function through a transparent proxy may not reach that implementation function. The proxy treats the caller as the admin and routes the call to proxy-admin behavior instead.

That is different from a UUPS proxy, where upgrade authorization lives in the implementation.

Transparent Proxy in Auditing

Transparent proxies combine delegatecall, initialization, upgrade authority, storage layout, and admin separation. A wrong ProxyAdmin, uninitialized proxy, or unsafe upgrade can lead to takeover or a bricked system.

Auditors also check mixed-pattern deployments, such as using a UUPS implementation behind a transparent proxy without understanding which upgrade path is active.

Red flags in code

  • Proxy admin is an EOA or unclear address.

  • Proxy or implementation can be initialized by an unintended caller.

  • Admin tries to use implementation functions through the proxy.

  • Implementation contains upgrade logic that interacts poorly with the transparent proxy setup.

  • Storage layout changes are not reviewed before upgrade.

How to test or review it

  • Identify the proxy type before reviewing upgrade paths.

  • Test implementation functions as user, proxy admin, and non-admin privileged accounts.

  • Verify ProxyAdmin ownership, multisig control, and timelock expectations.

  • Confirm initialization happened through the proxy and implementation initialization is locked when appropriate.

  • Compare storage layouts and review storage collision risk for every upgrade.

Sources