The ethereum.org crowdsale tutorial pointed at a reward token address that has no code.
Context
Deployed 13 December 2015, during the Frontier era.
Key Facts
Description
A crowdfunding contract compiled from the same revision of the ethereum.org crowdsale tutorial as the November deployments, this one with the optimizer on. The fallback appends the sender and the value paid to the funders array, adds the value to amountRaised and calls sendCoin on the reward token for value divided by price. checkGoalReached, allowed only after the deadline, pays the beneficiary if the goal was met and otherwise refunds each funder, then self destructs. The constructor arguments set the beneficiary to 0x230763d33a010506d3b8b640d7e7fd363f9b3f3b, a goal of 100 ether, a duration of 30 minutes and a price of 0.02 ether per token. The reward token argument is 0xd2ebde1fb6ac0f2db1b464431be0ad9100000000, an address whose last four bytes are zero and which has never held any code.
Source Verified
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 token { mapping (address => uint) public coinBalanceOf; function token() {} function sendCoin(address receiver, uint amount) returns(bool sufficient) { } }
contract Crowdsale {
address public beneficiary;
uint public fundingGoal; uint public amountRaised; uint public deadline; uint public price;
token public tokenReward;
Funder[] public funders;
event FundTransfer(address backer, uint amount, bool isContribution);
/* data structure to hold information about campaign contributors */
struct Funder {
address addr;
uint amount;
}
/* at initialization, setup the owner */
function Crowdsale(address _beneficiary, uint _fundingGoal, uint _duration, uint _price, token _reward) {
beneficiary = _beneficiary;
fundingGoal = _fundingGoal;
deadline = now + _duration * 1 minutes;
price = _price;
tokenReward = token(_reward);
}
/* The function without name is the default function that is called whenever anyone sends funds to a contract */
function () {
uint amount = msg.value;
funders[funders.length++] = Funder({addr: msg.sender, amount: amount});
amountRaised += amount;
tokenReward.sendCoin(msg.sender, amount / price);
FundTransfer(msg.sender, amount, true);
}
modifier afterDeadline() { if (now >= deadline) _ }
/* checks if the goal or time limit has been reached and ends the campaign */
function checkGoalReached() afterDeadline {
if (amountRaised >= fundingGoal){
beneficiary.send(amountRaised);
FundTransfer(beneficiary, amountRaised, false);
} else {
FundTransfer(0, 11, false);
for (uint i = 0; i < funders.length; ++i) {
funders[i].addr.send(funders[i].amount);
FundTransfer(funders[i].addr, funders[i].amount, false);
}
}
suicide(beneficiary);
}
}External Links
Related contracts
MyScheme (1ETH)
Same eraThe original MyScheme pyramid contract with a 1 ETH entry fee, deployed on August 7, 2015.
0x109c4f...4aea3fAugust 7, 2015Augur REP Crowdsale
Same eraThe ETH crowdsale contract for Augur REP token sale, August 2015. Contributors called buyRep() to fund Ethereum's first major dApp.
0xe28e72...d63bccAugust 15, 2015CrowdSale
Same eraThe July 2015 ethereum.org crowdsale tutorial, with a fallback that reverts on every contribution.
0x2ba9d1...af0d85October 22, 2015Crowdsale
Same eraA later revision of the ethereum.org crowdsale tutorial, set to raise 100 ether in 30 minutes with no reward token.
0x5b9b28...ba70eaNovember 9, 2015