Address the trust trade-off: "Upgradeable contracts sacrifice immutability for flexibility. I use UUPS with a timelock and storage gaps. Every upgrade is tested against the previous storage layout."
Proxy contracts delegate calls to an implementation contract via delegatecall. The proxy holds storage; the implementation holds logic. Patterns: Transparent Proxy (admin vs user call routing), UUPS (upgrade logic in implementation). Risks: storage collision between proxy and implementation, initializer re-execution (use initializer modifier instead of constructor), function selector clashes, and centralised upgrade authority. Mitigation: use OpenZeppelin libraries, thorough testing of upgrade paths, storage gap patterns, and timelocks on upgrades.
Senior Solidity question. Proxy patterns are powerful but dangerous. Candidates who cannot explain storage layout risks will introduce critical bugs. Ask about a specific upgrade they have performed.