The first deployment of GavCoin, potentially by Gavin Wood himself.
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; }
}