Solia saysEIP-1167 minimal proxies are 55-byte runtime contracts that delegatecall every call to a fixed implementation — making mass deployment (per-user vaults, NFTs, escrow) nearly free.
An EIP-1167 minimal proxy (a "clone") is a 55-byte contract whose entire job is to delegatecall into a fixed implementation address. Every external call forwards 100% of calldata to the implementation, returns the result, and reverts on failure. Storage stays in the proxy; logic lives in the implementation. Twenty bytes of the bytecode encode the implementation address.
The economic win is huge: instead of paying 24,000 bytes of deployment per copy, you pay 55. Per-user vaults, per-collection NFTs, escrow contracts — anything you need to instantiate per-user uses this pattern. The demo compares deployment for 100 clones vs 100 full deployments.
Power-ups you unlock
55-byte runtime: delegatecalls to a fixed implementation
Every call forwards 100% of calldata to the implementation
Storage lives in the proxy; logic lives in the implementation
Massive deployment savings for per-user or per-instance contracts
Standardized as EIP-1167 in 2018
The Reentrancy Reaper attacks — common mistakes
Forgetting clones share implementation storage layout (use Initializable, not constructors)
Trying to use a constructor in the implementation (clones cannot run constructors)
Overwriting the implementation address (immutable in the proxy bytecode)
Treating clones as upgradeable — they delegate to a FIXED address
Boss battleCompare bytecode and total deploy cost for 100 minimal-proxy clones vs 100 full deployments.
Example code
<!doctype html><html><head><meta charset="utf-8"></head>
<body style="background:#06040d;color:#e6e0ff;font-family:monospace;padding:20px"><pre id="o"></pre>
<script>
// EIP-1167 runtime template (55 bytes total; 20 of them encode the impl address):
const MINIMAL_TEMPLATE = '0x363d3d373d3d3d363d73<IMPL>5af43d82803e903d91602b57fd5bf3';
const MINIMAL_SIZE = 55;
const FULL_SIZE = 24000; // typical full implementation contract
const DEPLOY_PER_BYTE = 200;
const N = 100;
const minimalDeploy = MINIMAL_SIZE * N * DEPLOY_PER_BYTE;
const fullDeploy = FULL_SIZE * N * DEPLOY_PER_BYTE;
const savings = fullDeploy - minimalDeploy;
document.getElementById('o').textContent = [
'EIP-1167 minimal proxy runtime:',
' ' + MINIMAL_TEMPLATE,
' (55 bytes; 20 of them = implementation address)',
'',
'mass-deploy ' + N + ' instances:',
' full contracts: ' + (FULL_SIZE*N).toLocaleString() + ' bytes → ' + fullDeploy.toLocaleString() + ' gas',
' minimal clones: ' + (MINIMAL_SIZE*N).toLocaleString() + ' bytes → ' + minimalDeploy.toLocaleString() + ' gas',
'',
'savings: ' + savings.toLocaleString() + ' gas (' + Math.round(100*savings/fullDeploy) + '% off)',
'',
'storage lives in each proxy; logic delegated to a single implementation'
].join('\n');
</script></body></html>