Address Contract Partially Verified
Address
0x6888a16eA9792c15A4DCF2f6C623D055c8eDe792
Balance
0 ETH
Nonce
1
Code Size
5475 bytes
Creator
0xC526560c...B78C at tx 0xa6f08a76...45dfbe
Indexed Transactions
0
Contract Bytecode
5475 bytes
0x606060405236156101385763ffffffff60e060020a60003504166306fdde03811461013d578063095ea7b3146101c85780631088f03f146101fe57806318160ddd1461022557806323b872dd1461024a578063313ce5671461028657806331616395146102af57806345977d03146102de5780635afd7627146102f6578063600440cb1461030b57806370a082311461033a5780638444b3911461036b57806395d89b41146103a25780639738968c1461042d578063a9059cbb14610454578063af9afe731461048a578063c752ff62146104c0578063cae9ca51146104e5578063cd3265a31461055e578063ce5c073d1461057f578063d991c58f146105b2578063dd62ed3e146105e1578063eefa597b14610618578063f0dda65c1461063f578063fe537a8214610675578063ffeb7d75146106a4575b600080fd5b341561014857600080fd5b6101506106c5565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561018d5780820151818401525b602001610174565b50505050905090810190601f1680156101ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101d357600080fd5b6101ea600160a060020a0360043516602435610763565b604051901515815260200160405180910390f35b341561020957600080fd5b6101ea610791565b604051901515815260200160405180910390f35b341561023057600080fd5b6102386107a1565b60405190815260200160405180910390f35b341561025557600080fd5b6101ea600160a060020a03600435811690602435166044356107a7565b604051901515815260200160405180910390f35b341561029157600080fd5b6102996107d7565b60405160ff909116815260200160405180910390f35b34156102ba57600080fd5b6102c26107e0565b604051600160a060020a03909116815260200160405180910390f35b34156102e957600080fd5b6102f46004356107f4565b005b341561030157600080fd5b6102f4610961565b005b341561031657600080fd5b6102c26109c0565b604051600160a060020a03909116815260200160405180910390f35b341561034557600080fd5b610238600160a060020a03600435166109cf565b60405190815260200160405180910390f35b341561037657600080fd5b61037e6109ee565b6040518082600481111561038e57fe5b60ff16815260200191505060405180910390f35b34156103ad57600080fd5b610150610a3b565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561018d5780820151818401525b602001610174565b50505050905090810190601f1680156101ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043857600080fd5b6101ea610ad9565b604051901515815260200160405180910390f35b341561045f57600080fd5b6101ea600160a060020a0360043516602435610adf565b604051901515815260200160405180910390f35b341561049557600080fd5b6101ea600160a060020a0360043516602435610b0d565b604051901515815260200160405180910390f35b34156104cb57600080fd5b610238610c6a565b60405190815260200160405180910390f35b34156104f057600080fd5b6101ea60048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610c7095505050505050565b604051901515815260200160405180910390f35b341561056957600080fd5b6102f4600160a060020a0360043516610e2a565b005b341561058a57600080fd5b6101ea600160a060020a0360043516610fe3565b604051901515815260200160405180910390f35b34156105bd57600080fd5b6102c2611087565b604051600160a060020a03909116815260200160405180910390f35b34156105ec57600080fd5b610238600160a060020a0360043581169060243516611096565b60405190815260200160405180910390f35b341561062357600080fd5b6101ea6110c3565b604051901515815260200160405180910390f35b341561064a57600080fd5b6101ea600160a060020a03600435166024356110c8565b604051901515815260200160405180910390f35b341561068057600080fd5b6102c26111ff565b604051600160a060020a03909116815260200160405180910390f35b34156106af57600080fd5b6102f4600160a060020a036004351661120e565b005b60078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561075b5780601f106107305761010080835404028352916020019161075b565b820191906000526020600020905b81548152906001019060200180831161073e57829003601f168201915b505050505081565b60095460009060a860020a900460ff16151561077e57600080fd5b610788838361126a565b90505b92915050565b60095460a860020a900460ff1681565b60005481565b60095460009060a860020a900460ff1615156107c257600080fd5b6107cd848484611313565b90505b9392505050565b60095460ff1681565b6009546101009004600160a060020a031681565b60006107fe6109ee565b905060035b81600481111561080f57fe5b1480610827575060045b81600481111561082557fe5b145b151561083257600080fd5b6000821161083f57600080fd5b600160a060020a033316600090815260016020526040902054610868908363ffffffff61141616565b600160a060020a03331660009081526001602052604081209190915554610895908363ffffffff61141616565b6000556005546108ab908363ffffffff61142d16565b600555600454600160a060020a031663753e88e5338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561090457600080fd5b6102c65a03f1151561091557600080fd5b5050600454600160a060020a03908116915033167f947637ad74c8018986ee33595c626316230f52029a0129e84fc7212b7b2c75028460405190815260200160405180910390a35b5050565b60095433600160a060020a03908116610100909204161461098157600080fd5b60095460a860020a900460ff161561099857600080fd5b6009805475ff000000000000000000000000000000000000000000191660a860020a1790555b565b600354600160a060020a031681565b600160a060020a0381166000908152600160205260409020545b919050565b60006109f8610ad9565b1515610a0657506001610a35565b600454600160a060020a03161515610a2057506002610a35565b6005541515610a3157506003610a35565b5060045b5b5b5b90565b60088054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561075b5780601f106107305761010080835404028352916020019161075b565b820191906000526020600020905b81548152906001019060200180831161073e57829003601f168201915b505050505081565b60015b90565b60095460009060a860020a900460ff161515610afa57600080fd5b6107888383611455565b90505b92915050565b60065460009033600160a060020a03908116911614610b2b57600080fd5b60008211610b3857600080fd5b600160a060020a03831660009081526001602052604090205482901015610b5e57600080fd5b600160a060020a038316600090815260016020526040902054610b87908363ffffffff61141616565b600160a060020a03841660009081526001602052604081209190915554610bb4908363ffffffff61141616565b6000818155600160a060020a03851681526001602052604090819020547f2e0eddecfc49c6167981c028aca887d76127461e2b5a26b11d4aa0511e40d60192869286929190518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a16000600160a060020a0384166000805160206115188339815191528460405190815260200160405180910390a35060015b92915050565b60055481565b60095460009060a860020a900460ff161515610c8b57600080fd5b600160a060020a03338116600081815260026020908152604080832094891680845294909152908190208690557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259086905190815260200160405180910390a383600160a060020a03166040517f72656365697665417070726f76616c28616464726573732c75696e743235362c81527f616464726573732c6279746573290000000000000000000000000000000000006020820152602e01604051809103902060e060020a9004338530866040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a03168152602001828051906020019080838360005b83811015610dca5780820151818401525b602001610db1565b50505050905090810190601f168015610df75780820380516001836020036101000a031916815260200191505b5094505050505060006040518083038160008761646e5a03f1925050501515610e1f57600080fd5b5060015b9392505050565b610e32610ad9565b1515610e3d57600080fd5b600160a060020a0381161515610e5257600080fd5b60035433600160a060020a03908116911614610e6d57600080fd5b60045b610e786109ee565b6004811115610e8357fe5b1415610e8e57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905516633b6b367e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610ef957600080fd5b6102c65a03f11515610f0a57600080fd5b505050604051805190501515610f1f57600080fd5b600080546004549091600160a060020a0390911690634b2ba0dd90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610f6f57600080fd5b6102c65a03f11515610f8057600080fd5b50505060405180519050141515610f9657600080fd5b6004547f85efc013e6a48528d2ea6e2365572f6db3ff28b9b911968161eaf0fd46d494e890600160a060020a0316604051600160a060020a03909116815260200160405180910390a15b50565b600654600090819033600160a060020a0390811691161461100357600080fd5b5060068054600160a060020a0384811673ffffffffffffffffffffffffffffffffffffffff1983161792839055908116917f85634ebba9e270a25e5845ccc5f7819479f4edb51c85d57452434114c70dedca91839116604051600160a060020a039283168152911660208201526040908101905180910390a1600191505b50919050565b600654600160a060020a031681565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b600181565b60065460009033600160a060020a039081169116146110e657600080fd5b600082116110f357600080fd5b600160a060020a03831660009081526001602052604090205461111c908363ffffffff61142d16565b600160a060020a03841660009081526001602052604081209190915554611149908363ffffffff61142d16565b6000818155600160a060020a03851681526001602052604090819020547f5f502ab3f45e75f9f14918f5f5e2680d15cf6823e37114077e4488f5c3a6070992869286929190518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a1600160a060020a03831660006000805160206115188339815191528460405190815260200160405180910390a35060015b92915050565b600454600160a060020a031681565b600160a060020a038116151561122357600080fd5b60035433600160a060020a0390811691161461123e57600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b6000811580159061129f5750600160a060020a0333811660009081526002602090815260408083209387168352929052205415155b156112a957600080fd5b600160a060020a03338116600081815260026020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b600160a060020a03808416600090815260026020908152604080832033851684528252808320549386168352600190915281205490919061135a908463ffffffff61142d16565b600160a060020a03808616600090815260016020526040808220939093559087168152205461138f908463ffffffff61141616565b600160a060020a0386166000908152600160205260409020556113b8818463ffffffff61141616565b600160a060020a03808716600081815260026020908152604080832033861684529091529081902093909355908616916000805160206115188339815191529086905190815260200160405180910390a3600191505b509392505050565b60008282111561142257fe5b508082035b92915050565b60008282018381108015906114425750828110155b151561144a57fe5b8091505b5092915050565b600060403660441461146657600080fd5b600160a060020a03331660009081526001602052604090205461148f908463ffffffff61141616565b600160a060020a0333811660009081526001602052604080822093909355908616815220546114c4908463ffffffff61142d16565b600160a060020a0380861660008181526001602052604090819020939093559133909116906000805160206115188339815191529086905190815260200160405180910390a3600191505b5b50929150505600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058209274d12d9b0929dc0a25eeacfea489154f63da31679a78aa71d557aa42fee3880029
Verified Source Code Partial Match
Compiler: v0.4.15+commit.bbb8e64f
Optimization: Yes (200 runs)
SigToken.sol 406 lines
pragma solidity ^0.4.15;
/**
* Math operations with safety checks
*/
library SafeMath {
function safeMul(uint a, uint b) internal returns (uint) {
uint c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function safeDiv(uint a, uint b) internal returns (uint) {
assert(b > 0);
uint c = a / b;
assert(a == b * c + a % b);
return c;
}
function safeSub(uint a, uint b) internal returns (uint) {
assert(b <= a);
return a - b;
}
function safeAdd(uint a, uint b) internal returns (uint) {
uint c = a + b;
assert(c>=a && c>=b);
return c;
}
function max64(uint64 a, uint64 b) internal constant returns (uint64) {
return a >= b ? a : b;
}
function min64(uint64 a, uint64 b) internal constant returns (uint64) {
return a < b ? a : b;
}
function max256(uint256 a, uint256 b) internal constant returns (uint256) {
return a >= b ? a : b;
}
function min256(uint256 a, uint256 b) internal constant returns (uint256) {
return a < b ? a : b;
}
}
/*
* ERC20 interface
* see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 {
uint public totalSupply;
function balanceOf(address who) constant returns (uint);
function allowance(address owner, address spender) constant returns (uint);
function transfer(address to, uint value) returns (bool ok);
function transferFrom(address from, address to, uint value) returns (bool ok);
function approve(address spender, uint value) returns (bool ok);
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
}
/**
* Standard ERC20 token with Short Hand Attack and approve() race condition mitigation.
*
* Based on code by FirstBlood:
* https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
*/
contract StandardToken is ERC20
{
using SafeMath for uint;
mapping(address => uint) balances;
mapping(address => mapping (address => uint)) allowed;
// Interface marker
bool public constant isToken = true;
/**
* Fix for the ERC20 short address attack
*
* http://vessenes.com/the-erc20-short-address-attack-explained/
*/
modifier onlyPayloadSize(uint size) {
require(msg.data.length == size + 4);
_;
}
function transfer(address _to, uint _value)
onlyPayloadSize(2 * 32)
returns (bool success)
{
balances[msg.sender] = balances[msg.sender].safeSub(_value);
balances[_to] = balances[_to].safeAdd(_value);
Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address from, address to, uint value)
returns (bool success)
{
uint _allowance = allowed[from][msg.sender];
// Check is not needed because _allowance.safeSub(value) will throw if this condition is not met
// if (value > _allowance) throw;
balances[to] = balances[to].safeAdd(value);
balances[from] = balances[from].safeSub(value);
allowed[from][msg.sender] = _allowance.safeSub(value);
Transfer(from, to, value);
return true;
}
function balanceOf(address account)
constant
returns (uint balance)
{
return balances[account];
}
function approve(address spender, uint value)
returns (bool success)
{
// To change the approve amount you first have to reduce the addresses`
// allowance to zero by calling `approve(spender, 0)` if it is not
// already 0 to mitigate the race condition described here:
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
if ((value != 0) && (allowed[msg.sender][spender] != 0)) throw;
allowed[msg.sender][spender] = value;
Approval(msg.sender, spender, value);
return true;
}
function allowance(address account, address spender)
constant
returns (uint remaining)
{
return allowed[account][spender];
}
}
/**
* Upgrade target interface inspired by Lunyr.
*
* Upgrade agent transfers tokens to a new contract.
* Upgrade agent itself can be the token contract, or just a middle man contract doing the heavy lifting.
*/
contract UpgradeTarget
{
uint public originalSupply;
/** Interface marker */
function isUpgradeTarget() public constant returns (bool) {
return true;
}
function upgradeFrom(address _from, uint256 _value) public;
}
/**
* A token upgrade mechanism where users can opt-in amount of tokens to the next smart contract revision.
*
* First envisioned by Golem and Lunyr projects.
*/
contract UpgradeableToken is StandardToken
{
/** Contract / person who can set the upgrade path. This can be the same as team multisig wallet, as what it is with its default value. */
address public upgradeMaster;
/** The next contract where the tokens will be migrated. */
UpgradeTarget public upgradeTarget;
/** How many tokens we have upgraded by now. */
uint256 public totalUpgraded;
/**
* Upgrade states.
*
* - NotAllowed: The child contract has not reached a condition where the upgrade can bgun
* - WaitingForAgent: Token allows upgrade, but we don't have a new agent yet
* - ReadyToUpgrade: The agent is set, but not a single token has been upgraded yet
* - Upgrading: Upgrade agent is set and the balance holders can upgrade their tokens
*
*/
enum UpgradeState {Unknown, NotAllowed, WaitingForAgent, ReadyToUpgrade, Upgrading}
/**
* Somebody has upgraded some of his tokens.
*/
event LogUpgrade(address indexed _from, address indexed _to, uint256 _value);
/**
* New upgrade agent available.
*/
event LogSetUpgradeTarget(address agent);
/**
* Do not allow construction without upgrade master set.
*/
function UpgradeableToken(address _upgradeMaster) {
upgradeMaster = _upgradeMaster;
}
/**
* Allow the token holder to upgrade some of their tokens to a new contract.
*/
function upgrade(uint256 value) public {
UpgradeState state = getUpgradeState();
require(state == UpgradeState.ReadyToUpgrade || state == UpgradeState.Upgrading);
// Validate input value.
require(value > 0);
balances[msg.sender] = balances[msg.sender].safeSub(value);
// Take tokens out from circulation
totalSupply = totalSupply.safeSub(value);
totalUpgraded = totalUpgraded.safeAdd(value);
// Upgrade agent reissues the tokens
upgradeTarget.upgradeFrom(msg.sender, value);
LogUpgrade(msg.sender, upgradeTarget, value);
}
/**
* Set an upgrade targget that handles the process of letting users opt-in to the new token contract.
*/
function setUpgradeTarget(address target) external {
require(canUpgrade());
require(target != 0x0);
require(msg.sender == upgradeMaster); // Only a master can designate the next target
require(getUpgradeState() != UpgradeState.Upgrading); // Upgrade has already begun
upgradeTarget = UpgradeTarget(target);
require(upgradeTarget.isUpgradeTarget()); // Bad interface
require(upgradeTarget.originalSupply() == totalSupply); // Make sure that token supplies match in source and target
LogSetUpgradeTarget(upgradeTarget);
}
/**
* Get the state of the token upgrade.
*/
function getUpgradeState() public constant returns (UpgradeState) {
if (!canUpgrade()) return UpgradeState.NotAllowed;
else if (address(upgradeTarget) == 0x00) return UpgradeState.WaitingForAgent;
else if (totalUpgraded == 0) return UpgradeState.ReadyToUpgrade;
else return UpgradeState.Upgrading;
}
/**
* Change the upgrade master.
*
* This allows us to set a new owner for the upgrade mechanism.
*/
function setUpgradeMaster(address master) public {
require(master != 0x0);
require(msg.sender == upgradeMaster);
upgradeMaster = master;
}
/**
* Child contract can enable to provide the condition when the upgrade can begun.
*/
function canUpgrade() public constant returns (bool) {
return true;
}
}
contract MintableToken is StandardToken
{
address public mintMaster;
event LogMintTokens(address recipient, uint amount, uint newBalance, uint totalSupply);
event LogUnmintTokens(address hodler, uint amount, uint newBalance, uint totalSupply);
event LogSetMintMaster(address oldMintMaster, address newMintMaster);
function MintableToken(address _mintMaster) {
mintMaster = _mintMaster;
}
function setMintMaster(address newMintMaster)
returns (bool ok)
{
require(msg.sender == mintMaster);
address oldMintMaster = mintMaster;
mintMaster = newMintMaster;
LogSetMintMaster(oldMintMaster, mintMaster);
return true;
}
function mintTokens(address recipient, uint amount)
returns (bool ok)
{
require(msg.sender == mintMaster);
require(amount > 0);
balances[recipient] = balances[recipient].safeAdd(amount);
totalSupply = totalSupply.safeAdd(amount);
LogMintTokens(recipient, amount, balances[recipient], totalSupply);
Transfer(address(0), recipient, amount);
return true;
}
function unmintTokens(address hodler, uint amount)
returns (bool ok)
{
require(msg.sender == mintMaster);
require(amount > 0);
require(balances[hodler] >= amount);
balances[hodler] = balances[hodler].safeSub(amount);
totalSupply = totalSupply.safeSub(amount);
LogUnmintTokens(hodler, amount, balances[hodler], totalSupply);
Transfer(hodler, address(0), amount);
return true;
}
}
contract SigToken is UpgradeableToken, MintableToken
{
string public name = "Signals";
string public symbol = "SIG";
uint8 public decimals = 18;
address public crowdsaleContract;
bool public crowdsaleCompleted;
function SigToken()
UpgradeableToken(msg.sender)
MintableToken(msg.sender)
{
crowdsaleContract = msg.sender;
totalSupply = 0; // we mint during the crowdsale, so totalSupply must start at 0
}
function transfer(address _to, uint _value)
returns (bool success)
{
require(crowdsaleCompleted);
return StandardToken.transfer(_to, _value);
}
function transferFrom(address from, address to, uint value)
returns (bool success)
{
require(crowdsaleCompleted);
return StandardToken.transferFrom(from, to, value);
}
function approve(address spender, uint value)
returns (bool success)
{
require(crowdsaleCompleted);
return StandardToken.approve(spender, value);
}
// This is called to unlock tokens once the crowdsale (and subsequent audit + legal process) are
// completed. We don't want people buying tokens during the sale and then immediately starting
// to trade them. See Crowdsale::finalizeCrowdsale().
function setCrowdsaleCompleted() {
require(msg.sender == crowdsaleContract);
require(crowdsaleCompleted == false);
crowdsaleCompleted = true;
}
/**
* ERC20 approveAndCall extension
*
* Approves and then calls the receiving contract
*/
function approveAndCall(address _spender, uint256 _value, bytes _extraData)
public
returns (bool success)
{
require(crowdsaleCompleted);
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
//call the receiveApproval function on the contract you want to be notified. This crafts the function signature manually so one doesn't have to include a contract in here just for this.
//receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData)
//it is assumed when one does this that the call *should* succeed, otherwise one would use vanilla approve instead.
require(_spender.call(bytes4(bytes32(keccak256("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData));
return true;
}
}
Write Contract 26 functions
These functions modify contract state and require a wallet transaction to execute.
allowance 0xdd62ed3e
address account
address spender
returns: uint256
approve 0x095ea7b3
address spender
uint256 value
returns: bool
approveAndCall 0xcae9ca51
address _spender
uint256 _value
bytes _extraData
returns: bool
balanceOf 0x70a08231
address account
returns: uint256
canUpgrade 0x9738968c
No parameters
returns: bool
crowdsaleCompleted 0x1088f03f
No parameters
returns: bool
crowdsaleContract 0x31616395
No parameters
returns: address
decimals 0x313ce567
No parameters
returns: uint8
getUpgradeState 0x8444b391
No parameters
returns: uint8
isToken 0xeefa597b
No parameters
returns: bool
mintMaster 0xd991c58f
No parameters
returns: address
mintTokens 0xf0dda65c
address recipient
uint256 amount
returns: bool
name 0x06fdde03
No parameters
returns: string
setCrowdsaleCompleted 0x5afd7627
No parameters
setMintMaster 0xce5c073d
address newMintMaster
returns: bool
setUpgradeMaster 0xffeb7d75
address master
setUpgradeTarget 0xcd3265a3
address target
symbol 0x95d89b41
No parameters
returns: string
totalSupply 0x18160ddd
No parameters
returns: uint256
totalUpgraded 0xc752ff62
No parameters
returns: uint256
transfer 0xa9059cbb
address _to
uint256 _value
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 value
returns: bool
unmintTokens 0xaf9afe73
address hodler
uint256 amount
returns: bool
upgrade 0x45977d03
uint256 value
upgradeMaster 0x600440cb
No parameters
returns: address
upgradeTarget 0xfe537a82
No parameters
returns: address
Recent Transactions
No transactions found for this address