371-byte exchange deposit wallet: forwards ETH deposits, sweeps tokens, self-destructs.
Historical Significance
Documents the per-user deposit-address pattern exchanges ran in early 2016: deploy a cheap wallet per customer, tag incoming deposits with a hardcoded account id carried in an indexed event topic, and sweep centrally. The id is baked into the bytecode rather than stored, so each account cohort produces its own distinct compiled contract. Its ERC-20 interface declares transfer() with no return value, the pre-standard style that predates the bool return convention and the detail that pins the exact compilation.
Key Facts
Description
A 371-byte per-user exchange deposit wallet. Any ETH sent to it emits Deposit(address indexed sender, uint256 indexed id, uint256 amount) with the account id hardcoded as the constant 88 (0x58) in the indexed slot, letting the operator attribute incoming funds off-chain. Three owner-gated functions: collectToken(address,address,uint256) forwards an ERC-20 out, collect() sends the full ETH balance to the owner, and kill() self-destructs to the owner. Non-owner calls return silently rather than throwing. Runtime bytecode reproduced byte-for-byte with solc 0.3.2, optimizer enabled at 200 runs. Verified on Sourcify and Etherscan.
Source Verified
Homestead Era
The first planned hard fork. Removed the canary contract, adjusted gas costs.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology and exact bytecode matching.
View Verification ProofShow source code (Solidity)
// Submitted by EthereumHistory (ethereumhistory.com)
contract Token {
function transfer(address _to, uint256 _value);
}
contract Wallet {
address owner;
event Deposit(address indexed sender, uint256 indexed id, uint256 amount);
modifier onlyOwner { if (msg.sender == owner) { _ } }
function collectToken(address tokenAddress, address to, uint256 value) onlyOwner {
Token token = Token(tokenAddress);
token.transfer(to, value);
}
function kill() onlyOwner {
selfdestruct(owner);
}
function collect() onlyOwner {
owner.send(this.balance);
}
function() {
if (msg.value > 0) {
Deposit(msg.sender, 88, msg.value);
}
}
}External Links
Related contracts
Contract 0xa44034...158fa6
Same deployerOwner-controlled deposit wallet (Homestead, Jul 2016): a payable fallback logs a Deposit(from, value, 88) event; owner-only collect() sweeps the balance.
0xa44034...158fa6May 15, 2016Contract 0xeffcf2...25b0dc
Same deployerByte-identical deployment of an owner-controlled deposit wallet (Homestead, Jul 2016): a payable fallback logs a Deposit event; owner-only collect() sweeps ETH.
0xeffcf2...25b0dcMay 15, 2016Contract 0xa56dba...32bbf9
Same deployerByte-identical deployment of an owner-controlled deposit wallet (Homestead, Jul 2016): a payable fallback logs a Deposit event; owner-only collect() sweeps ETH.
0xa56dba...32bbf9May 21, 2016Contract 0xd69fe5...c9faf7
Same deployerOwner-controlled deposit wallet (Homestead, Jul 2016): a payable fallback logs a Deposit(from, value, 88) event; owner-only collect() sweeps the balance.
0xd69fe5...c9faf7May 21, 2016Contract 0xa27f61...2a2446
Same deployerOwner-controlled deposit wallet (Homestead, Jul 2016): a payable fallback logs a Deposit(from, value, 88) event; owner-only collect() sweeps the balance.
0xa27f61...2a2446May 21, 2016Contract 0xbef2d7...3500a3
Same deployerOwner-controlled deposit wallet (Homestead, Jul 2016): a payable fallback logs a Deposit(from, value, 88) event; owner-only collect() sweeps the balance.
0xbef2d7...3500a3May 21, 2016