Currency Coin Logo
CurrencyCoin
CurrencyCoin

A Precursor Prototype to the ERC-20 Standard

Discover the currency code that was referenced in the Wiki cited in the final ERC-20 standard, and the first coin based on the code committed by Vitalik Buterin on Sep 06, 2015, 2 days later a modified version was deployed to Ethereum by rfikki just 40 days after Ethereum's launch. A True Digital Collectible!

View Timeline
Blockchain Historical Society
Gitcoin
Protocol Guild
Giveth
ethOS
Collectible Trust
MIDAO
Blockchain Historical Society
Gitcoin
Protocol Guild
Giveth
ethOS
Collectible Trust
MIDAO

What is CurrencyCoin (CC)?

Verifiable Authorship

The on-chain contract is an modified implementation of the reference currency.sol file committed by Vitalik Buterin on Sep 06, 2015.

Deployed Sept. 8, 2015

Deployed just 40 days after Ethereum's launch, this contract is a verifiable relic from the mainnet's earliest "Frontier" era.

The Road to ERC-20

The EIP-20 proposal officially cites the contract's source repository, documenting its role as a direct building block to the standard.

A Unique Relic

The blockchain confirms its deployed bytecode is unique, establishing it as a unique on-chain artifact.

From an Ethereum Wiki to the World's ERC-20 Standard

In the chaotic early days of Ethereum, there was no standard for tokens. Developers were creating incompatible contracts, leading to ecosystem fragmentation.

Recognizing this, Vitalik Buterin initiated the Standardized_Contract_APIs repository on GitHub. This public workspace became the cited foundation for what would eventually become ERC-20. The process was collaborative; developers like Caktux and Simon de la Rouviere (Simondlr) and many others contributed ideas and code, debating function names like disapprove versus unapprove.

On September 6, 2015, Vitalik Buterin committed the Solidity version of currency.sol, which served as the initial code template used in discussions and cited in the Final ERC-20 Standard. Just two days later, on September 8, 2015, developer 'rfikki' deployed a modified version of this contract to the mainnet. This deployment became a live implementation of some of the earliest code examples by which currency.sol was used to later formalize the official EIP-20 proposal.

contract currency {

    struct Account {
        uint balance;
        mapping ( address => uint) withdrawers;
    }

    mapping ( address => Account ) accounts;

    event CoinSent(address indexed from, uint256 value, address indexed to);

    function currency() {
        accounts[msg.sender].balance = 1000000;
    }

    function sendCoin(uint _value, address _to) returns (bool _success) {
        if (accounts[msg.sender].balance >= _value && _value < 340282366920938463463374607431768211456) {
            accounts[msg.sender].balance -= _value;
            accounts[_to].balance += _value;
            CoinSent(msg.sender, _value, _to);
            _success = true;
        }
        else _success = false;
    }

    function sendCoinFrom(address _from, uint _value, address _to) returns (bool _success) {
        uint auth = accounts[_from].withdrawers[msg.sender];
        if (accounts[_from].balance >= _value && auth >= _value && _value < 340282366920938463463374607431768211456) {
            accounts[_from].withdrawers[msg.sender] -= _value;
            accounts[_from].balance -= _value;
            accounts[_to].balance += _value;
            CoinSent(_from, _value, _to);
            _success = true;
            _success = true;
        }
        else _success = false;
    }

    function coinBalance() constant returns (uint _r) {
        _r = accounts[msg.sender].balance;
    }

    function coinBalanceOf(address _addr) constant returns (uint _r) {
        _r = accounts[_addr].balance;
    }

    function approve(address _addr) {
        accounts[msg.sender].withdrawers[_addr] = 340282366920938463463374607431768211456;
    }

    function isApproved(address _proxy) returns (bool _r) {
        _r = (accounts[msg.sender].withdrawers[_proxy] > 0);
    }

    function approveOnce(address _addr, uint256 _maxValue) {
        accounts[msg.sender].withdrawers[_addr] += _maxValue;
    }

    function isApprovedOnceFor(address _target, address _proxy) returns (uint256 _r) {
        _r = accounts[_target].withdrawers[_proxy];
    }

    function disapprove(address _addr) {
        accounts[msg.sender].withdrawers[_addr] = 0;
    }
}

The original code, authored by Vitalik Buterin, committed on Sep 06, 2015

Buy CurrencyCoin ($CC)

Trade the historical collectible on-chain

All links are placeholders, and should not be taken as any indication of where CurrencyCoin will trade.

CurrencyCoin will go live shortly

Links to any and all exchanges will be listed here once trading begins.

Meanwhile, why not follow us on: CoinGecko

Frequently Asked Questions

CurrencyCoin Background

Another piece of on-chain history

Provided in cooperation with the Blockchain Historical Society