The ETH crowdsale contract for Augur REP token sale, August 2015. Contributors called buyRep() to fund Ethereum's first major dApp.
Key Facts
Description
This contract collected ETH contributions during the Augur crowdsale, which ran from approximately August 17 to October 1, 2015. Augur, a decentralized prediction market platform, was the first decentralized application to conduct a crowdsale on the Ethereum blockchain after Ethereum's own genesis sale. The 45-day sale raised over $5.2 million, placing it among the top 25 most successful crowdfunding campaigns of all time at that point.
Augur was co-founded by Joey Krug and Jack Peterson under the auspices of the Forecast Foundation. The project aimed to create a decentralized prediction market where users could create and trade shares in the outcome of real-world events, with a reputation token (REP) used to incentivize honest reporting of outcomes.
The crowdsale contract was deployed at block 88,090 on August 15, 2015 — just 15 days after Ethereum's mainnet launch on July 30, 2015. This makes it one of the earliest smart contracts on Ethereum with significant real-world economic activity. Contributors received REP tokens, which were initially tracked in a Serpent-based token contract (0x48c80F1f4D53D5951e5D5438B54Cba84f29F32a5) before being migrated to Solidity in 2017.
Coinbase selected Augur as one of its five most exciting Bitcoin/blockchain projects in their 2015 trends report. The project went on to deploy its v1 mainnet platform in July 2018 and v2 in July 2020, making it one of the longest-running Ethereum projects from the genesis era.
Source Verified
Compiled with Serpent @ commit 6ace8a6 (August 2015). Two non-obvious source details required for exact match: (1) buyRep() uses an if/else structure on the block.number < endBlock check — not a trailing return(0). This generates a PUSH2+JUMP trampoline between the true and false branches. (2) getAmountSent() compares as `address == self.funders[i].addr` with the parameter on the LEFT side of ==. Serpent evaluates the left operand first, so reversing the order changes the bytecode. Critical discovery: the Serpent (lll code 0) wrapper appends 4 bytes of init-code epilogue (JUMPDEST PUSH1(0) RETURN) after the runtime in the creation bytecode. These bytes are NOT deployed — the CODECOPY in the init section explicitly copies only 856 bytes. Runtime must be extracted using the CODECOPY size field, not by bytecode scanning.
Historian Categories
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 (Serpent)
data funders[](addr, amt, blockNum)
data funderNum
data addrToIndex[]
data wallet
data endBlock
def init():
self.wallet = 0xa04fc9bd2be8bcc6875d9ebb964e8f858bcc1b4f
self.endBlock = 432015
def buyRep():
if msg.value == 0:
return(0)
if block.number < self.endBlock:
send(self.wallet, msg.value)
self.funders[self.funderNum].amt = msg.value
self.funders[self.funderNum].blockNum = block.number
self.funders[self.funderNum].addr = tx.origin
self.addrToIndex[tx.origin] = self.funderNum
self.funderNum += 1
return(1)
else:
return(0)
def getAmountSent(address):
amount = 0
i = 0
while i < self.funderNum:
if address == self.funders[i].addr:
amount += self.funders[i].amt
i += 1
return(amount)
def getBlockNumSent(address):
return(self.funders[self.addrToIndex[address]].blockNum)
def getFunderNum():
return(self.funderNum)
def getAmtByIndex(index):
return(self.funders[index].amt)
def getAddrByIndex(index):
return(self.funders[index].addr)
def getBlockNumByIndex(index):
return(self.funders[index].blockNum)
def addrToFunder(address):
return(self.addrToIndex[address])
def getFundsRaised():
return(self.wallet.balance)