The deployer's second Penis token contract from October 2017, with standard ERC-20 function names, the symbol SIM and a 10,000 SIM airdrop per new address.
Context
Before 2026 the contract recorded four Transfer events: one in December 2017, one in February 2018 and two in 2019. On 7 November 2026, single-use claimer addresses collected the remaining airdrops and the supply reached the 100,000,000.00 SIM cap.
The deployer is the same address that created 0x63A054d9F1886555B794Fe8C0d3305454c5a442D and 0xce853db3359326dB6D03981C9fb42983BbCdd007, and that registered PNS in the Parity token registry. See those contracts for the project's website and GitHub history.
Token Information
Key Facts
Description
Penis (SIM) is a token contract deployed on 17 October 2017, 16 minutes after the deployer's first version of the PNS token (0x63A054d9F1886555B794Fe8C0d3305454c5a442D). It keeps that contract's logic but uses the standard ERC-20 function names (totalSupply, balanceOf, transfer, transferFrom, approve, allowance), plus balance() for the caller's own balance. The token name is still Penis and the symbol is SIM.
The airdrop works the same way with smaller numbers. Any address that has never interacted with the contract reports a balance of 10,000.00 SIM, written to storage on its first transfer. The constructor minted 10,000,000.00 SIM to the deployer, and airdrops stop at a cap of 100,000,000.00 SIM.
Five minutes later the deployer created 0xce853db3359326dB6D03981C9fb42983BbCdd007, which has the same code with the symbol PNS and the first version's larger airdrop and cap. That contract became the PNS token the project promoted.
Source Verified
solc 0.4.8+commit.60cc1668, optimizer on, 200 runs. Runtime and creation code identical to the chain; only the 32-byte bzzr0 metadata hash differs. The source is the verified source of 0xce853db3359326dB6D03981C9fb42983BbCdd007 with the symbol and three constants changed to match this contract's creation code: airdrop 1000000, cap multiplier 10000, deployer mint multiplier 1000. The optimizer folds the cap into a single constant, so the cap expression cannot be told apart from a literal. Names and comments are taken from 0xce853db3359326dB6D03981C9fb42983BbCdd007.
Byzantium Era
First Metropolis hard fork. Added zk-SNARK precompiles, REVERT opcode, and staticcall.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology (near-exact bytecode match).
Show source code (Solidity)
// Submitted by EthereumHistory (ethereumhistory.com)
pragma solidity ^0.4.8;
contract ERC20Interface {
function totalSupply() public constant returns (uint256 supply);
function balance() public constant returns (uint256);
function balanceOf(address _owner) public constant returns (uint256);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
function allowance(address _owner, address _spender) public constant returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
// penispenispenispenis
// YOU get a penis, and YOU get a penis, and YOU get a penis!
contract Penis is ERC20Interface {
string public constant symbol = "SIM";
string public constant name = "Penis";
uint8 public constant decimals = 2;
uint256 _totalSupply = 0;
uint256 _airdropAmount = 1000000;
uint256 _cutoff = _airdropAmount * 10000;
mapping(address => uint256) balances;
mapping(address => bool) initialized;
// Penis accepts request to tip-touch another Penis
mapping(address => mapping (address => uint256)) allowed;
function Penis() {
initialized[msg.sender] = true;
balances[msg.sender] = _airdropAmount * 1000;
_totalSupply = balances[msg.sender];
}
function totalSupply() constant returns (uint256 supply) {
return _totalSupply;
}
// What's my girth?
function balance() constant returns (uint256) {
return getBalance(msg.sender);
}
// What is the length of a particular Penis?
function balanceOf(address _address) constant returns (uint256) {
return getBalance(_address);
}
// Tenderly remove hand from Penis and place on another Penis
function transfer(address _to, uint256 _amount) returns (bool success) {
initialize(msg.sender);
if (balances[msg.sender] >= _amount
&& _amount > 0) {
initialize(_to);
if (balances[_to] + _amount > balances[_to]) {
balances[msg.sender] -= _amount;
balances[_to] += _amount;
Transfer(msg.sender, _to, _amount);
return true;
} else {
return false;
}
} else {
return false;
}
}
// Perform the inevitable actions which cause release of that which each Penis
// is built to deliver. In EtherPenisLand there are only Penises, so this
// allows the transmission of one Penis's payload (or partial payload but that
// is not as much fun) INTO another Penis. This causes the Penisae to change
// form such that all may see the glory they each represent. Erections.
function transferFrom(address _from, address _to, uint256 _amount) returns (bool success) {
initialize(_from);
if (balances[_from] >= _amount
&& allowed[_from][msg.sender] >= _amount
&& _amount > 0) {
initialize(_to);
if (balances[_to] + _amount > balances[_to]) {
balances[_from] -= _amount;
allowed[_from][msg.sender] -= _amount;
balances[_to] += _amount;
Transfer(_from, _to, _amount);
return true;
} else {
return false;
}
} else {
return false;
}
}
// Allow splooger to cause a payload release from your Penis, multiple times, up to
// the point at which no further release is possible..
function approve(address _spender, uint256 _amount) returns (bool success) {
allowed[msg.sender][_spender] = _amount;
Approval(msg.sender, _spender, _amount);
return true;
}
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
return allowed[_owner][_spender];
}
// internal privats
function initialize(address _address) internal returns (bool success) {
if (_totalSupply < _cutoff && !initialized[_address]) {
initialized[_address] = true;
balances[_address] = _airdropAmount;
_totalSupply += _airdropAmount;
}
return true;
}
function getBalance(address _address) internal returns (uint256) {
if (_totalSupply < _cutoff && !initialized[_address]) {
return balances[_address] + _airdropAmount;
}
else {
return balances[_address];
}
}
}