Per-user deposit wallet with a single withdraw function that asks its factory for the current logic address and delegatecalls it.
Historical Significance
A small, clear example of the 2018 pattern for custodial token deposits: one throwaway address per user, no logic in the address itself, and every withdrawal routed through code the operator could replace at any time. The (_token); (_to); (_amount); statements in the source are the idiom of the era for silencing unused-parameter warnings while keeping the function signature the delegate target expects.
Key Facts
Description
A deposit address stamped out on demand by a factory through makeWallet(uint256), starting in August 2018. The factory records itself in the wallet's only storage slot, and the wallet has exactly one function: withdraw(address token, address to, uint256 amount). It ignores its own arguments, asks the factory for an address through getSender(), and delegatecalls that address with the original calldata, so the withdrawal logic runs with the wallet's own balance and storage.
The factory exposes the rest of the system: an owner, a bank address that can be changed, an adjustable fee, and a logWithdraw event hook. That shape points to a custodial service that gave each customer their own address and collected a fee on the way out, with the logic kept upgradeable by changing what getSender() returns.
There is no payable fallback, so plain ether transfers to these wallets revert; the wallets are built to receive ERC20 tokens. The source was compiled with solc 0.4.22 and the optimizer off. The runtime code matches the deployed bytecode; only the trailing swarm metadata hash differs, because the EthereumHistory attribution comment changes the source text. Sourcify records this as a partial match and Etherscan shows it as verified.
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)
pragma solidity ^0.4.22;
contract Controller {
function getSender() public returns (address);
}
contract Wallet {
Controller controller;
function withdraw(address _token, address _to, uint256 _amount) public returns (bool) {
(_token);
(_to);
(_amount);
return controller.getSender().delegatecall(msg.data);
}
}