Back to Home

Love()

Token
0x45601d049741...7f08f73ce032
FrontierContract #12KSource VerifiedEdit this contract
Deployed March 8, 2016 (10 years ago)Block 1,117,697

The oldest mineable token on Ethereum, deployed March 2016 with a proof-of-work mining mechanism.

Token Information

Token Name
Love
Symbol
Decimals
0

Key Facts

Deployment Block
1,117,697
Deployment Date
Mar 8, 2016, 03:25 PM
Code Size
1.8 KB
Gas at Deploy
633,822
Transactions by Year
20165
202554

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

SolidityABI verified: all 13 function selectors computed from reconstructed source match the on-chain dispatcher. Exact bytecode match is not achievable — the contract was compiled with a pre-soljson-era Solidity compiler (uses EXP-based 2^224 selector dispatch rather than PUSH29) whose binary no longer exists publicly.
Compiler: pre-0.0

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.

Detected Type: Token
Has ERC-20-like patterns

Frontier Era

The initial release of Ethereum. A bare-bones implementation for technical users.

Block span: 01,149,999
July 30, 2015March 14, 2016

Bytecode Overview

Opcodes1,853
Unique Opcodes132
Jump Instructions80
Storage Operations47

Verified Source Available

This contract has verified source code.

View Verification Proof
Show 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;
    }
}

External Links