A token created by the Ethereum Foundation's Alex Van de Sande (avsa) in March 2016 to demonstrate on-chain token swaps, upgrades, and quadratic voting.
Historical Significance
Unicorn Meat was created through the Grinder Association DAO, which allowed Unicorn holders to grind their Unicorns into Unicorn Meat. The DAO demonstrated quadratic voting, token swaps, and token mutations, all in 2016. Only 7 Unicorns have ever been ground, producing approximately 9,000 Unicorn Meat tokens. In April 2016, core developer Piper Merriam passed a DAO proposal to seize control and take 5 ETH, creating one of Ethereum's earliest governance incidents.
Context
In February 2016, the Ethereum Foundation launched a fundraising initiative. avsa deployed the Foundation TipJar and Unicorns, a 0-decimal non-standard ERC-20. Donating 2.014 ETH to the TipJar minted 1 Unicorn. Only 2,717 were ever created. A month later, avsa deployed the Unicorn Meat Grinder Association DAO, allowing Unicorn holders to convert their Unicorns into Unicorn Meat, a 3-decimal non-standard ERC-20. Ethereum officially announced the project on Twitter. During The DAO hack in June 2016, avsa cited the Grinder as helpful context for understanding DAO governance failures. In July 2025, a holder repeated Piper's move: passed a proposal, transferred ownership, minted 100 million tokens, renounced the contract, and wrapped it for trading.

Ethereum Announcement
Source: X
Token Information
Key Facts
Description
Unicorn Meat is a 3-decimal non-standard ERC-20 deployed by Alex Van de Sande (avsa) in March 2016. avsa was one of the original Ethereum Foundation developers who helped launch mainnet in July 2015. He previously created MistCoin with Fabian Vogelsteller in November 2015.
The token was produced through the Grinder Association DAO, which accepted Unicorns and output Unicorn Meat. The DAO included quadratic voting and token mutation mechanics. Piper Merriam's governance takeover a week after launch became early Ethereum lore.
In July 2025, webtrue.eth repeated the takeover, minted 100 million tokens, renounced the contract, and wrapped it as an ERC-20 for trading. The wrapped contract has no admin keys.
Source Verified
Historian Categories
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Homestead Era
The first planned hard fork. Removed the canary contract, adjusted gas costs.
Bytecode Overview
Verified Source Available
Source verified on Etherscan.
Show source code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2017-05-18
*/
/*
Verification submitted to etherscan.io by Noel Maersk
Source with full comments: https://gist.github.com/alexvandesande/3abc9f741471e08a6356#file-unicorn-meat-token
*/
contract owned {
address public owner;
function owned() {
owner = msg.sender;
}
modifier onlyOwner {
if (msg.sender != owner) throw;
_
}
function transferOwnership(address newOwner) onlyOwner {
owner = newOwner;
}
}
contract tokenRecipient {
function receiveApproval(address _from, uint256 _value, address _token);
}
contract MyToken is owned {
/* Public variables of the token */
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;
/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
mapping (address => bool) public frozenAccount;
mapping (address => mapping (address => uint256)) public allowance;
mapping (address => mapping (address => uint256)) public spentAllowance;
/* This generates a public event on the blockchain that will notify clients */
event Transfer(address indexed from, address indexed to, uint256 value);
event FrozenFunds(address target, bool frozen);
/* Initializes contract with initial supply tokens to the creator of the contract */
function MyToken(
uint256 initialSupply,
string tokenName,
uint8 decimalUnits,
string tokenSymbol,
address centralMinter
) {
if(centralMinter != 0 ) owner = msg.sender; // Sets the minter
balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens
name = tokenName; // Set the name for display purposes
symbol = tokenSymbol; // Set the symbol for display purposes
decimals = decimalUnits; // Amount of decimals for display purposes
totalSupply = initialSupply;
}
/* Send coins */
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough
if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
if (frozenAccount[msg.sender]) throw; // Check if frozen
balanceOf[msg.sender] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place
}
/* Allow another contract to spend some tokens in your behalf */
function approveAndCall(address _spender, uint256 _value) returns (bool success) {
allowance[msg.sender][_spender] = _value;
tokenRecipient spender = tokenRecipient(_spender);
spender.receiveApproval(msg.sender, _value, this);
return true;
}
/* A contract attempts to get the coins */
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
if (balanceOf[_from] < _value) throw; // Check if the sender has enough
if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
if (spentAllowance[_from][msg.sender] + _value > allowance[_from][msg.sender]) throw; // Check allowance
balanceOf[_from] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
spentAllowance[_from][msg.sender] += _value;
Transfer(_from, _to, _value);
return true;
}
/* This unnamed function is called whenever someone tries to send ether to it */
function () {
throw; // Prevents accidental sending of ether
}
function mintToken(address target, uint256 mintedAmount) onlyOwner {
balanceOf[target] += mintedAmount;
totalSupply += mintedAmount;
Transfer(0, owner, mintedAmount);
Transfer(owner, target, mintedAmount);
}
function freezeAccount(address target, bool freeze) onlyOwner {
frozenAccount[target] = freeze;
FrozenFunds(target, freeze);
}
}External Links
Wrapped as
Later contracts that represent this one. Holding one of these counts as holding the original on a collector card.
Related contracts
Association (Mist D.A.O.)
Same deployerA token-weighted governance contract deployed by Avsa on Dec 3, 2015, using MistCoin as voting shares. 0.1 ETH remains locked after 10 years.
0x8d554c...d9b8dcDecember 3, 2015Congress
Same deployerAlex Van de Sande's Congress DAO from Dec 28, 2015: on-chain voting with member registry (mapping) and configurable quorum.
0xb3d47f...7c6c0cDecember 28, 2015Congress
Same deployerAlex Van de Sande's Congress DAO from Dec 28, 2015: on-chain voting system for proposals with configurable quorum and majority threshold.
0x7f6b46...03f101December 28, 2015Congress
Same deployerAlex Van de Sande's Congress DAO from Dec 28, 2015: on-chain voting system for proposals with configurable quorum and majority threshold.
0x1e5cbb...b7ff63December 28, 2015Congress
Same deployerA Congress DAO from the ethereum.org tutorial, deployed 28 December 2015, 23 minutes before the tutorial revision it came from was published.
0xe8e80d...4ed2daDecember 28, 2015Doge-ETH Bounty DAO
Same deployerThe Doge-Ethereum Bounty DAO created by avsa on Dec 28, 2015. Funded over 5,400 ETH in bridge development, holds 50,000 MistCoin. Active 2015-2021.
0xdbf03b...c8c6fbDecember 28, 2015