267-byte owner-gated ERC-20 sweeper that emits TokenTransfer on each move.
Historical Significance
Cracking this contract hinged on a compiler artifact rather than on its semantics. The source declares a local typed variable, Token token = Token(tokenAddress), which pushes the compiled contract just past 256 bytes and forces solc to widen every jump destination from PUSH1 to PUSH2, adding fifteen bytes across the dispatch and body. Reconstructions that were semantically correct but inlined the cast compile fifteen bytes short and can never match, on any 0.3.x build or optimizer setting - which is why this bytecode resisted identification.
Key Facts
Description
A 267-byte token-moving wallet with a single public function, transferToken(address,address,uint256) (selector 0xf5537ede). Calls from anyone other than the stored owner return silently rather than throwing - the owner check is an equality test guarding the body, not a revert. Inside, it rejects any attached ETH (msg.value > 0 throws), forwards the ERC-20 transfer to the target token, and emits TokenTransfer(address indexed, address indexed, uint256). The bare fallback also rejects ETH. Runtime bytecode reproduced byte-for-byte with solc 0.3.5, 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) returns (bool);
}
contract Wallet {
address owner;
event TokenTransfer(address indexed token, address indexed to, uint256 value);
modifier onlyOwner { if (msg.sender == owner) { _ } }
modifier noEther { if (msg.value > 0) throw; _ }
function transferToken(address tokenAddress, address to, uint256 value) onlyOwner noEther {
Token token = Token(tokenAddress);
token.transfer(to, value);
TokenTransfer(tokenAddress, to, value);
}
function() noEther {}
}