Later, simpler build of the same settings-driven proxy: one lookup for the implementation, then a plain delegatecall with no return-size table.
Historical Significance
The gap between this build and the earlier one is the arrival of RETURNDATASIZE. Once a contract could ask how much data a call returned, the bookkeeping that made the first version awkward simply evaporated, and the proxy shrank by a quarter. Both versions are in service on chain, so the two sit side by side as a before and after of the same upgrade.
Key Facts
Description
The storage layout and the outward behaviour are unchanged from the earlier build. Empty calldata logs a Deposit and stops; anything else is forwarded to whatever address the settings contract currently names as the target.
What is gone is the size lookup. This version calls delegatecall through Solidity's own address member rather than inline assembly, wraps it in require, and lets the compiler handle the memory. The selector-to-return-width table the earlier proxy consulted on every call is no longer needed.
initialize is still present and still empty, kept so the deployed interface matches its predecessor.
Source Verified
Byzantium Era
First Metropolis hard fork. Added zk-SNARK precompiles, REVERT opcode, and staticcall.
Bytecode Overview
Verified Source Available
This contract has verified source code.
View Verification ProofShow source code (Solidity)
// Submitted by EthereumHistory (ethereumhistory.com)
contract Settings {
function target() constant returns (address);
}
contract Proxy {
address public settings;
event Deposit(address _from, uint256 _value);
function initialize(address _settings) {
}
function () payable {
if (msg.data.length == 0) {
Deposit(msg.sender, msg.value);
return;
}
require(Settings(settings).target().delegatecall(msg.data));
}
}