Bytecode verified via sibling
This contract shares identical runtime bytecode with MyToken (0x002a13b6...) which has been verified through compiler archaeology.
An ethereum.org tutorial token deployed as LOOT with the symbol Ł and zero decimals, spendable only through approveAndCall.
Historical Significance
A token whose allowance can only be granted to a contract, because the tutorial revision it was copied from offered approveAndCall and no plain approve. That asymmetry is part of why ERC-20 settled on approve as the primitive and left approveAndCall as an extension.
Context
Deployed in the spring of 2016, while ERC-20 was still a draft and the ethereum.org token page was the source most people copied. Its interface is nearly the standard one, which is what makes the missing approve visible.
Token Information
Key Facts
Description
A token from the ethereum.org tutorial in the revision that added allowances but not a plain approve. It carries a name, a symbol and a decimals field, a public balanceOf mapping, an allowance mapping and a spentAllowance mapping that records how much of each allowance has already been drawn.
transfer throws rather than returning false when the sender is short and checks the recipient for overflow before adding. An allowance can be granted through approveAndCall alone, which sets the allowance and then calls receiveApproval on the spender, so a spender has to be a contract that implements that callback: an ordinary account cannot be approved at all. There is no owner, no mint and no way to add to the supply after deployment.
This one was deployed as LOOT, symbol Ł, with zero decimal places, so its units are whole and indivisible. Name, symbol and decimals are written in the constructor and no function changes them.
Source Verified
Runtime + creation bytecode match. Native C++ solc v0.2.1 (webthree-umbrella v1.1.2), optimizer ON. Token: Poker Chips (POKER), 0 decimals, 10000 supply. Bug: transferFrom emits Transfer(msg.sender) instead of Transfer(_from).
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Frontier Era
The initial release of Ethereum. A bare-bones implementation for technical users.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology and exact bytecode matching.
View Verification ProofShow source code (Solidity)
contract tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData); }
contract MyToken {
/* Public variables of the token */
string public name;
string public symbol;
uint8 public decimals;
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
mapping (address => mapping (address => uint256)) public spentAllowance;
/* This generates a public event on the blockchain that will notify clients */
event Transfer(address indexed from, address indexed to, uint256 value);
/* Initializes contract with initial supply tokens to the creator of the contract */
function MyToken(uint256 initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) {
balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens
name = tokenName; // Set the name for display purposes
symbol = tokenSymbol; // Set the symbol for display purposes
decimals = decimalUnits; // Amount of decimals for display purposes
}
/* Send coins */
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough
if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
balanceOf[msg.sender] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place
}
/* Allow another contract to spend some tokens in your behalf */
function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) {
allowance[msg.sender][_spender] = _value;
tokenRecipient spender = tokenRecipient(_spender);
spender.receiveApproval(msg.sender, _value, this, _extraData);
}
/* A contract attempts to get the coins */
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
if (balanceOf[_from] < _value) throw; // Check if the sender has enough
if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
if (spentAllowance[_from][msg.sender] + _value > allowance[_from][msg.sender]) throw; // Check allowance
balanceOf[_from] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
spentAllowance[_from][msg.sender] += _value;
Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place
}
/* This unnamed function is called whenever someone tries to send ether to it */
function () {
throw; // Prevents accidental sending of ether
}
}External Links
Related contracts
token
Same eraAn early ERC-20-like token deployed in Ethereum's first week, built directly from the example in the official Ethereum Frontier Guide documentation.
0x8374f5...46609aAugust 7, 2015token
Same eraA second deployment of the FirstCoin tutorial token by the same creator, 11 blocks after the original — both derived from the official Ethereum Frontier Guide e
0x3b4446...295f52August 7, 2015Contract 0xd958b5...ec4c9f
Same eraEthereum.org tutorial Coin contract deployed on Frontier day 1. Contains a bug: balance(address) ignores its argument and returns msg.sender balance.
0xd958b5...ec4c9fAugust 7, 2015token
Same eraEarly tutorial-derived coin contract compiled with Solidity v0.1.1, deployed 9 days after Ethereum Frontier launch.
0x3c401b...da1634August 8, 2015token
Same eraTutorial-derived coin contract (Solidity v0.1.1), one of multiple token instances deployed by the same address on Aug 8, 2015.
0x33e986...395d13August 8, 2015CoinStub
Same eraCoin tutorial stub — mapping getter + empty function returning default bool.
0x4fb5ac...3b08aeAugust 8, 2015