Bytecode verified via sibling
This contract shares identical runtime bytecode with MyAdvancedToken (0x616f026e...) which has been verified through compiler archaeology.
VegaPresaleToken (VPT), a separate token deployment from 13 January 2017.
Historical Significance
This contract is part of Ethereum’s early token history. Its precise address matters because a shared symbol or suggestive name is insufficient to identify a token.
Context
By late 2016 and early 2017, Ethereum projects were issuing tokens for a widening range of experiments and presales.
Token Information
Key Facts
Description
VegaPresaleToken was deployed on Ethereum mainnet on 13 January 2017 at block 2,987,177. Its archived token metadata records the name VegaPresaleToken and symbol VPT.
Its name indicates a presale token, but its relationship to any later Vega project has not been independently verified. This entry records the contract’s identity and chronology. A contemporary explanation of its intended use has not been verified.
Source Verified
Cracked +2 byte DUP3+POP approve epilogue with address dummy = _spender local. Full byte-for-byte match including swarm metadata hash.
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Spurious Dragon Era
Continued DoS protection. State trie clearing.
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 owned {
address public owner;
function owned() {
owner = msg.sender;
}
modifier onlyOwner {
if (msg.sender != owner) throw;
_;
}
function transferOwnership(address newOwner) onlyOwner {
owner = newOwner;
}
}
contract tokenRecipient {
function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData);
}
contract token {
string public standard = "VegasCoin 2.1";
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
event Transfer(address indexed from, address indexed to, uint256 value);
function token(
uint256 initialSupply,
string tokenName,
uint8 decimalUnits,
string tokenSymbol
) {
balanceOf[msg.sender] = initialSupply;
totalSupply = initialSupply;
name = tokenName;
symbol = tokenSymbol;
decimals = decimalUnits;
}
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value) throw;
if (balanceOf[_to] + _value < balanceOf[_to]) throw;
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
Transfer(msg.sender, _to, _value);
}
function approve(address _spender, uint256 _value) returns (bool success) {
address dummy = _spender;
allowance[msg.sender][dummy] = _value;
return true;
}
function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) {
tokenRecipient spender = tokenRecipient(_spender);
if (approve(_spender, _value)) {
spender.receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
if (balanceOf[_from] < _value) throw;
if (balanceOf[_to] + _value < balanceOf[_to]) throw;
if (_value > allowance[_from][msg.sender]) throw;
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
allowance[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
}
function () {
throw;
}
}
contract MyAdvancedToken is owned, token {
uint256 public sellPrice;
uint256 public buyPrice;
uint256 public totalSupply;
mapping (address => bool) public frozenAccount;
event FrozenFunds(address target, bool frozen);
function MyAdvancedToken(
uint256 initialSupply,
string tokenName,
uint8 decimalUnits,
string tokenSymbol,
address centralMinter
) token (initialSupply, tokenName, decimalUnits, tokenSymbol) {
if (centralMinter != 0) owner = centralMinter;
totalSupply = initialSupply;
}
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value) throw;
if (balanceOf[_to] + _value < balanceOf[_to]) throw;
if (frozenAccount[msg.sender]) throw;
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
Transfer(msg.sender, _to, _value);
}
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
if (frozenAccount[_from]) throw;
if (balanceOf[_from] < _value) throw;
if (balanceOf[_to] + _value < balanceOf[_to]) throw;
if (_value > allowance[_from][msg.sender]) throw;
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
allowance[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
}
function mintToken(address target, uint256 mintedAmount) onlyOwner {
balanceOf[target] += mintedAmount;
totalSupply += mintedAmount;
Transfer(0, this, mintedAmount);
Transfer(this, target, mintedAmount);
}
function freezeAccount(address target, bool freeze) onlyOwner {
frozenAccount[target] = freeze;
FrozenFunds(target, freeze);
}
function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner {
sellPrice = newSellPrice;
buyPrice = newBuyPrice;
}
function buy() payable {
uint amount = msg.value / buyPrice;
if (balanceOf[this] < amount) throw;
balanceOf[msg.sender] += amount;
balanceOf[this] -= amount;
Transfer(this, msg.sender, amount);
}
function sell(uint256 amount) {
if (balanceOf[msg.sender] < amount) throw;
balanceOf[this] += amount;
balanceOf[msg.sender] -= amount;
if (!msg.sender.send(amount * sellPrice)) {
throw;
} else {
Transfer(msg.sender, this, amount);
}
}
function transferOwnership(address newOwner) onlyOwner {
owner = newOwner;
}
}External Links
Related contracts
Pass Dao
Same eraShare ledger and proposal system for a funded working group, priced on a decaying curve.
0x09bc33...9a4acdNovember 24, 2016DoriToken
Same eraA fixed-supply token with transfers and allowance spending, deployed November 2016.
0xdbd90d...c4cb16November 25, 2016"ITT Demo 0.3.6 - Live Chain"
Same eraA fixed-supply token with transfers and third-party allowances, deployed November 2016.
0xb9a357...c293e3November 28, 2016HumanStandartTokenTC
Same eraA fixed-supply token with transfers and third-party allowances, deployed November 2016.
0x7dd73b...715250November 28, 2016INRF Test Tokens
Same eraOwner can mint and freeze, and the version label was renamed from the tutorial default.
0x74f074...abb8beNovember 30, 2016test
Same eraA token with transfers and third-party allowances, and an owner who can mint new units, deployed December 2016.
0x3cfb11...cd875bDecember 1, 2016