One of the earliest named tokens on Ethereum, and the first known to feature an animal identity and a public on-chain faucet.
Key Facts
Description
The AyeAyeCoin contract combined several ideas that were uncommon at the time. It implemented a named fungible token before formal token standards existed, attached a recognizable theme to that token, and distributed it using a public faucet rather than preallocation or manual transfers. Each faucet interaction returned 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.
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.
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;
}
}