On-chain governance contract with proposals, voting, and execution. Stripped-down version of the go-ethereum wiki Democracy DAO tutorial.
Historical Significance
A 10-deploy DAO-mechanism iteration test from September 24, 2015 — eight months before TheDAO went live. Implements the proposals + debatingPeriod + founder + quorum-vote pattern that TheDAO eventually shipped, at the much smaller 2.3 KB scale of a single-contract test. Deployer 0x7931c901 ran 35 such experiments through Q3-Q4 2015 with no known public attribution.
Context
Deployer 0x7931c90100285910556fd3c6406942995930ad34 first appears on mainnet on August 25, 2015 (Frontier was three weeks old) and runs through December 3, 2015. Across that window the address deploys 35 contracts that cluster cleanly into three size buckets: 4 deploys at 3,764 bytes (the largest, earliest variants), 2 deploys at 3,097 bytes (a middle iteration), and 10 deploys at 2,343 bytes all in a roughly 40-minute window on September 24 between 15:00 and 15:39 UTC. The 2,343-byte cluster (this one) is the tightest and largest burst.
TheDAO went live on April 30, 2016 — eight months later — and was attacked on June 17, 2016. The hard fork that split Ethereum and Ethereum Classic followed on July 20, 2016. The mechanism this proto-DAO test implements — proposals stored in a packed array, vote(uint, int8) for +/-/0 with one-vote-per-address tracked in a uint8 bitmap, executeProposal when quorum and time conditions met, kill() restricted to founder — is the exact shape Christoph Jentzsch's later TheDAO followed at a much larger 10-12 KB scale. Whether deployer 0x7931c901 was a Slock.it precursor, an Ethereum Foundation researcher, or an independent contributor remains undetermined in public archives.
Key Facts
Description
A hand-stripped fork of the Ethereum Foundation Democracy DAO from the go-ethereum wiki contract tutorial. It implements proposals, voting, and a debating period with quorum tallying. The deployer removed the token-balance membership gates and the recipient.call execution step from the wiki version, repurposed voterShare from a token address to a plain uint vote weight, and reduced executeProposal to a tally that emits ProposalTallied. Compiled with soljson v0.1.1 (optimizer ON) to a 2,244-byte runtime that matches the on-chain code byte for byte. One of 10 byte-identical sibling deployments (chronological rank 1528 to 1537).
Source Verified
Runtime bytecode reproduced exactly with soljson v0.1.1+commit.6ff4cd6, optimizer ON, via the legacy compile(source, 1) API. The trailing STOP byte before the appended keccak256(3) data constant is emitted only by v0.1.1, which pins the compiler version. External verification (2026-06-28): Etherscan verified with v0.1.1+commit.6ff4cd6, optimizer ON; the displayed source carries the EthereumHistory attribution line. Sourcify cannot verify this contract: it returns unsupported_compiler_version for v0.1.1 because the Sourcify compiler service cannot run the v0.1.1 build. Later compilers that Sourcify does run (v0.1.5 and up) do not reproduce this bytecode, which is pinned to v0.1.1 by the trailing STOP byte.
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Frontier Era
The initial release of Ethereum. A bare-bones implementation for technical users.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology and exact bytecode matching.
View Verification ProofShow source code (Solidity)
// Submitted by EthereumHistory (ethereumhistory.com)
contract Democracy {
uint public debatingPeriod;
uint public voterShare;
address public founder;
Proposal[] public proposals;
uint public numProposals;
uint minimumQuorum;
event ProposalAdded(uint proposalID, address recipient, uint amount, bytes32 data, string description);
event Voted(uint proposalID, int position, address voter);
event ProposalTallied(uint proposalID, int result, uint quorum, bool active);
struct Proposal {
address recipient;
uint amount;
bytes32 data;
string description;
uint creationDate;
bool active;
Vote[] votes;
mapping (address => bool) voted;
}
struct Vote {
int position;
address voter;
}
function Democracy(uint _voterShare, uint _minimumQuorum, uint _debatingPeriod) {
founder = msg.sender;
voterShare = _voterShare;
minimumQuorum = _minimumQuorum;
debatingPeriod = _debatingPeriod * 1 minutes;
}
function newProposal(address _recipient, uint _amount, bytes32 _data, string _description) returns (uint proposalID) {
proposalID = proposals.length++;
Proposal p = proposals[proposalID];
p.recipient = _recipient;
p.amount = _amount;
p.data = _data;
p.description = _description;
p.creationDate = now;
p.active = true;
ProposalAdded(proposalID, _recipient, _amount, _data, _description);
numProposals = proposalID+1;
}
function vote(uint _proposalID, int _position) returns (uint voteID){
if (_position >= -1 || _position <= 1 ) {
Proposal p = proposals[_proposalID];
if (p.voted[msg.sender] == true) return;
voteID = p.votes.length++;
p.votes[voteID] = Vote({position: _position, voter: msg.sender});
p.voted[msg.sender] = true;
Voted(_proposalID, _position, msg.sender);
}
}
function executeProposal(uint _proposalID) returns (int result) {
Proposal p = proposals[_proposalID];
/* Check if debating period is over */
if (now > (p.creationDate + debatingPeriod) && p.active){
uint quorum = 0;
/* tally the votes */
for (uint i = 0; i < p.votes.length; ++i) {
Vote v = p.votes[i];
uint voteWeight = voterShare;
quorum += voteWeight;
result += int(voteWeight) * v.position;
}
p.active = false;
ProposalTallied(_proposalID, result, quorum, p.active);
}
}
function kill() { if (msg.sender == founder) suicide(founder); }
}External Links
Related contracts
ProtoDAO_0x7931c901_Sep24
Same deployerSep 24, 2015 proto-DAO experiment — eight months before TheDAO. One of 10 byte-identical sister contracts deployed by 0x7931c901 in a 40-minute burst.
0xcbe06c...54c81cSeptember 24, 2015ProtoDAO_0x7931c901_Sep24
Same deployerSep 24, 2015 proto-DAO experiment — eight months before TheDAO. One of 10 byte-identical sister contracts deployed by 0x7931c901 in a 40-minute burst.
0x8d0c13...ff4f34September 24, 2015ProtoDAO_0x7931c901_Sep24
Same deployerSep 24, 2015 proto-DAO experiment — eight months before TheDAO. One of 10 byte-identical sister contracts deployed by 0x7931c901 in a 40-minute burst.
0x8ecd7a...605874September 24, 2015ProtoDAO_0x7931c901_Sep24
Same deployerSep 24, 2015 proto-DAO experiment — eight months before TheDAO. One of 10 byte-identical sister contracts deployed by 0x7931c901 in a 40-minute burst.
0xba2423...0516e0September 24, 2015ProtoDAO_0x7931c901_Sep24
Same deployerSep 24, 2015 proto-DAO experiment — eight months before TheDAO. One of 10 byte-identical sister contracts deployed by 0x7931c901 in a 40-minute burst.
0xc602cb...c710c5September 24, 2015ProtoDAO_0x7931c901_Sep24
Same deployerSep 24, 2015 proto-DAO experiment — eight months before TheDAO. One of 10 byte-identical sister contracts deployed by 0x7931c901 in a 40-minute burst.
0xf9fe42...cdd61cSeptember 24, 2015