A token contract deployed by Vitalik Buterin, compiled from currency.se (Serpent) in the ethereum/dapp-bin repository. Deployed days after Devcon 1 and one week
Key Facts
Description
Deployed by Vitalik Buterin on November 12, 2015 (block 530,996), this token implements the standardized currency API from the ethereum/dapp-bin repository. It has zero decimals and a fixed supply of 1,000,000 units, all held by the deployer.
The contract was long assumed to be compiled from currency.sol (Solidity), but bytecode analysis revealed it was actually compiled from currency.se - the Serpent version. Three clues gave it away: the constructor uses MSTORE8-based memory initialization instead of Solidity's free memory pointer pattern, the runtime uses Serpent's alloc() pattern (MSIZE, SWAP1, MSIZE, ADD), and two function names differ from the Solidity source (disapprove vs unapprove, isApprovedOnceFor vs isApprovedOnce). The exact compiler was identified as Serpent at commit f0b4128 (October 15, 2015), producing a byte-for-byte match of all 1,661 bytes.
The deployment came days after Devcon 1 in London, where token standardization was a major topic, and one week before Vitalik co-published EIP-20 (the ERC-20 standard) on November 19, 2015. The source code predates the standard - this contract captures the state of token design just before it was formalized.
Source Verified
Compiled from currency.se in ethereum/dapp-bin using the Serpent compiler. Initially mistaken for Solidity - the contract was actually written in Vitalik's own language.
Historian Categories
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 (Serpent)
data accounts[](balance, withdrawers[])
event CoinSent(from:address:indexed, value:uint256, to:address:indexed)
def init():
self.accounts[msg.sender].balance = 1000000
def sendCoin(_value:uint256, _to:address):
if self.accounts[msg.sender].balance >= _value and _value >= 0 and _value < 340282366920938463463374607431768211456:
self.accounts[msg.sender].balance -= _value
self.accounts[_to].balance += _value
log(type=CoinSent, msg.sender, _value, _to)
return(1:bool)
return(0:bool)
def sendCoinFrom(_from:address, _value:uint256, _to:address):
auth = self.accounts[_from].withdrawers[msg.sender]
if self.accounts[_from].balance >= _value and auth >= _value && _value >= 0 and _value < 340282366920938463463374607431768211456:
self.accounts[_from].withdrawers[msg.sender] -= _value
self.accounts[_from].balance -= _value
self.accounts[_to].balance += _value
log(type=CoinSent, _from, _value, _to)
return(1:bool)
return(0:bool)
def const coinBalance():
return(self.accounts[msg.sender].balance)
def const coinBalanceOf(_addr:address):
return(self.accounts[_addr].balance)
def approve(_addr:address):
self.accounts[msg.sender].withdrawers[_addr] = 340282366920938463463374607431768211456
def isApproved(_proxy:address):
return(self.accounts[msg.sender].withdrawers[_proxy] > 0)
def approveOnce(_addr:address, _maxValue:uint256):
self.accounts[msg.sender].withdrawers[_addr] += _maxValue
def isApprovedOnceFor(_target:address, _proxy:address):
return(self.accounts[_target].withdrawers[_proxy])
def disapprove(_addr:address):
self.accounts[msg.sender].withdrawers[_addr] = 0