One of the earliest named tokens on Ethereum, and the first known to feature an animal identity and a public on-chain faucet.
Historical Significance
AyeAyeCoin is historically significant for introducing multiple patterns that later became common in Ethereum ecosystems. It is the earliest known example of an Ethereum token with an explicit animal theme, demonstrating that tokens could represent cultural or expressive concepts rather than purely technical abstractions. It is also the earliest known token to use a fully on-chain faucet for distribution, establishing a model for permissionless, participation-based issuance. These features appeared before token standards, marketplaces, or user-facing infrastructure existed, making the design notably forward-looking for its time.
Context
In August 2015, Ethereum developers were experimenting directly on mainnet using example code and informal documentation published by the Ethereum team. There were no established conventions for naming tokens, distributing supply, or signaling intent. Most early contracts were functional demonstrations rather than branded artifacts. AyeAyeCoin emerged from this environment as an unusual outlier, combining identity, distribution mechanics, and accessibility in a single contract. Although it attracted little attention at the time, its rediscovery years later highlighted how early Ethereum experimentation anticipated many patterns that would only become widespread much later in the ecosystem’s development.
Key Facts
Description
AyeAyeCoin was deployed on August 20, 2015, only weeks after Ethereum mainnet launched, by an early developer known as Linagee. The token was explicitly named and themed after the aye-aye, a species of lemur native to Madagascar, making it the first known Ethereum token to adopt a non-abstract, animal-based identity. The contract distributed a fixed supply of six million whole coins through a trustless on-chain faucet, allowing anyone to claim one coin per transaction until the supply was exhausted.
The token core is assembled from two contemporaneous Ethereum reference documents. The sendCoin function, CoinTransfer event, and constructor pattern are near-verbatim from the example token tutorial in the original Ethereum Frontier guide on ethereum.org (commit 9110e4a, August 5, 2015), with the balance mapping renamed from coinBalanceOf to coins but otherwise identical in logic. The coinBalance() and coinBalanceOf(address _addr) view functions match the proposed Currency standard published on the Standardized Contract APIs page of the Ethereum wiki as it stood between June and mid-August 2015, including the parameter name _addr. That wiki page was rewritten in late October 2015 around a new transfer/balanceOf/Transfer API, which would shortly evolve into ERC-20. Linagee was familiar with the tutorial source firsthand: twelve days before deploying AyeAyeCoin, on August 8, 2015, they submitted PR #118 against that tutorial file.
Beyond those reference sources, the contract adds a coinBeg() faucet that distributes one token per call from the owner’s supply, setInfo() and ayeAyeInfo() functions for on-chain metadata, and an explicit owner state variable initialized to the deployer in the constructor. Each faucet interaction returns a short message embedded in the contract, reinforcing the coin’s identity and human-readable character. Because the contract predates ERC-20, it does not conform to later interface expectations and requires a wrapper to interact with modern tooling.
Source Verified
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 on Etherscan.
Show source code (Solidity)
/* linagee was here */
contract ayeAyeCoin {
string info;
mapping (address => uint) public coins;
address owner;
event CoinTransfer(address sender, address receiver, uint amount);
uint initialCoins = 6000000; /* There will only ever be 6 million ayeAyeCoins */
/* Initializes contract with initial supply to creator */
function ayeAyeCoin() {
owner = msg.sender;
coins[owner] = initialCoins;
}
/* Info about coin */
function ayeAyeInfo() constant returns (string) {
return info;
}
/* send currency */
function sendCoin(address receiver, uint amount) returns(bool sufficient) {
if (coins[msg.sender] < amount) return false;
coins[msg.sender] -= amount;
coins[receiver] += amount;
CoinTransfer(msg.sender, receiver, amount);
return true;
}
/* get your balance */
function coinBalance() constant returns (uint amount) {
return coins[msg.sender];
}
/* get the balance of another account */
function coinBalanceOf(address _addr) constant returns (uint amount) {
return coins[_addr];
}
/* A primitive faucet. Love your citizens! */
function coinBeg() returns (string) {
if (coins[owner] >= 1) {
coins[owner]--;
coins[msg.sender]++;
return "ayeAyeCoin love! One coin for you!";
}
return "Sorry, the faucet has entirely run dry.";
}
function setInfo(string _info) {
if (msg.sender != owner) return;
info = _info;
}
}