A 2025 wrapper for the Ethereum Foundation's 2016 Unicorn token, whose transfer function returns nothing and so breaks strict ERC-20 callers.
Historical Significance
This is the missing-return-value defect that later became famous through USDT, appearing here in a token from early 2016. It is the reason SafeERC20 and similar wrappers exist across the whole ecosystem. Unicorns shows the problem in its original habitat: a contract written when the standard was months old and the convention of returning a bool from transfer had not yet hardened into something every caller depends on.
Context
The Unicorn token dates to February 2016, when the Ethereum Foundation ran a donation drive and issued a Unicorn for each contribution to the tip jar. ERC-20 had been proposed the previous November and was still being interpreted differently by different authors. Tokens from this window are frequently correct in shape and wrong in detail, and a single missing return value is enough to put one out of reach of contracts written a few years later.
Token Information
Key Facts
Description
Wrapped Unicorns (w๐ฆ) was deployed on 10 November 2025 and wraps the Unicorns token from 11 February 2016, the token the Ethereum Foundation issued in exchange for donations to its tip jar. Its verified source references the original address directly, and it keeps the original's zero decimals.
Unicorns is an unusual case among the contracts wrapped here because it is nearly compliant. It has approve, transferFrom and allowance, so at a glance it looks like an ordinary ERC-20. The defect is in the signature rather than the set of functions: transfer(address,uint256) returns nothing at all, where the standard requires it to return a bool. Any contract holding a strict IERC20 interface decodes the empty return as a failure and reverts.
The original also carries freezeAccount and frozenAccount, letting its owner freeze balances, which is behaviour no modern venue assumes. The wrapper offers wrap and unwrap and issues a fully compliant token in its place.
Historian Categories
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Bytecode Overview
Verified Source Available
This contract has verified source code on Etherscan.
Show source code (Solidity)
{{
"language": "Solidity",
"sources": {
"contracts/WrappedUnicorns.sol": {
"content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/**\n * @title Wrapped Unicorns w๐ฆ\n * @notice A 1:1 ERC-20 wrapper for the historic 2016 Unicorns ๐ฆ token, \n * created by Alex Van de Sande for 2.014+ ETH donors of the FoudationTipJar.\n * @dev The original token remains at 0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7 and must be wrapped via `approve` and then `wrap`.\n*/\n\n// Interface to the original 2016 Unicorn token ๐ฆ\ninterface IUnicorns {\n function transferFrom(address from, address to, uint256 value) external;\n function transfer(address to, uint256 value) external;\n function balanceOf(address owner) external view returns (uint256);\n}\n\ncontract WrappedUnicorns {\n // --- Metadata ---\n string public constant name = \"Unicorns\";\n string public constant symbol = unicode\"w๐ฆ\";\n uint8 public constant decimals = 0;\n\n /// @notice Immutable reference to the original Unicorns token ๐ฆ\n IUnicorns public immutable unicorns;\n\n // --- ERC-20 storage ---\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n uint256 public totalSupply;\n\n // --- Events ---\n event Transfer(address indexed from, address indexed to, uint256 value);\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Wrapped(address indexed from, uint256 amount);\n event Unwrapped(address indexed to, uint256 amount);\n\n constructor() {\n unicorns = IUnicorns(0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7);\n }\n\n // ----------------------------\n // Wrap / Unwrap (core logic)\n // ----------------------------\n\n /// @notice Lock Unicorns and mint equivalent wrapped Unicorn tokens.\n /// @dev User must first call `approve(wrapper, amount)` on the Unicorn token.\n function wrap(uint256 amount) external {\n require(amount > 0, \"zero amount\");\n unicorns.transferFrom(msg.sender, address(this), amount);\n\n balanceOf[msg.sender] += amount;\n totalSupply += amount;\n\n emit Transfer(address(0), msg.sender, amount);\n emit Wrapped(msg.sender, amount);\n }\n\n /// @notice Burn wrapped Unicorn tokens to redeem the same number of Unicorns.\n function unwrap(uint256 amount) external {\n require(amount > 0, \"zero amount\");\n uint256 bal = balanceOf[msg.sender];\n require(bal >= amount, \"insufficient balance\");\n\n balanceOf[msg.sender] = bal - amount;\n totalSupply -= amount;\n\n unicorns.transfer(msg.sender, amount);\n\n emit Transfer(msg.sender, address(0), amount);\n emit Unwrapped(msg.sender, amount);\n }\n\n // ----------------------------\n // ERC-20 functions\n // ----------------------------\n\n function transfer(address to, uint256 amount) external returns (bool) {\n _transfer(msg.sender, to, amount);\n return true;\n }\n\n function approve(address spender, uint256 amount) external returns (bool) {\n allowance[msg.sender][spender] = amount;\n emit Approval(msg.sender, spender, amount);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n uint256 allowed = allowance[from][msg.sender];\n require(allowed >= amount, \"allowance exceeded\");\n if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;\n _transfer(from, to, amount);\n return true;\n }\n\n function _transfer(address from, address to, uint256 amount) internal {\n require(to != address(0), \"transfer to zero\");\n uint256 bal = balanceOf[from];\n require(bal >= amount, \"insufficient balance\");\n\n balanceOf[from] = bal - amount;\n balanceOf[to] += amount;\n emit Transfer(from, to, amount);\n }\n\n // ----------------------------\n // Block accidental ETH sends\n // ----------------------------\n receive() external payable { revert(); }\n fallback() external payable { revert(); }\n}\n"
}
},
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
}}