Early exchange-enabled token whose deployed constructor leaves its buy and sell prices unset.
Historical Significance
The contract is a useful snapshot of the pre-ERC-20 experimentation period: recognizable token mechanics are already present, but the interface still uses the old spentAllowance pattern and tutorial-style owner-admin extensions rather than the later standard shape.
Context
Deployed on Mar 18, 2016 at block 1,173,786 by 0x2c7bd0008596b2832002d9fdc8253f198dd8b6e0, Fucks was used repeatedly in its launch year and then rediscovered much later. EthereumHistory currently records 6 transactions in 2016, 2 in 2025, and 12 in 2026.
Token Information
Key Facts
Description
Fucks is a March 2016 token built from the early MyToken tutorial lineage. It exposes balances, freezing, allowances, minting, owner controls, and buy/sell entry points, but the deployed constructor does not initialize buyPrice or sellPrice; both remain zero until the owner calls setPrices(). Its creation and runtime bytecode match exactly against native solc v0.1.5 with optimization enabled.
Source Verified
Exact creation and runtime bytecode match. Runtime: 2228 bytes, creation: 3015 bytes. Runtime SHA-256 d767676e03eec6bfce55c7cb36368fddb6f99b0e8398cf8ee0ab801d9f440a20. Creation SHA-256 f814f31cba220e66126229b55acff79cdc840dce3cc5e005024635ca7ee2f109.
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 owned {
address public owner;
function owned() {
owner = msg.sender;
}
modifier onlyOwner {
if (msg.sender != owner) throw;
_
}
function transferOwnership(address newOwner) onlyOwner {
owner = newOwner;
}
}
contract tokenRecipient {
function sendApproval(address _from, uint256 _value, address _token);
}
contract MyToken is owned {
string public name;
string public symbol;
uint8 public decimals;
uint256 public sellPrice;
uint256 public buyPrice;
mapping(address => uint256) public balanceOf;
mapping(address => bool) public frozenAccount;
mapping(address => mapping(address => uint)) public allowance;
mapping(address => mapping(address => uint)) public spentAllowance;
event Transfer(address indexed from, address indexed to, uint256 value);
event FrozenFunds(address target, bool frozen);
function MyToken(uint256 initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol, address centralMinter) {
if (initialSupply == 0) initialSupply = 1000000;
if (centralMinter != 0) owner = msg.sender;
balanceOf[msg.sender] = initialSupply;
name = tokenName;
symbol = tokenSymbol;
decimals = decimalUnits;
}
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value) throw;
if (balanceOf[_to] + _value < balanceOf[_to]) throw;
if (frozenAccount[msg.sender]) throw;
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
Transfer(msg.sender, _to, _value);
}
function approve(address _spender, uint256 _value) returns(bool success) {
allowance[msg.sender][_spender] = _value;
tokenRecipient spender = tokenRecipient(_spender);
spender.sendApproval(msg.sender, _value, this);
}
function transferFrom(address _from, address _to, uint256 _value) returns(bool success) {
if (balanceOf[_from] < _value) throw;
if (balanceOf[_to] + _value < balanceOf[_to]) throw;
if (spentAllowance[_from][msg.sender] + _value > allowance[_from][msg.sender]) throw;
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
spentAllowance[_from][msg.sender] += _value;
Transfer(msg.sender, _to, _value);
}
function() {
throw;
}
function mintToken(address target, uint256 mintedAmount) onlyOwner {
balanceOf[target] += mintedAmount;
Transfer(0, target, mintedAmount);
}
function freezeAccount(address target, bool freeze) onlyOwner {
frozenAccount[target] = freeze;
FrozenFunds(target, freeze);
}
function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner {
sellPrice = newSellPrice;
buyPrice = newBuyPrice;
}
function buy() {
uint amount = msg.value / buyPrice;
if (balanceOf[this] < amount) throw;
balanceOf[msg.sender] += amount;
balanceOf[this] -= amount;
Transfer(this, msg.sender, amount);
}
function sell(uint256 amount) {
if (balanceOf[msg.sender] < amount) throw;
balanceOf[this] += amount;
balanceOf[msg.sender] -= amount;
msg.sender.send(amount * sellPrice);
Transfer(msg.sender, this, amount);
}
}