Back to Home
Unicorn Meat logo

Unicorn Meat(🍖)

Token
0xed6ac8de7c7c...2a1232ddef9a
HomesteadContract #13KSource VerifiedEdit this contract
Deployed March 25, 2016 (10 years ago)Block 1,211,142

A historic 2016 memecoin created by Alex Van de Sande of the Ethereum Foundation to pioneer token swaps and upgrades.

Token Information

Logo
Unicorn Meat logo
via RPC
Token Name
Unicorn Meat
Symbol
🍖
Decimals
3

Key Facts

Deployment Block
1,211,142
Deployment Date
Mar 25, 2016, 02:48 AM
Code Size
1.9 KB
Gas at Deploy
695,056
Transactions by Year
20167
20212
20259

Description

Launched in March 2016 as a playful experiment combining a token, a “grinder” mechanism (convert one token into another), and a proposal/voting system. The experiment famously demonstrated governance risk when control of the Unicorn Meat Grinder Association was taken via proposal shortly after launch; in 2025, control of the Unicorn Meat token was taken, supply was fixed at 100M, and the contract was renounced and wrapped for modern compatibility.

Unicorn Meat was introduced as an on-chain April Fool’s–style experiment: Unicorn holders could use the Unicorn Meat Grinder Association contract to “grind” Unicorns into Unicorn Meat, and governance/proposals could change how the system worked. Years later, the contract was claimed via the same governance path; 100M tokens were minted and the contract renounced, and wrapping was introduced to make it tradable on modern platforms.

Source Verified

Etherscan verified

Historian Categories

Token

Heuristic Analysis

The following characteristics were detected through bytecode analysis and may not be accurate.

Detected Type: Token
Has ERC-20-like patterns

Homestead Era

The first planned hard fork. Removed the canary contract, adjusted gas costs.

Block span: 1,150,000 — 1,919,999
March 14, 2016 — July 20, 2016

Bytecode Overview

Opcodes1,950
Unique Opcodes157
Jump Instructions98
Storage Operations55

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