Early puzzle token experiment with a fun name and unique supply mechanics.
Historical Significance
One of the first meme coins with public minting and public supply control.
Context
On April 13, 2016, 13-year-old Matt Beton deployed a small, 0-decimal token contract named Meme. Because he could not buy crypto at his age, he mined ETH on a GTX 970 to experiment on mainnet. The token name was inspired by a close friend who was obsessed with memes and had even built a meme-sharing social platform, so Meme became, by name and intent, one of the earliest true meme coins.
Matt minted 257 tokens and turned to other things in life.
The story comes full circle, as he is now a Masters graduate in Mathematics from Queens College, Cambridge.
Back in 2016, a code snipped of the rewardMathGeniuses() function could be found on ethereum.org, yet it only made it on-chain twice. Once in 2016 and again in 2017.
Token Information
Key Facts
Description
Minting was gated behind an on-chain riddle: rewardMathGeniuses() dispenses one 0-decimal token if you submit the exact cube root of the current challenge. However, submitting a non-perfect cube as nextChallenge, mints a final token and locks the supply forever.
Sadly, the symbol() function does not return a ticker symbol.
Nine years after deployment, tschoerv unearthed the contract and hard-capped the total supply at 690,420 tokens.
Source Verified
Exact bytecode match (init + runtime). Runtime: 901 bytes. Creation: 1256 bytes init + 192 bytes args. Based on ethereum.org token tutorial with owned inheritance, address centralMinter param, and rewardMathGeniuses cubic root puzzle. soljson v0.2.2 through v0.3.2 all produce identical output.
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 through compiler archaeology and exact bytecode matching.
View Verification ProofShow source code (Solidity)
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 MyToken is owned {
/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
/* Public variables of the token */
string public name;
string public symbol;
uint8 public decimals;
uint currentChallenge = 1;
/* This generates a public event on the blockchain that will notify clients */
event Transfer(address indexed from, address indexed to, uint256 value);
/* Initializes contract with initial supply tokens to the creator of the contract */
function MyToken(
uint256 initialSupply,
string tokenName,
uint8 decimalUnits,
address centralMinter
) {
if(centralMinter != 0 ) owner = msg.sender;
balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens
name = tokenName; // Set the name for display purposes
decimals = decimalUnits; // Amount of decimals for display purposes
}
/* Send coins */
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value || balanceOf[_to] + _value < balanceOf[_to]) throw;
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
}
function rewardMathGeniuses(uint answerToCurrentReward, uint nextChallenge) {
if (answerToCurrentReward**3 != currentChallenge) throw; // If answer is wrong do not continue
balanceOf[msg.sender] += 1; // Reward the player
currentChallenge = nextChallenge; // Set the next challenge
}
}