Skip to content

cartoonitunes/awesome-ethereum-proofs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

180 Commits
 
 
 
 
 
 

Repository files navigation

Awesome Ethereum Proofs Awesome

Source code verification proofs for the earliest contracts on Ethereum (2015-2017), created through compiler archaeology and bytecode matching.

Each proof independently compiles the original source code with the exact compiler version used at deployment time, producing a byte-for-byte match against on-chain bytecode. These are contracts too old for Etherscan's automated verification tools.

Part of Ethereum History.

Proofs

Contract Deployed Compiler Method Proof
First Executable Contract Aug 7, 2015 (block 48,643) soljson v0.1.1 Exact bytecode match Repo
Greeter (Hello World!) Aug 7, 2015 (block 48,681) soljson v0.1.1 Exact bytecode match Repo
PrimeChecker Aug 7, 2015 (block 48,790) soljson v0.1.1 Exact bytecode match Repo
Greeter (0xcde4) Aug 7, 2015 (block 49,392) soljson v0.1.1 Exact bytecode match (creation TX) Repo
PrimeChecker (instance 2) Aug 7, 2015 (block 49,416) soljson v0.1.1 Exact bytecode match (identical to 0x66d796e7) Repo
PrimeChecker (instance 3) Aug 7, 2015 (block 49,618) soljson v0.1.1 Exact bytecode match (identical to 0x66d796e7) Repo
Coin (0xd958) Aug 7, 2015 (block 49,888) soljson v0.1.1 (optimizer OFF) Exact bytecode match Proof
MyScheme (1ETH) Aug 7, 2015 (block 49,924) soljson v0.1.1 (optimizer ON) Exact bytecode match Repo
EarlyChainLetter10ETH Aug 7, 2015 (block 49,931) soljson v0.1.1 Exact bytecode match Repo
EarlyChainLetterSmall Aug 7, 2015 (block 49,936) soljson v0.1.1 (optimizer ON) Exact bytecode match Repo
GlobalRegistrar (rank 19) Aug 13, 2015 (block 50,466) go-ethereum built-in (commit 83ee3944) Exact bytecode match (geth-embedded) Repo
MovieVoting (earlier) Aug 7, 2015 (block 51,112) soljson v0.1.1 (optimizer ON) Identical bytecode to rank 23 Proof
MovieVoting Aug 7, 2015 (block 51,128) soljson v0.1.1 (optimizer ON) Exact bytecode match Proof
GlobalRegistrar (rank 24) Aug 22, 2015 (block 51,245) go-ethereum built-in (commit 83ee3944) Identical bytecode to rank 19 Repo
SciFi Token Aug 8, 2015 (block 51,291) soljson v0.1.4 Exact bytecode match Repo
NameRegistry Aug 8, 2015 (block 52,426) soljson v0.1.1 (optimizer ON) Exact bytecode match Repo
MessageStore Aug 8, 2015 (block 53,573) soljson v0.1.1 (optimizer ON) Exact bytecode match Repo
EF Multisig Wallet Aug 8, 2015 (block 54,092) soljson v0.1.1 Exact bytecode match Repo
Coin (stub) Aug 8, 2015 (block 54,126) soljson v0.1.1 Exact bytecode match Repo
First Messaging Contract Aug 8, 2015 (block 54,969) solc v0.1.1 (native C++) Exact bytecode match (creation TX) Repo
Etherparty Aug 8, 2015 (block 55,345) soljson v0.1.1 Exact bytecode match Repo
SimpleStorage x4 Aug 8, 2015 (block 55,399) solc v0.1.1 (native C++) Exact bytecode match Repo
LotteryPrototype v1 Aug 8, 2015 (block 55,701) soljson v0.1.5 (optimizer ON) Source identified, size match, optimizer layout differs
Forwarder Aug 8, 2015 (block 56,406) soljson v0.1.1 Exact bytecode match Repo
LotteryPrototype v2 Aug 8, 2015 (block 57,060) soljson v0.1.5 (optimizer ON) Source identified, size match, optimizer layout differs
EarlyChainLetter100ETH Aug 9, 2015 (block 60,143) soljson v0.1.1 (optimizer ON) Exact bytecode match Repo
FunDistributor Aug 10, 2015 (block 62,632) soljson v0.1.1 Exact bytecode match Repo
Multiply7 Aug 10, 2015 (block 63,886) soljson v0.1.1 Exact bytecode match Repo
Multiply7 Aug 9, 2015 (block 66,173) soljson v0.1.1 Exact bytecode match Repo
EF Sub-Multisig Aug 7, 2015 (block 72,142) Serpent (ethereum/serpent) Exact bytecode match Repo
HonestDice Aug 12, 2015 (block 74,817) soljson v0.1.1 (optimizer ON) Exact bytecode match Repo
HonestDice (1 ETH) Aug 12, 2015 (block 75,008) soljson v0.1.1 (optimizer ON) Exact bytecode match Repo
Augur REP Crowdsale Aug 15, 2015 (block 88,090) Serpent (ethereum/serpent) Exact bytecode match Repo
Ethereum Multisig Wallet (EF Signer) Aug 20, 2015 (block 115,693) soljson v0.1.1 (optimizer ON) Exact bytecode match Repo
Pong (minimal) Sep 4, 2015 (block 185,494) soljson v0.1.1 (optimizer OFF) Exact bytecode match Proof
EthereumPyramid Sep 7, 2015 (block 198,362) soljson v0.1.1 Exact bytecode match Repo
Gamble Sep 15, 2015 (block 235,543) Serpent fd9b0b6 (2015-09-06) Exact bytecode match (creation TX) Repo
GetSet Sep 17, 2015 (block 247,715) soljson v0.1.1 (optimizer ON) Exact bytecode match Proof
Pool5x Sep 17, 2015 (block 249,403) soljson v0.1.1 (optimizer ON) Exact bytecode match Proof
Pool5x v2 Sep 17, 2015 (block 249,420) soljson v0.1.1 (optimizer ON) Exact bytecode match Proof
EF1 ABI Test (foo()) Sep 20, 2015 (block 261,486) solc 0.5.17 (Yul strict-assembly) Exact runtime bytecode match Repo
EF1 ABI Test (foo() v2) Sep 20, 2015 (block 261,486) solc 0.5.17 (Yul strict-assembly) Exact bytecode match Repo
EF1 ABI Test (bar(uint256)) Sep 20, 2015 (block 261,486) soljson v0.1.4 (no optimizer) Exact bytecode match Repo
InsurETH Sep 20, 2015 (block 262,936) soljson v0.1.1 (optimizer ON) Exact bytecode match Proof
Frontier Coin Sep 21, 2015 (block 271,040) soljson v0.1.1 (emscripten) Exact bytecode match Repo
radcoin Sep 22, 2015 (block 274,203) soljson v0.1.1 (emscripten) Exact bytecode match Repo
Coin (Solidity Tutorial) x83 Sep 26, 2015 solc v0.2.1 (native C++, optimizer ON) Exact bytecode match (83 siblings) Repo
Multiply7 Tutorial x120 Sep 22, 2015 (first seen) soljson v0.1.3+ (optimizer ON) Exact bytecode match (120 copies) Proof
ArbiterRegistry Sep 28, 2015 (block 301,954) Serpent e5a5f875 (Sep 26, 2015) Exact bytecode match Repo
Arbitration Sep 28, 2015 (block 303,316) Serpent e5a5f875 (Sep 26, 2015) Exact bytecode match (2 instances) Repo
HashReg Aug 7, 2015 (block 282,885) Pre-release Solidity (source from go-ethereum v1.0.0) Exact bytecode match Repo
TheLuckyOne Oct 8, 2015 (block 351,891) soljson v0.1.3 (no optimizer) Exact bytecode match (getter reorder proof) Repo
Logger Oct 1, 2015 (block 319,519) soljson v0.1.2 (no optimizer) Exact bytecode match Proof
ListLogs Oct 18, 2015 (block 401,300) Serpent (ethereum/serpent commit bc4ce59) Exact bytecode match Repo
Greeter v0.1.4 — 0xF0C5 Document Registry Oct 25, 2015 (block 450,706) soljson v0.1.4 (optimizer OFF) Exact bytecode match (1,346 copies) Proof
Fabian Token Oct 26, 2015 (block 443,423) soljson v0.1.5 (no optimizer) Source reconstructed Repo
MistCoin Nov 3, 2015 (block 483,325) Solidity (author-published) Author-published source Source
Coin (Tutorial) Nov 4, 2015 (block 490,501) Native C++ solc v0.1.6 (optimizer ON) Exact bytecode match Proof
Coin (Tutorial) Nov 4, 2015 (block 490,523) Native C++ solc v0.1.6 (optimizer ON) Exact bytecode match Proof
SmartShipp Dec 6, 2015 (block 648,566) soljson v0.1.7 (optimizer ON) Exact bytecode match (creation TX) Repo
Vitalik's Currency Token Nov 12, 2015 (block 531,071) Serpent @ f0b4128 Exact bytecode match Repo
Etherboard Nov 13, 2015 (block 536,195) soljson v0.1.5-v0.1.7 (optimizer ON) Exact bytecode match Repo
Greeter x111 Nov 20, 2015 solc v0.2.1 (native C++, optimizer ON) Exact bytecode match (111 siblings) Repo
Deadman Switch Nov 22, 2015 (block 580,469) Serpent (ethereum/serpent commit bc4ce59) Exact bytecode match Repo
Mist D.A.O. Dec 3, 2015 (block 635,909) soljson v0.1.5 (optimizer ON) Exact runtime bytecode match (3275 bytes) Repo
Coin Dec 13, 2015 (block 683,669) Native C++ solc (webthree-umbrella v1.1.2) Exact bytecode match Proof
Store Dec 15, 2015 (block 691,754) soljson v0.1.6 (optimizer ON) Exact bytecode match Proof
AdminCheck Dec 30, 2015 (block 732,572) soljson v0.1.6 (optimizer ON) Exact bytecode match Proof
AdminCheckV2 Dec 30, 2015 (block 732,635) soljson v0.1.6 (optimizer ON) Exact bytecode match Proof
Congress DAO (member-mapping) Dec 28, 2015 (block 762,632) soljson v0.1.7 (optimizer ON) Exact bytecode match Repo
Congress DAO (v3 simple) ×2 Dec 28, 2015 (blocks 762,770–771) soljson v0.1.7 (optimizer ON) Exact bytecode match Repo
Blockchain Congress Dec 28, 2015 (block 762,866) soljson v0.1.6 (optimizer ON) Exact bytecode match (creation TX + constructor args) Repo
Greeter Jan 2, 2016 (block 785,230) soljson v0.2.0 (optimizer ON) Exact bytecode match Proof
ShippingEscrow Jan 9, 2016 (block 821,894) soljson v0.1.5 (optimizer OFF) Exact bytecode match Proof
ShippingEscrow2 Jan 9, 2016 (block 822,661) soljson v0.1.5 (optimizer OFF) Exact bytecode match (2 identical clones) Proof
Classic Coin Jan 10, 2016 (block 826,605) solc v0.2.0 (native C++, optimizer ON) Exact bytecode match Repo
Basic Token (unoptimized) x138 Jan 16, 2016 solc v0.2.1 (native C++, optimizer OFF) Exact bytecode match (138 siblings) Repo
Doubler Jan 21, 2016 (block 883,117) solc v0.2.0 (native C++) Exact bytecode match Repo
King of the Ether Throne v0.3.0 Jan 23, 2016 (block 893,433) soljson v0.2.0 nightly 2016.1.20, optimizer OFF Exact bytecode match Repo
YoutubeViews Jan 25, 2016 (block 904,395) soljson v0.2.0 nightly (Jan 2016, optimizer ON) Source reconstructed Repo
Wallet Deposit/Collect x50 Feb 8, 2016 soljson v0.1.3 (optimizer OFF) Exact bytecode match (50 copies) Proof
Basic Token (optimized) x200 Feb 1, 2016 solc v0.2.1 (native C++, optimizer ON) Exact bytecode match (200 siblings) Repo
Random Feb 4, 2016 (block 951,171) soljson v0.1.6 (optimizer OFF) Exact bytecode match Proof
IPFSTest Feb 5, 2016 (block 958,095) soljson v0.2.0 (optimizer ON) Exact bytecode match Proof
King of the Ether Throne v0.4.0 Feb 6, 2016 (block 963,186) soljson v0.2.1 nightly 2016.2.3 (fad2d4df), optimizer ON Exact bytecode match Repo
Unicorns Token (0x1f75 / 0x59a2) Feb 11, 2016 (block 987,979) solc v0.1.1 native C++ (optimizer ON) Source reconstructed - exact block multiset match Proof
Unicorns Token (0x41a7) Feb 11, 2016 (block 988,807) solc v0.1.1 native C++ (optimizer ON) Source reconstructed - exact block multiset match Proof
Unicorns Token (0xe369 / 0xab15) Feb 11, 2016 (block 988,921) solc ~v0.1.2 (Mist snapshot, optimizer ON) Source reconstructed Proof
Bitnation Holon DAO Feb 17, 2016 (block 1,019,844) soljson v0.2.2 (optimizer ON) Exact bytecode match cartoonitunes/holon-dao-verification
BitnationShares (XBN) Feb 17, 2016 (block 1,019,907) soljson v0.2.2 (optimizer ON) Exact bytecode match cartoonitunes/bitnation-shares-verification
PiggyBank Feb 19, 2016 (block 1,026,739) soljson v0.1.1 (optimizer OFF) Exact bytecode match Proof
Doubler (0xc182) Feb 19, 2016 (block 1,028,387) soljson v0.2.1 (optimizer ON) Exact bytecode match Repo
DynamicPyramid Feb 23, 2016 (block 1,049,304) soljson-v0.2.0-nightly.2016.1.20+commit.67c855c5 (optimizer ON) Exact bytecode match Repo
Godlcoin (GOD) Feb 28, 2016 (block 1,074,263) soljson v0.1.7 (optimizer ON) Exact bytecode match Proof
Love (W♥) Mar 8, 2016 (block 1,117,697) Pre-soljson Solidity (EXP-based dispatch, compiler binary lost) ABI verified (13/13 selectors); exact bytecode match unachievable Repo
DinastyCoinToken Mar 14, 2016 (block 1,148,743) solc v0.2.0 (native C++, optimizer ON) Exact bytecode match Proof
Poker Chips (POKER) Mar 21, 2016 (block 1,192,284) solc v0.2.1 (native C++, optimizer ON) Exact bytecode match Repo
MeatConversionCalculator Mar 24, 2016 (block 1,211,128) soljson v0.2.1+commit.91a6b35f, optimizer ON Exact bytecode match Repo
MeatGrindersAssociation Mar 24, 2016 (block 1,211,176) soljson v0.2.1+commit.91a6b35f (optimizer ON) Exact bytecode match Repo
MKR v1 (Maker Governance Token) Mar 28, 2016 (block 1,233,109) soljson v0.3.2+commit.81ae2a78 (optimizer OFF) Exact bytecode match (factory-deployed; creation also matches) Repo
Meme Token Apr 13, 2016 (block 1,330,011) soljson v0.3.1 (optimizer ON) Exact bytecode match Proof
GavCoin Apr 26, 2016 (block 1,408,600) solc v0.3.1 Exact bytecode match Repo
DGX GoldTokenLedger Apr 2016 solc 0.3.6 --optimize-runs=1 Source reconstructed (44/44 selectors, all names confirmed by Digix CTO Anthony Eufemio; compiler+optimizer pinned by dispatcher prefix, gas stipend PUSH2 0x61da, and constant-optimizer multiplication trick) Repo
Mist Multisig Wallet (4088b, optimized) May 16, 2016 (block 1,528,964) solc v0.3.0 (optimizer ON) Exact bytecode match Repo
Token 0.1 (fixed transferFrom) x103 May 20, 2016 solc v0.2.1 (native C++, optimizer ON) Exact bytecode match (103 siblings) Repo
Mining Coin Jun 16, 2016 (block 1,718,272) soljson v0.3.3 (emscripten) Exact bytecode match Repo
ShapeShift Chain-Split Forwarder Jul 24, 2016 (block 1,951,734) solc v0.2.1–v0.3.5 (optimizer ON) Exact bytecode match Repo
ShapeShift Chain-Split Receiver Jul 26, 2016 (block 1,957,038) solc v0.2.1–v0.3.5 (optimizer ON) Exact bytecode match Repo
ShapeShift Chain-Split Receiver Jul 26, 2016 (block 1,957,039) solc v0.2.1–v0.3.5 (optimizer ON) Exact bytecode match Repo
ShapeShift Chain-Split Splitter Jul 26, 2016 (block 1,957,123) solc v0.2.1–v0.3.5 (optimizer ON) Exact bytecode match Repo
HugCoin Aug 23, 2016 (block 2,123,297) soljson v0.3.5 (optimizer ON) Exact bytecode match Repo
Moose Factory Sep 19, 2016 (block 2,284,575) Serpent 2.0.7 Exact bytecode match (4 trailing dead bytes stripped) Repo
SplitOnDeploy (0xa2af) Sep 30, 2016 (block 2,353,701) solc v0.4.4 (no optimizer) Exact bytecode match Repo
Exchange Deposit Forwarder v1 Oct 4, 2016 (block 2,375,846) solc v0.4.2 (optimizer OFF) Exact bytecode match Repo
Augur REP Crowdsale Oct 4, 2016 (block 2,378,196) Serpent develop @ bc4ce59 (Jun 2016) Exact bytecode match Repo
SplitOnDeploy (0xe0a6) Oct 30, 2016 (block 2,533,297) solc v0.4.4 (no optimizer) Exact bytecode match (identical to 0xa2af18e8) Repo
Receiver (0x6d81) Oct 30, 2016 (block 2,533,723) solc v0.4.4 (no optimizer) Exact bytecode match Repo
Receiver (0x117a) Oct 30, 2016 (block 2,533,760) solc v0.3.6 (no optimizer) Exact bytecode match Repo
Token Forwarder Oct 2016 (block 2,914,655) solc v0.4.2 (optimizer ON) Near-exact bytecode match Repo
Token Sweeper Feb 18, 2017 (block 3,203,394) solc v0.4.9 (no optimizer) Exact bytecode match Repo
SplitOnDeploy payable (0x15ba) Mar 31, 2017 (block 3,450,894) solc v0.4.9–0.4.11 (no optimizer) Near-exact bytecode match (swarm hash differs) Repo
UserWallet (Collector) Jun 2017 (block 3,806,458) solc v0.4.11 (optimizer ON) Near-exact bytecode match Repo
Curio Cards v2 (Cards 17-19) Jun 20, 2017 (block 3,902,090) solc v0.4.8 (optimizer OFF) Exact bytecode match Repo
EtherVote (stake-voice) Jul 10, 2017 (block 4,004,456) soljson v0.4.11 (optimizer OFF) Code match (CBOR hash differs) Proof
ShitToken (SHIT) Jul 23, 2017 (block 4,061,425) solc v0.4.11 (native Darwin/appleclang, optimizer ON, runs=1) Exact bytecode match (CBOR swarm hash differs) Repo
ShitToken (Website) Jul 23, 2017 (block 4,061,483) solc v0.4.11 (native Darwin/appleclang, optimizer ON, runs=1) Exact bytecode match (CBOR swarm hash differs) Repo
Peperium Series 2 Token Aug 2017 (block 4,210,431) solc v0.4.14 (optimizer OFF) Near-exact bytecode match Repo
Asteroid Token (ROID) Oct 24, 2017 (block 4,419,671) solc v0.4.15 (optimizer ON) Code match (CBOR hash differs) Repo
CryptoCats Pre-Launch Test (T1) Nov 11, 2017 (block 4,530,388) Solidity 0.4.18 (optimizer ON) Near-exact bytecode match Repo
CryptoCats Pre-Launch Test (T2) Nov 11, 2017 (block 4,532,036) Solidity 0.4.18 (optimizer OFF) Near-exact bytecode match (8137/8451, 96.3%) Repo
CKBirthBot Nov 28, 2018 (block 6,720,524) solc v0.4.17 (optimizer OFF) Exact bytecode match Repo
Exchange UserWallet (709k fleet) Jan 4, 2018 (block 4,850,028) solc v0.4.14–0.4.16 (optimizer ON, runs=200) Code match — 627 runtime bytes (709,039 siblings, most-deployed bytecode in Ethereum history) Repo
avsa ERC777 ReferenceToken Apr 5, 2018 (block 5,385,661) solc v0.4.21 (optimizer ON, runs=200) Near-exact match (1 byte) Repo

How It Works

  1. Bytecode analysis - Identify compiler patterns in the on-chain bytecode (constructor shape, memory allocation patterns, function selector dispatch)
  2. Source reconstruction - Reverse-engineer or locate the original source code from GitHub repos, gists, or archive.org
  3. Compiler matching - Try every compiler version from the deployment era until we get a byte-for-byte match
  4. Publication - Each proof is published as an open-source repo with a reproducible verification script

Notable Findings

  • Vitalik's Currency Token was compiled from currency.se (Serpent), not currency.sol (Solidity). The ethereum/dapp-bin repo had both implementations side by side. Vitalik confirmed on Reddit with "Nice find!"

  • First Executable Contract was compiled with soljson v0.1.1, the earliest available Solidity compiler release, just 8 days after Ethereum mainnet launch.

  • FunDistributor uses the private keyword for its internal payout() function - one of the earliest known uses of function visibility in a deployed contract. The keyword was supported in solc 0.1.1 but is rarely seen in contracts from this era. The original source was on Pastebin (expired); reconstructed entirely from on-chain bytecode.

  • Doubler contract required building a native C++ Solidity compiler from webthree-umbrella v1.1.2 to reproduce the exact bytecode. The JS soljson compiler produces functionally identical but bytecode-different output for pre-0.3.x contracts. The key insight: amount > this.balance (GT opcode) produces different bytecode than this.balance < amount (LT opcode), even though they're logically equivalent.

Why This Matters

Most contracts from 2015-2016 are unverified on Etherscan because:

  • The compiler versions are too old for automated tools
  • Some contracts used languages Etherscan doesn't support (Serpent, LLL)
  • Source code was never published or was lost

These proofs preserve the technical history of Ethereum's earliest smart contracts.

FunDistributor

Contract: 0x125b606c67e8066da65069652b656c19717745fa Deployed: August 10, 2015 (block 62,632) Compiler: soljson v0.1.1+commit.6ff4cd6 (optimizer disabled) SHA256: 29fef67c6a7d76329a7d3e7770a9b08ae7705553ad628b4347123be0e2fed3c5 Reddit: r/ethereum announcement

An early "king of the hill" behavioral economics experiment. Send >1% of the contract's balance via touch() to become the receiver. If nobody touches the contract for 200+ blocks, the current receiver gets 1/3 of the balance. The interval grows by 0.5% after each payout round.

Original source was hosted on Pastebin (expired). Reconstructed from on-chain bytecode.

Verified source code
contract FunDistributor {
    address receiver;
    uint lastBlock;
    uint touchInterval;

    function FunDistributor() {
        lastBlock = block.number;
        touchInterval = 200;
        receiver = msg.sender;
    }

    function touch() {
        payout();
        if (msg.value * 100 > this.balance) {
            receiver = msg.sender;
            lastBlock = block.number;
        } else {
            msg.sender.send(msg.value);
        }
    }

    function get_receiver() constant returns (address) {
        return receiver;
    }

    function get_target_block() constant returns (uint) {
        return lastBlock + touchInterval + 1;
    }

    function get_touch_interval() constant returns (uint) {
        return touchInterval;
    }

    function payout() private {
        if (block.number > lastBlock + touchInterval) {
            receiver.send(this.balance / 3);
            touchInterval = touchInterval + touchInterval / 200;
            lastBlock = block.number;
        }
    }
}

Verification notes:

  • The Reddit post claimed payout was 25% of the balance, but verified code shows this.balance / 3 (33.3%)
  • Uses the private keyword for payout(), which was supported in solc 0.1.1 but rarely seen in deployed contracts from this era
  • solc 0.1.1 evaluates binary expressions right-to-left: msg.value * 100 and 100 * msg.value produce different bytecode (operand push order matters for matching)

Contributing

Found source code for an early contract? Know the compiler version for an unverified 2015 contract? Open an issue or PR.

License

CC0 1.0 - Public domain.

Tools

  • Native C++ Solidity Compilers — Pre-built solc binaries for frontier-era bytecode archaeology. Required when soljson/npm builds produce close-but-not-exact matches.

About

Source code verification proofs for the earliest Ethereum contracts (2015-2017). Compiler archaeology and bytecode matching.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors