EsseChain (ESSE) is an ERC-20 token launched on Ethereum in October 2018 that distributed its 3-billion supply through an open on-chain claim function.
Historical Significance
EsseChain (ESSE) is an ERC-20 token deployed to Ethereum mainnet on October 22, 2018, during the busy 2017–2018 wave of new Ethereum tokens. It has a fixed supply of 3 billion ESSE (8 decimals). Instead of running an ICO, EsseChain distributed its supply through an open, on-chain claim: any address could call the contract’s distribution function to receive a fixed allotment of tokens directly to its wallet, with the remainder allocated at deployment. This “free distribution” or airdrop-style model was a popular way for projects of the period to seed an initial holder base and community without a sale.
Like many launches in this window, EsseChain’s contract is built on the widely-shared SiaCashCoin free-distribution template — a commonly reused codebase for claim-based tokens at the time — adapted with EsseChain’s own name, symbol, supply, and distribution parameters (including an 8-decimal denomination and a custom per-claim schedule). Building on established, shared token code was, and remains, ordinary practice across the ERC-20 ecosystem.
One detail of that lineage survives in the deployed bytecode and aided verification: the contract kept an older-style function named SiaCashCoin() carried over from the template. In Solidity 0.4.x a function acts as the constructor only when its name exactly matches the contract, so after the rename this function remained as a regular public method in the runtime (selector 0x9a4b19e4). Ethereum History used the full bytecode to reconstruct and verify EsseChain’s source (near-exact match, solc 0.4.25). On-chain, EsseChain’s distribution has since completed and its claim function is now closed, leaving it as a small, self-contained record of the late-2018 claim-token era.
Token Information
Key Facts
Description
EsseChain (ESSE) is an ERC-20 token deployed to Ethereum mainnet on October 22, 2018. It has a fixed supply of 3 billion ESSE and distributed tokens through an open, on-chain claim function — an airdrop-style “free distribution” model in which participants called the contract directly to receive a fixed allotment rather than buying into a sale. It dates from the active late-2018 period of claim-based Ethereum token launches.
Source Verified
EsseChain (ESSECHAIN/ESSE), Oct 22 2018 ERC-20 free-distribution airdrop token. A renamed copy of the verified SiaCashCoin airdrop template (0x74FD51a9...). Compiled with solc v0.4.25, optimizer ON, 200 runs: the deployed runtime bytecode matches on-chain byte-for-byte; only the trailing bzzr0 swarm/metadata hash differs (original source text not recovered) -> near_exact_match. Differs from SiaCashCoin only in name/symbol, decimals=8, the post-claim guard (toGive>1), and the per-claim decay div/mul(3333333). The contract was renamed to ESSECHAIN but its old-style constructor was left named SiaCashCoin(), so it is a callable public function in the runtime (selector 0x9a4b19e4) — the copy-paste artifact that identified the template lineage. Verified on Sourcify 2026-07-25 (runtime match) at https://sourcify.dev/#/lookup/0x4c65f9d41d367cb8f6d4810588d50fb397f6f6f4 ; also propagated to Routescan and Blockscout. VERIFIED ON ETHERSCAN 2026-07-25 (with EH attribution; Etherscan tolerates the swarm-hash diff as a partial match).
Historian Categories
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
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).
View Verification ProofShow source code (Solidity)
// Submitted by EthereumHistory (ethereumhistory.com)
pragma solidity ^0.4.22;
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a / b;
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract ForeignToken {
function balanceOf(address _owner) constant public returns (uint256);
function transfer(address _to, uint256 _value) public returns (bool);
}
contract ERC20Basic {
uint256 public totalSupply;
function balanceOf(address who) public constant returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public constant returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface Token {
function distr(address _to, uint256 _value) external returns (bool);
function totalSupply() constant external returns (uint256 supply);
function balanceOf(address _owner) constant external returns (uint256 balance);
}
contract ESSECHAIN is ERC20 {
using SafeMath for uint256;
address owner = msg.sender;
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
mapping (address => bool) public blacklist;
string public constant name = "ESSECHAIN";
string public constant symbol = "ESSE";
uint public constant decimals = 8;
uint256 public totalSupply = 3000000000e8;
uint256 public totalDistributed = 1600000000e8;
uint256 public totalRemaining = totalSupply.sub(totalDistributed);
uint256 public value = 150000e18;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
event Distr(address indexed to, uint256 amount);
event DistrFinished();
event Burn(address indexed burner, uint256 value);
bool public distributionFinished = false;
modifier canDistr() {
require(!distributionFinished);
_;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
modifier onlyWhitelist() {
require(blacklist[msg.sender] == false);
_;
}
function SiaCashCoin() public {
owner = msg.sender;
balances[owner] = totalDistributed;
}
function transferOwnership(address newOwner) onlyOwner public {
if (newOwner != address(0)) {
owner = newOwner;
}
}
function finishDistribution() onlyOwner canDistr public returns (bool) {
distributionFinished = true;
emit DistrFinished();
return true;
}
function distr(address _to, uint256 _amount) canDistr private returns (bool) {
totalDistributed = totalDistributed.add(_amount);
totalRemaining = totalRemaining.sub(_amount);
balances[_to] = balances[_to].add(_amount);
emit Distr(_to, _amount);
emit Transfer(address(0), _to, _amount);
return true;
if (totalDistributed >= totalSupply) {
distributionFinished = true;
}
}
function () external payable {
getTokens();
}
function getTokens() payable canDistr onlyWhitelist public {
if (value > totalRemaining) {
value = totalRemaining;
}
require(value <= totalRemaining);
address investor = msg.sender;
uint256 toGive = value;
distr(investor, toGive);
if (toGive > 1) {
blacklist[investor] = true;
}
if (totalDistributed >= totalSupply) {
distributionFinished = true;
}
value = value.div(3333333).mul(3333333);
}
function balanceOf(address _owner) constant public returns (uint256) {
return balances[_owner];
}
modifier onlyPayloadSize(uint size) {
assert(msg.data.length >= size + 4);
_;
}
function transfer(address _to, uint256 _amount) onlyPayloadSize(2 * 32) public returns (bool success) {
require(_to != address(0));
require(_amount <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_amount);
balances[_to] = balances[_to].add(_amount);
emit Transfer(msg.sender, _to, _amount);
return true;
}
function transferFrom(address _from, address _to, uint256 _amount) onlyPayloadSize(3 * 32) public returns (bool success) {
require(_to != address(0));
require(_amount <= balances[_from]);
require(_amount <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_amount);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_amount);
balances[_to] = balances[_to].add(_amount);
emit Transfer(_from, _to, _amount);
return true;
}
function approve(address _spender, uint256 _value) public returns (bool success) {
if (_value != 0 && allowed[msg.sender][_spender] != 0) { return false; }
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) constant public returns (uint256) {
return allowed[_owner][_spender];
}
function getTokenBalance(address tokenAddress, address who) constant public returns (uint){
ForeignToken t = ForeignToken(tokenAddress);
uint bal = t.balanceOf(who);
return bal;
}
function withdraw() onlyOwner public {
uint256 etherBalance = address(this).balance;
owner.transfer(etherBalance);
}
function burn(uint256 _value) onlyOwner public {
require(_value <= balances[msg.sender]);
address burner = msg.sender;
balances[burner] = balances[burner].sub(_value);
totalSupply = totalSupply.sub(_value);
totalDistributed = totalDistributed.sub(_value);
emit Burn(burner, _value);
}
function withdrawForeignTokens(address _tokenContract) onlyOwner public returns (bool) {
ForeignToken token = ForeignToken(_tokenContract);
uint256 amount = token.balanceOf(address(this));
return token.transfer(owner, amount);
}
}
External Links
Related contracts
Asteroid
Same eraERC20 token built on OpenZeppelin v1.3.0 with owner-restricted burn function. Deployed during the 2017-2018 ICO era.
0xd86e37...474375October 24, 2017CRYPTOCTEST
Same eraCryptoCats pre-launch test contract (Nov 2017). The first version to introduce cat names and the allInitialOwnersAssigned() initialization pattern.
0xd23ade...718456November 11, 2017Contract 0x000141...106902
Same eraExchange deposit wallet (UserWallet). Owner-only ETH collection and ERC-20 token sweeping with Deposit event logging.
0x000141...106902December 13, 20170xBitcoin
Same eraThe original EIP-918 mineable token, Bitcoin's proof-of-work on Ethereum
0xb6ed76...405b31February 6, 20180xDOGE Token
Same eraFirst 0xBitcoin clone, deployed 10 days after 0xBTC. Permanently bricked after 12 mints by a reward dust term and a recursive era-cap bug.
0x0d8bb9...f4e7a9February 16, 20180xLitecoin
Same eraFirst mineable Litecoin on Ethereum, EIP-918 clone deployed April 2018
0x1e2800...560ee0April 14, 2018