The Love token (W♥) - early Ethereum proof-of-work token from March 2016.
Historical Significance
One of the earliest Ethereum PoW mining tokens, pre-dating ERC-20.
Context
Deployed March 8, 2016 by 0xA2A4710d4e0F76f500582eeBeE7eBFe0Ea57A1E4. Source verified via exact bytecode match using soljson v0.2.0+commit.4dc2445e with optimizer enabled.
Token Information
Key Facts
Description
Love is the first proof-of-work ERC-20 token on Ethereum, deployed on March 8, 2016, just 8 months after mainnet launch. Miners submit nonces to solve a hash challenge, with difficulty adjusting based on time between proofs. Mining rewards scale with time elapsed, creating an inflationary but decelerating supply. The token uses the heart symbol as its ticker. It predates all other mineable tokens on Ethereum and represents one of the earliest experiments in on-chain proof-of-work token distribution.
Source Verified
Exact runtime bytecode match (1,853 bytes). Compiler: soljson v0.2.0+commit.4dc2445e, optimizer ON, runs 200. Also verified on Sourcify: https://repo.sourcify.dev/contracts/partial_match/1/0x45601D0497419Ec993552EF425927F08f73CE032/ (matchId 28209829, runtimeMatch: match, 2026-04-23).
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 (Solidity)
contract tokenRecipient {
function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData);
}
contract Love {
string public name;
string public symbol;
uint8 public decimals;
uint256 public currentChallenge;
uint256 public timeOfLastProof;
uint256 public difficulty;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
mapping(address => mapping(address => uint256)) public spentAllowance;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
function Love(string _name, string _symbol) {
balanceOf[msg.sender] = 0;
name = _name;
symbol = _symbol;
decimals = 0;
timeOfLastProof = now;
difficulty = 10**32;
}
function proofOfWork(uint256 nonce) {
bytes32 n = sha3(nonce, currentChallenge);
if (uint64(uint256(n) / 2**192) < uint64(difficulty)) throw;
uint256 timeSinceLastProof = now - timeOfLastProof;
difficulty = difficulty * 60 / timeSinceLastProof + 1;
timeOfLastProof = now;
currentChallenge = uint256(sha3(nonce, currentChallenge, block.blockhash(block.number)));
balanceOf[msg.sender] += timeSinceLastProof / 6;
}
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value) throw;
if (balanceOf[_to] + _value < balanceOf[_to]) throw;
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
Transfer(msg.sender, _to, _value);
}
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(_from, _to, _value);
return true;
}
function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) {
allowance[msg.sender][_spender] = _value;
tokenRecipient(_spender).receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}