The oldest mineable token on Ethereum, deployed March 2016 with a proof-of-work mining mechanism.
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 by years and represents one of the earliest experiments in on-chain proof-of-work token distribution.
Source Verified
Source reconstructed from bytecode. All 13 function selectors verified via keccak256. Exact compiler binary unavailable: uses EXP-based selector dispatch (PUSH1 0xe0, PUSH1 0x02, EXP = 2^224), not found in any solc build from 0.0.9.27 (Jun 25, 2015) onward. Every available native build (50+ binaries from 0.0.8.2 through 0.3.6) uses PUSH29. The 4-byte hash dispatch with EXP pattern was never merged to the public webthree-umbrella develop branch — compiler was from a private build circa Jan-Jun 2015.
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
This contract has verified source code.
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;
}
}