The first deployment of GavCoin, potentially by Gavin Wood himself.
Historical Significance
An early GavCoin variant that demonstrates the evolution of token contract patterns on Ethereum — from tutorial-style coinBalanceOf naming toward the ERC-20 standard balanceOf interface. Documents how even prominent named tokens went through multiple deployment iterations.
Context
Deployed during the Homestead era (March–September 2016), when token standards were still evolving. The coinBalanceOf naming pattern links this contract to the Frontier-era tutorial conventions. ERC-20 (EIP-20) had been proposed in November 2015 but the ecosystem was still transitioning toward standardized interfaces.
Token Information
Key Facts
Description
The contract follows the structure of the original coin.sol reference implementation, which predates ERC-20 standardization and does not include name() or symbol() functions. At deployment, constructor input data encoded the ASCII string “GavCoin,” embedding the name directly into the bytecode. The mine() function remains publicly callable, allowing new units to be created based on elapsed time since the previous mining call, with rewards split between the caller and the current Ethereum block producer.
GavCoin is an Ethereum smart contract deployed on April 26, 2016 whose logic closely matches the coin.sol prototype published by Gavin Wood in February 2015. The contract implements a custom balances mapping, pre-ERC-20 transfer and minting functions, and a publicly callable, payable mine() function.
The contract follows the structure of the original coin.sol reference implementation, which predates ERC-20 standardization and does not include name() or symbol() functions. At deployment, constructor input data encoded the ASCII string "GavCoin," embedding the name directly into the bytecode. The mine() function remains publicly callable, allowing new units to be created based on elapsed time since the previous mining call, with rewards split between the caller and the current Ethereum block producer.
Source Verified
Pre-ERC-20 mineable token from Gavin Wood's coin.sol in ethereum/dapp-bin. Compiled with solc v0.3.1, optimizer enabled. 905 bytes runtime, byte-perfect match.
Historian Categories
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
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)
contract NameReg {
function addressOf(bytes32 _name) constant returns (address addr) {}
function register(bytes32 _name) {}
}
contract GavCoin {
mapping (address => uint) m_balances;
mapping (address => mapping (address => bool)) m_approved;
address owner;
uint m_lastNumberMined;
function GavCoin() {
NameReg(nameRegAddress()).register("GavCoin");
owner = msg.sender;
m_balances[msg.sender] = 1000000;
m_lastNumberMined = block.number;
}
function named(bytes32 _name) constant returns (address) {
return NameReg(nameRegAddress()).addressOf(_name);
}
function nameRegAddress() constant returns (address) {
return 0x084f6a99003dae6d3906664fdbf43dd09930d0e3;
}
function sendCoinFrom(address _from, uint _val, address _to) {
if (m_balances[_from] >= _val && m_approved[_from][msg.sender]) {
m_balances[_from] -= _val;
m_balances[_to] += _val;
}
}
function sendCoin(uint _val, address _to) {
if (m_balances[msg.sender] >= _val) {
m_balances[msg.sender] -= _val;
m_balances[_to] += _val;
}
}
function coinBalance() constant returns (uint _r) { return m_balances[msg.sender]; }
function coinBalanceOf(address _a) constant returns (uint _r) { return m_balances[_a]; }
function approve(address _a) {
m_approved[msg.sender][_a] = true;
}
function isApproved(address _proxy) constant returns (bool _r) { return m_approved[msg.sender][_proxy]; }
function isApprovedFor(address _target, address _proxy) constant returns (bool _r) { return m_approved[_target][_proxy]; }
function mine() {
uint r = block.number - m_lastNumberMined;
if (r > 0) {
m_balances[msg.sender] += 1000 * r;
m_balances[block.coinbase] += 1000 * r;
m_lastNumberMined = block.number;
}
}
function changeOwner(address _owner) { if(msg.sender==owner) owner = _owner; }
}
External Links
Related contracts
token
Same eraBare Homestead-era token (Mar 14 2016): public balanceOf mapping + a single unchecked transfer firing the standard Transfer event.
0xc77f06...494c69March 14, 2016DinastyCoinToken
Same eraHomestead-era transfer-only token, DinastyCoinToken (DCT), fixed supply 200000000 and 6 decimals.
0x3693fd...c11466March 14, 2016token
Same eraMinimal Homestead-era token shell (Mar 14 2016): just a public balanceOf mapping and its compiler-generated getter, with no other functions.
0x38e1da...41a81aMarch 14, 2016CampusCoin
Same eraByte-identical deployment of: Standard ethereum.org tutorial token (Homestead, Mar 2016): name/symbol/decimals metadata, a public balanceOf mapping and an overf
0x00f0b1...e6fcd2March 16, 2016Retch Mining Futures
Same eraBuy/sell token deployed by an early Ethermine miner 7 days after the Homestead fork, still active 10 years later.
0x9c2351...83e874March 21, 2016NetsCoin
Same eraThe ethereum.org 'advanced' MyToken (Homestead, Mar 2016): an issuer-minted token with mintToken, freezeAccount/FrozenFunds and the standard Transfer event.
0x1bf963...c9caabMarch 21, 2016