Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60606040 | 4639547 | 2552 days ago | IN | 0 ETH | 0.02482233 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
MilestonePricing
Compiler Version
v0.4.16+commit.d7661dd9
Optimization Enabled:
Yes with 500 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2017-11-28 */ /** * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net * * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt */ /** * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net * * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt */ /** * Interface for defining crowdsale pricing. */ contract PricingStrategy { /** Interface declaration. */ function isPricingStrategy() public constant returns (bool) { return true; } /** Self check if all references are correctly set. * * Checks that pricing strategy matches crowdsale parameters. */ function isSane(address crowdsale) public constant returns (bool) { return true; } /** * @dev Pricing tells if this is a presale purchase or not. @param purchaser Address of the purchaser @return False by default, true if a presale purchaser */ function isPresalePurchase(address purchaser) public constant returns (bool) { return false; } /** * When somebody tries to buy tokens for X eth, calculate how many tokens they get. * * * @param value - What is the value of the transaction send in as wei * @param tokensSold - how much tokens have been sold this far * @param weiRaised - how much money has been raised this far in the main token sale - this number excludes presale * @param msgSender - who is the investor of this transaction * @param decimals - how many decimal units the token has * @return Amount of tokens the investor receives */ function calculatePrice(uint value, uint weiRaised, uint tokensSold, address msgSender, uint decimals) public constant returns (uint tokenAmount); } /** * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net * * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt */ /** * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net * * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt */ /** * Safe unsigned safe math. * * https://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736#.750gwtwli * * Originally from https://raw.githubusercontent.com/AragonOne/zeppelin-solidity/master/contracts/SafeMathLib.sol * * Maintained here until merged to mainline zeppelin-solidity. * */ library SafeMathLib { function times(uint a, uint b) returns (uint) { uint c = a * b; assert(a == 0 || c / a == b); return c; } function minus(uint a, uint b) returns (uint) { assert(b <= a); return a - b; } function plus(uint a, uint b) returns (uint) { uint c = a + b; assert(c>=a); return c; } } /** * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net * * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt */ /** * Finalize agent defines what happens at the end of succeseful crowdsale. * * - Allocate tokens for founders, bounties and community * - Make tokens transferable * - etc. */ contract FinalizeAgent { function isFinalizeAgent() public constant returns(bool) { return true; } /** Return true if we can run finalizeCrowdsale() properly. * * This is a safety check function that doesn't allow crowdsale to begin * unless the finalizer has been set up properly. */ function isSane() public constant returns (bool); /** Called once by crowdsale finalize() if the sale was success. */ function finalizeCrowdsale(); } /** * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net * * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt */ /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { uint256 public totalSupply; function balanceOf(address who) constant returns (uint256); function transfer(address to, uint256 value) returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) constant returns (uint256); function transferFrom(address from, address to, uint256 value) returns (bool); function approve(address spender, uint256 value) returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * A token that defines fractional units as decimals. */ contract FractionalERC20 is ERC20 { uint public decimals; } /** * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net * * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt */ /** * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net * * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt */ /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) onlyOwner { require(newOwner != address(0)); owner = newOwner; } } /* * Haltable * * Abstract contract that allows children to implement an * emergency stop mechanism. Differs from Pausable by causing a throw when in halt mode. * * * Originally envisioned in FirstBlood ICO contract. */ contract Haltable is Ownable { bool public halted; modifier stopInEmergency { if (halted) throw; _; } modifier stopNonOwnersInEmergency { if (halted && msg.sender != owner) throw; _; } modifier onlyInEmergency { if (!halted) throw; _; } // called by the owner on emergency, triggers stopped state function halt() external onlyOwner { halted = true; } // called by the owner on end of emergency, returns to normal state function unhalt() external onlyOwner onlyInEmergency { halted = false; } } /** * Crowdsale state machine without buy functionality. * * Implements basic state machine logic, but leaves out all buy functions, * so that subclasses can implement their own buying logic. * * * For the default buy() implementation see Crowdsale.sol. */ contract CrowdsaleBase is Haltable { /* Max investment count when we are still allowed to change the multisig address */ uint public MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE = 5; using SafeMathLib for uint; /* The token we are selling */ FractionalERC20 public token; /* How we are going to price our offering */ PricingStrategy public pricingStrategy; /* Post-success callback */ FinalizeAgent public finalizeAgent; /* tokens will be transfered from this address */ address public multisigWallet; /* if the funding goal is not reached, investors may withdraw their funds */ uint public minimumFundingGoal; /* the UNIX timestamp start date of the crowdsale */ uint public startsAt; /* the UNIX timestamp end date of the crowdsale */ uint public endsAt; /* the number of tokens already sold through this contract*/ uint public tokensSold = 0; /* How many wei of funding we have raised */ uint public weiRaised = 0; /* Calculate incoming funds from presale contracts and addresses */ uint public presaleWeiRaised = 0; /* How many distinct addresses have invested */ uint public investorCount = 0; /* How much wei we have returned back to the contract after a failed crowdfund. */ uint public loadedRefund = 0; /* How much wei we have given back to investors.*/ uint public weiRefunded = 0; /* Has this crowdsale been finalized */ bool public finalized; /** How much ETH each address has invested to this crowdsale */ mapping (address => uint256) public investedAmountOf; /** How much tokens this crowdsale has credited for each investor address */ mapping (address => uint256) public tokenAmountOf; /** Addresses that are allowed to invest even before ICO offical opens. For testing, for ICO partners, etc. */ mapping (address => bool) public earlyParticipantWhitelist; /** This is for manul testing for the interaction from owner wallet. You can set it to any value and inspect this in blockchain explorer to see that crowdsale interaction works. */ uint public ownerTestValue; /** State machine * * - Preparing: All contract initialization calls and variables have not been set yet * - Prefunding: We have not passed start time yet * - Funding: Active crowdsale * - Success: Minimum funding goal reached * - Failure: Minimum funding goal not reached before ending time * - Finalized: The finalized has been called and succesfully executed * - Refunding: Refunds are loaded on the contract for reclaim. */ enum State{Unknown, Preparing, PreFunding, Funding, Success, Failure, Finalized, Refunding} // A new investment was made event Invested(address investor, uint weiAmount, uint tokenAmount, uint128 customerId); // Refund was processed for a contributor event Refund(address investor, uint weiAmount); // The rules were changed what kind of investments we accept event InvestmentPolicyChanged(bool newRequireCustomerId, bool newRequiredSignedAddress, address newSignerAddress); // Address early participation whitelist status changed event Whitelisted(address addr, bool status); // Crowdsale end time has been changed event EndsAtChanged(uint newEndsAt); State public testState; function CrowdsaleBase(address _token, PricingStrategy _pricingStrategy, address _multisigWallet, uint _start, uint _end, uint _minimumFundingGoal) { owner = msg.sender; token = FractionalERC20(_token); setPricingStrategy(_pricingStrategy); multisigWallet = _multisigWallet; if(multisigWallet == 0) { throw; } if(_start == 0) { throw; } startsAt = _start; if(_end == 0) { throw; } endsAt = _end; // Don't mess the dates if(startsAt >= endsAt) { throw; } // Minimum funding goal can be zero minimumFundingGoal = _minimumFundingGoal; } /** * Don't expect to just send in money and get tokens. */ function() payable { throw; } /** * Make an investment. * * Crowdsale must be running for one to invest. * We must have not pressed the emergency brake. * * @param receiver The Ethereum address who receives the tokens * @param customerId (optional) UUID v4 to track the successful payments on the server side' * * @return tokenAmount How mony tokens were bought */ function investInternal(address receiver, uint128 customerId) stopInEmergency internal returns(uint tokensBought) { // Determine if it's a good time to accept investment from this participant if(getState() == State.PreFunding) { // Are we whitelisted for early deposit if(!earlyParticipantWhitelist[receiver]) { throw; } } else if(getState() == State.Funding) { // Retail participants can only come in when the crowdsale is running // pass } else { // Unwanted state throw; } uint weiAmount = msg.value; // Account presale sales separately, so that they do not count against pricing tranches uint tokenAmount = pricingStrategy.calculatePrice(weiAmount, weiRaised - presaleWeiRaised, tokensSold, msg.sender, token.decimals()); // Dust transaction require(tokenAmount != 0); if(investedAmountOf[receiver] == 0) { // A new investor investorCount++; } // Update investor investedAmountOf[receiver] = investedAmountOf[receiver].plus(weiAmount); tokenAmountOf[receiver] = tokenAmountOf[receiver].plus(tokenAmount); // Update totals weiRaised = weiRaised.plus(weiAmount); tokensSold = tokensSold.plus(tokenAmount); if(pricingStrategy.isPresalePurchase(receiver)) { presaleWeiRaised = presaleWeiRaised.plus(weiAmount); } // Check that we did not bust the cap require(!isBreakingCap(weiAmount, tokenAmount, weiRaised, tokensSold)); assignTokens(receiver, tokenAmount); // Pocket the money, or fail the crowdsale if we for some reason cannot send the money to our multisig if(!multisigWallet.send(weiAmount)) throw; // Tell us invest was success Invested(receiver, weiAmount, tokenAmount, customerId); return tokenAmount; } /** * Finalize a succcesful crowdsale. * * The owner can triggre a call the contract that provides post-crowdsale actions, like releasing the tokens. */ function finalize() public inState(State.Success) onlyOwner stopInEmergency { // Already finalized if(finalized) { throw; } // Finalizing is optional. We only call it if we are given a finalizing agent. if(address(finalizeAgent) != 0) { finalizeAgent.finalizeCrowdsale(); } finalized = true; } /** * Allow to (re)set finalize agent. * * Design choice: no state restrictions on setting this, so that we can fix fat finger mistakes. */ function setFinalizeAgent(FinalizeAgent addr) onlyOwner { finalizeAgent = addr; // Don't allow setting bad agent if(!finalizeAgent.isFinalizeAgent()) { throw; } } /** * Allow crowdsale owner to close early or extend the crowdsale. * * This is useful e.g. for a manual soft cap implementation: * - after X amount is reached determine manual closing * * This may put the crowdsale to an invalid state, * but we trust owners know what they are doing. * */ function setEndsAt(uint time) onlyOwner { if(now > time) { throw; // Don't change past } if(startsAt > time) { throw; // Prevent human mistakes } endsAt = time; EndsAtChanged(endsAt); } /** * Allow to (re)set pricing strategy. * * Design choice: no state restrictions on the set, so that we can fix fat finger mistakes. */ function setPricingStrategy(PricingStrategy _pricingStrategy) onlyOwner { pricingStrategy = _pricingStrategy; // Don't allow setting bad agent if(!pricingStrategy.isPricingStrategy()) { throw; } } /** * Allow to change the team multisig address in the case of emergency. * * This allows to save a deployed crowdsale wallet in the case the crowdsale has not yet begun * (we have done only few test transactions). After the crowdsale is going * then multisig address stays locked for the safety reasons. */ function setMultisig(address addr) public onlyOwner { // Change if(investorCount > MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE) { throw; } multisigWallet = addr; } /** * Allow load refunds back on the contract for the refunding. * * The team can transfer the funds back on the smart contract in the case the minimum goal was not reached.. */ function loadRefund() public payable inState(State.Failure) { if(msg.value == 0) throw; loadedRefund = loadedRefund.plus(msg.value); } /** * Investors can claim refund. * * Note that any refunds from proxy buyers should be handled separately, * and not through this contract. */ function refund() public inState(State.Refunding) { uint256 weiValue = investedAmountOf[msg.sender]; if (weiValue == 0) throw; investedAmountOf[msg.sender] = 0; weiRefunded = weiRefunded.plus(weiValue); Refund(msg.sender, weiValue); if (!msg.sender.send(weiValue)) throw; } /** * @return true if the crowdsale has raised enough money to be a successful. */ function isMinimumGoalReached() public constant returns (bool reached) { return weiRaised >= minimumFundingGoal; } /** * Check if the contract relationship looks good. */ function isFinalizerSane() public constant returns (bool sane) { return finalizeAgent.isSane(); } /** * Check if the contract relationship looks good. */ function isPricingSane() public constant returns (bool sane) { return pricingStrategy.isSane(address(this)); } /** * Crowdfund state machine management. * * We make it a function and do not assign the result to a variable, so there is no chance of the variable being stale. */ function getState() public constant returns (State) { if(finalized) return State.Finalized; else if (address(finalizeAgent) == 0) return State.Preparing; else if (!finalizeAgent.isSane()) return State.Preparing; else if (!pricingStrategy.isSane(address(this))) return State.Preparing; else if (block.timestamp < startsAt) return State.PreFunding; else if (block.timestamp <= endsAt && !isCrowdsaleFull()) return State.Funding; else if (isMinimumGoalReached()) return State.Success; else if (!isMinimumGoalReached() && weiRaised > 0 && loadedRefund >= weiRaised) return State.Refunding; else return State.Failure; } /** This is for manual testing of multisig wallet interaction */ function setOwnerTestValue(uint val) onlyOwner { ownerTestValue = val; } /** * Allow addresses to do early participation. * * TODO: Fix spelling error in the name */ function setEarlyParicipantWhitelist(address addr, bool status) onlyOwner { earlyParticipantWhitelist[addr] = status; Whitelisted(addr, status); } /** Interface marker. */ function isCrowdsale() public constant returns (bool) { return true; } // // Modifiers // /** Modified allowing execution only if the crowdsale is currently running. */ modifier inState(State state) { if(getState() != state) throw; _; } // // Abstract functions // /** * Check if the current invested breaks our cap rules. * * * The child contract must define their own cap setting rules. * We allow a lot of flexibility through different capping strategies (ETH, token count) * Called from invest(). * * @param weiAmount The amount of wei the investor tries to invest in the current transaction * @param tokenAmount The amount of tokens we try to give to the investor in the current transaction * @param weiRaisedTotal What would be our total raised balance after this transaction * @param tokensSoldTotal What would be our total sold tokens count after this transaction * * @return true if taking this investment would break our cap rules */ function isBreakingCap(uint weiAmount, uint tokenAmount, uint weiRaisedTotal, uint tokensSoldTotal) constant returns (bool limitBroken); /** * Check if the current crowdsale is full and we can no longer sell any tokens. */ function isCrowdsaleFull() public constant returns (bool); /** * Create new tokens or transfer issued tokens to the investor depending on the cap model. */ function assignTokens(address receiver, uint tokenAmount) internal; } /** * Abstract base contract for token sales with the default buy entry points. * * Handle * - start and end dates * - accepting investments * - minimum funding goal and refund * - various statistics during the crowdfund * - different pricing strategies * - different investment policies (require server side customer id, allow only whitelisted addresses) * * Does not Handle * * - Token allocation (minting vs. transfer) * - Cap rules * */ contract Crowdsale is CrowdsaleBase { /* Do we need to have unique contributor id for each customer */ bool public requireCustomerId; /** * Do we verify that contributor has been cleared on the server side (accredited investors only). * This method was first used in FirstBlood crowdsale to ensure all contributors have accepted terms on sale (on the web). */ bool public requiredSignedAddress; /* Server side address that signed allowed contributors (Ethereum addresses) that can participate the crowdsale */ address public signerAddress; function Crowdsale(address _token, PricingStrategy _pricingStrategy, address _multisigWallet, uint _start, uint _end, uint _minimumFundingGoal) CrowdsaleBase(_token, _pricingStrategy, _multisigWallet, _start, _end, _minimumFundingGoal) { } /** * Preallocate tokens for the early investors. * * Preallocated tokens have been sold before the actual crowdsale opens. * This function mints the tokens and moves the crowdsale needle. * * Investor count is not handled; it is assumed this goes for multiple investors * and the token distribution happens outside the smart contract flow. * * No money is exchanged, as the crowdsale team already have received the payment. * * @param fullTokens tokens as full tokens - decimal places added internally * @param weiPrice Price of a single full token in wei * */ function preallocate(address receiver, uint fullTokens, uint weiPrice) public onlyOwner { uint tokenAmount = fullTokens * 10**token.decimals(); uint weiAmount = weiPrice * fullTokens; // This can be also 0, we give out tokens for free weiRaised = weiRaised.plus(weiAmount); tokensSold = tokensSold.plus(tokenAmount); investedAmountOf[receiver] = investedAmountOf[receiver].plus(weiAmount); tokenAmountOf[receiver] = tokenAmountOf[receiver].plus(tokenAmount); assignTokens(receiver, tokenAmount); // Tell us invest was success Invested(receiver, weiAmount, tokenAmount, 0); } /** * Allow anonymous contributions to this crowdsale. */ function investWithSignedAddress(address addr, uint128 customerId, uint8 v, bytes32 r, bytes32 s) public payable { bytes32 hash = sha256(addr); if (ecrecover(hash, v, r, s) != signerAddress) throw; if(customerId == 0) throw; // UUIDv4 sanity check investInternal(addr, customerId); } /** * Track who is the customer making the payment so we can send thank you email. */ function investWithCustomerId(address addr, uint128 customerId) public payable { if(requiredSignedAddress) throw; // Crowdsale allows only server-side signed participants if(customerId == 0) throw; // UUIDv4 sanity check investInternal(addr, customerId); } /** * Allow anonymous contributions to this crowdsale. */ function invest(address addr) public payable { if(requireCustomerId) throw; // Crowdsale needs to track participants for thank you email if(requiredSignedAddress) throw; // Crowdsale allows only server-side signed participants investInternal(addr, 0); } /** * Invest to tokens, recognize the payer and clear his address. * */ function buyWithSignedAddress(uint128 customerId, uint8 v, bytes32 r, bytes32 s) public payable { investWithSignedAddress(msg.sender, customerId, v, r, s); } /** * Invest to tokens, recognize the payer. * */ function buyWithCustomerId(uint128 customerId) public payable { investWithCustomerId(msg.sender, customerId); } /** * The basic entry point to participate the crowdsale process. * * Pay for funding, get invested tokens back in the sender address. */ function buy() public payable { invest(msg.sender); } /** * Buy tokens as generic fallback */ function() payable { invest(msg.sender); } /** * Set policy do we need to have server-side customer ids for the investments. * */ function setRequireCustomerId(bool value) onlyOwner { requireCustomerId = value; InvestmentPolicyChanged(requireCustomerId, requiredSignedAddress, signerAddress); } /** * Set policy if all investors must be cleared on the server side first. * * This is e.g. for the accredited investor clearing. * */ function setRequireSignedAddress(bool value, address _signerAddress) onlyOwner { requiredSignedAddress = value; signerAddress = _signerAddress; InvestmentPolicyChanged(requireCustomerId, requiredSignedAddress, signerAddress); } } /// @dev Time milestone based pricing with special support for pre-ico deals. contract MilestonePricing is PricingStrategy, Ownable { using SafeMathLib for uint; uint public constant MAX_MILESTONE = 10; // This contains all pre-ICO addresses, and their prices (weis per token) mapping (address => uint) public preicoAddresses; /** * Define pricing schedule using milestones. */ struct Milestone { // UNIX timestamp when this milestone kicks in uint time; // How many tokens per satoshi you will get after this milestone has been passed uint price; } // Store milestones in a fixed array, so that it can be seen in a blockchain explorer // Milestone 0 is always (0, 0) // (TODO: change this when we confirm dynamic arrays are explorable) Milestone[10] public milestones; // How many active milestones we have uint public milestoneCount; /// @dev Contruction, creating a list of milestones /// @param _milestones uint[] milestones Pairs of (time, price) function MilestonePricing(uint[] _milestones) { // Need to have tuples, length check if(_milestones.length % 2 == 1 || _milestones.length >= MAX_MILESTONE*2) { throw; } milestoneCount = _milestones.length / 2; uint lastTimestamp = 0; for(uint i=0; i<_milestones.length/2; i++) { milestones[i].time = _milestones[i*2]; milestones[i].price = _milestones[i*2+1]; // No invalid steps if((lastTimestamp != 0) && (milestones[i].time <= lastTimestamp)) { throw; } lastTimestamp = milestones[i].time; } // Last milestone price must be zero, terminating the crowdale if(milestones[milestoneCount-1].price != 0) { throw; } } /// @dev This is invoked once for every pre-ICO address, set pricePerToken /// to 0 to disable /// @param preicoAddress PresaleFundCollector address /// @param pricePerToken How many weis one token cost for pre-ico investors function setPreicoAddress(address preicoAddress, uint pricePerToken) public onlyOwner { preicoAddresses[preicoAddress] = pricePerToken; } /// @dev Iterate through milestones. You reach end of milestones when price = 0 /// @return tuple (time, price) function getMilestone(uint n) public constant returns (uint, uint) { return (milestones[n].time, milestones[n].price); } function getFirstMilestone() private constant returns (Milestone) { return milestones[0]; } function getLastMilestone() private constant returns (Milestone) { return milestones[milestoneCount-1]; } function getPricingStartsAt() public constant returns (uint) { return getFirstMilestone().time; } function getPricingEndsAt() public constant returns (uint) { return getLastMilestone().time; } function isSane(address _crowdsale) public constant returns(bool) { Crowdsale crowdsale = Crowdsale(_crowdsale); return crowdsale.startsAt() == getPricingStartsAt() && crowdsale.endsAt() == getPricingEndsAt(); } /// @dev Get the current milestone or bail out if we are not in the milestone periods. /// @return {[type]} [description] function getCurrentMilestone() private constant returns (Milestone) { uint i; for(i=0; i<milestones.length; i++) { if(now < milestones[i].time) { return milestones[i-1]; } } } /// @dev Get the current price. /// @return The current price or 0 if we are outside milestone period function getCurrentPrice() public constant returns (uint result) { return getCurrentMilestone().price; } /// @dev Calculate the current price for buy in amount. function calculatePrice(uint value, uint weiRaised, uint tokensSold, address msgSender, uint decimals) public constant returns (uint) { uint multiplier = 10 ** decimals; // This investor is coming through pre-ico if(preicoAddresses[msgSender] > 0) { return value.times(multiplier) / preicoAddresses[msgSender]; } uint price = getCurrentPrice(); return value.times(multiplier) / price; } function isPresalePurchase(address purchaser) public constant returns (bool) { if(preicoAddresses[purchaser] > 0) return true; else return false; } function() payable { throw; // No money on this contract } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"isPricingStrategy","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"milestoneCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"value","type":"uint256"},{"name":"weiRaised","type":"uint256"},{"name":"tokensSold","type":"uint256"},{"name":"msgSender","type":"address"},{"name":"decimals","type":"uint256"}],"name":"calculatePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"n","type":"uint256"}],"name":"getMilestone","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricingStartsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricingEndsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_crowdsale","type":"address"}],"name":"isSane","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_MILESTONE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"preicoAddress","type":"address"},{"name":"pricePerToken","type":"uint256"}],"name":"setPreicoAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"milestones","outputs":[{"name":"time","type":"uint256"},{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentPrice","outputs":[{"name":"result","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"purchaser","type":"address"}],"name":"isPresalePurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"preicoAddresses","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_milestones","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"}]
Contract Creation Code
6060604052341561000f57600080fd5b604051610a71380380610a718339810160405280805190910190505b6000805b60008054600160a060020a03191633600160a060020a03161790555b6002835181151561005857fe5b066001148061006957506014835110155b1561007357600080fd5b6002835181151561008057fe5b046016555060009050805b6002835181151561009857fe5b04811015610153578281600202815181106100af57fe5b90602001906020020151600282600a81106100c657fe5b6002020160005b50558260016002830201815181106100e157fe5b90602001906020020151600282600a81106100f857fe5b6002020160005b50600101558115801590610128575081600282600a811061011c57fe5b6002020160005b505411155b1561013257600080fd5b600281600a811061013f57fe5b6002020160005b505491505b60010161008b565b60165460029060001901600a811061016757fe5b6002020160005b50600101541561017d57600080fd5b5b5050505b6108e0806101916000396000f300606060405236156100d85763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166304bbc25581146100e05780630681ca551461010757806318a4155e1461012c5780632442e1cb146101695780632c9a0a95146101975780636f079f90146101bc5780638da5cb5b146101e15780638e7682881461021057806396821fc114610243578063e474f97a14610268578063e89e4ed61461028c578063eb91d37e146102ba578063f14ae17d146102df578063f1ef9a0814610312578063f2fde38b14610343575b5b600080fd5b005b34156100eb57600080fd5b6100f3610364565b604051901515815260200160405180910390f35b341561011257600080fd5b61011a61036a565b60405190815260200160405180910390f35b341561013757600080fd5b61011a600435602435604435600160a060020a0360643516608435610370565b60405190815260200160405180910390f35b341561017457600080fd5b61017f60043561050d565b60405191825260208201526040908101905180910390f35b34156101a257600080fd5b61011a610549565b60405190815260200160405180910390f35b34156101c757600080fd5b61011a61055a565b60405190815260200160405180910390f35b34156101ec57600080fd5b6101f461056b565b604051600160a060020a03909116815260200160405180910390f35b341561021b57600080fd5b6100f3600160a060020a036004351661057a565b604051901515815260200160405180910390f35b341561024e57600080fd5b61011a610694565b60405190815260200160405180910390f35b341561027357600080fd5b6100de600160a060020a0360043516602435610699565b005b341561029757600080fd5b61017f6004356106d5565b60405191825260208201526040908101905180910390f35b34156102c557600080fd5b61011a6106f8565b60405190815260200160405180910390f35b34156102ea57600080fd5b6100f3600160a060020a036004351661070c565b604051901515815260200160405180910390f35b341561031d57600080fd5b61011a600160a060020a036004351661073f565b60405190815260200160405180910390f35b341561034e57600080fd5b6100de600160a060020a0360043516610751565b005b60015b90565b60165481565b600160a060020a038216600090815260016020526040812054600a83900a9082908190111561045857600160a060020a0385166000908152600160205260408082205491732cad0c49f10c6daebf92c4981d446112d39298f391631d3b9edf918c9187919051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff85160281526004810192909252602482015260440160206040518083038186803b151561042c57600080fd5b6102c65a03f4151561043d57600080fd5b5050506040518051905081151561045057fe5b049250610502565b6104606106f8565b905080732cad0c49f10c6daebf92c4981d446112d39298f3631d3b9edf8a856000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff85160281526004810192909252602482015260440160206040518083038186803b15156104da57600080fd5b6102c65a03f415156104eb57600080fd5b505050604051805190508115156104fe57fe5b0492505b505095945050505050565b600080600283600a811061051d57fe5b6002020160005b5054600284600a811061053357fe5b6002020160005b5060010154915091505b915091565b60006105536107ae565b5190505b90565b60006105536107e2565b5190505b90565b600054600160a060020a031681565b600081610585610549565b81600160a060020a031663af4686826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105e457600080fd5b6102c65a03f115156105f557600080fd5b5050506040518051905014801561068b575061060f61055a565b81600160a060020a0316630a09284a6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561066e57600080fd5b6102c65a03f1151561067f57600080fd5b50505060405180519050145b91505b50919050565b600a81565b60005433600160a060020a039081169116146106b457600080fd5b600160a060020a03821660009081526001602052604090208190555b5b5050565b600281600a81106106e257fe5b6002020160005b50805460019091015490915082565b6000610702610825565b6020015190505b90565b600160a060020a0381166000908152600160205260408120548190111561073557506001610739565b5060005b5b919050565b60016020526000908152604090205481565b60005433600160a060020a0390811691161461076c57600080fd5b600160a060020a038116151561078157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b6107b661089d565b600260005b6002020160005b506040805190810160405281548152600190910154602082015290505b90565b6107ea61089d565b60165460029060001901600a81106107bb57fe5b6002020160005b506040805190810160405281548152600190910154602082015290505b90565b61082d61089d565b60005b600a81101561089857600281600a811061084657fe5b6002020160005b505442101561088f5760026000198201600a811061086757fe5b6002020160005b50604080519081016040528154815260019091015460208201529150610898565b5b600101610830565b5b5090565b6040805190810160405260008082526020820152905600a165627a7a7230582062b041bc39ac6f845ef92b73b5521799ac953890afbcef72126ce0383d19ee29002900000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000005a19ce18000000000000000000000000000000000000000000000000000103db0a81db6d000000000000000000000000000000000000000000000000000000005a37050000000000000000000000000000000000000000000000000000012f2a36ecd555000000000000000000000000000000000000000000000000000000005a403f8000000000000000000000000000000000000000000000000000013c58925b4fc8000000000000000000000000000000000000000000000000000000005a497a0000000000000000000000000000000000000000000000000000014ab9b0482e8b000000000000000000000000000000000000000000000000000000005a52b48000000000000000000000000000000000000000000000000000016bcc41e90000000000000000000000000000000000000000000000000000000000005a80d90000000000000000000000000000000000000000000000000000015a796357cf3c000000000000000000000000000000000000000000000000000000005a8a138000000000000000000000000000000000000000000000000000016bcc41e90000000000000000000000000000000000000000000000000000000000005a934e000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x606060405236156100d85763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166304bbc25581146100e05780630681ca551461010757806318a4155e1461012c5780632442e1cb146101695780632c9a0a95146101975780636f079f90146101bc5780638da5cb5b146101e15780638e7682881461021057806396821fc114610243578063e474f97a14610268578063e89e4ed61461028c578063eb91d37e146102ba578063f14ae17d146102df578063f1ef9a0814610312578063f2fde38b14610343575b5b600080fd5b005b34156100eb57600080fd5b6100f3610364565b604051901515815260200160405180910390f35b341561011257600080fd5b61011a61036a565b60405190815260200160405180910390f35b341561013757600080fd5b61011a600435602435604435600160a060020a0360643516608435610370565b60405190815260200160405180910390f35b341561017457600080fd5b61017f60043561050d565b60405191825260208201526040908101905180910390f35b34156101a257600080fd5b61011a610549565b60405190815260200160405180910390f35b34156101c757600080fd5b61011a61055a565b60405190815260200160405180910390f35b34156101ec57600080fd5b6101f461056b565b604051600160a060020a03909116815260200160405180910390f35b341561021b57600080fd5b6100f3600160a060020a036004351661057a565b604051901515815260200160405180910390f35b341561024e57600080fd5b61011a610694565b60405190815260200160405180910390f35b341561027357600080fd5b6100de600160a060020a0360043516602435610699565b005b341561029757600080fd5b61017f6004356106d5565b60405191825260208201526040908101905180910390f35b34156102c557600080fd5b61011a6106f8565b60405190815260200160405180910390f35b34156102ea57600080fd5b6100f3600160a060020a036004351661070c565b604051901515815260200160405180910390f35b341561031d57600080fd5b61011a600160a060020a036004351661073f565b60405190815260200160405180910390f35b341561034e57600080fd5b6100de600160a060020a0360043516610751565b005b60015b90565b60165481565b600160a060020a038216600090815260016020526040812054600a83900a9082908190111561045857600160a060020a0385166000908152600160205260408082205491732cad0c49f10c6daebf92c4981d446112d39298f391631d3b9edf918c9187919051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff85160281526004810192909252602482015260440160206040518083038186803b151561042c57600080fd5b6102c65a03f4151561043d57600080fd5b5050506040518051905081151561045057fe5b049250610502565b6104606106f8565b905080732cad0c49f10c6daebf92c4981d446112d39298f3631d3b9edf8a856000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff85160281526004810192909252602482015260440160206040518083038186803b15156104da57600080fd5b6102c65a03f415156104eb57600080fd5b505050604051805190508115156104fe57fe5b0492505b505095945050505050565b600080600283600a811061051d57fe5b6002020160005b5054600284600a811061053357fe5b6002020160005b5060010154915091505b915091565b60006105536107ae565b5190505b90565b60006105536107e2565b5190505b90565b600054600160a060020a031681565b600081610585610549565b81600160a060020a031663af4686826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105e457600080fd5b6102c65a03f115156105f557600080fd5b5050506040518051905014801561068b575061060f61055a565b81600160a060020a0316630a09284a6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561066e57600080fd5b6102c65a03f1151561067f57600080fd5b50505060405180519050145b91505b50919050565b600a81565b60005433600160a060020a039081169116146106b457600080fd5b600160a060020a03821660009081526001602052604090208190555b5b5050565b600281600a81106106e257fe5b6002020160005b50805460019091015490915082565b6000610702610825565b6020015190505b90565b600160a060020a0381166000908152600160205260408120548190111561073557506001610739565b5060005b5b919050565b60016020526000908152604090205481565b60005433600160a060020a0390811691161461076c57600080fd5b600160a060020a038116151561078157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b6107b661089d565b600260005b6002020160005b506040805190810160405281548152600190910154602082015290505b90565b6107ea61089d565b60165460029060001901600a81106107bb57fe5b6002020160005b506040805190810160405281548152600190910154602082015290505b90565b61082d61089d565b60005b600a81101561089857600281600a811061084657fe5b6002020160005b505442101561088f5760026000198201600a811061086757fe5b6002020160005b50604080519081016040528154815260019091015460208201529150610898565b5b600101610830565b5b5090565b6040805190810160405260008082526020820152905600a165627a7a7230582062b041bc39ac6f845ef92b73b5521799ac953890afbcef72126ce0383d19ee290029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000005a19ce18000000000000000000000000000000000000000000000000000103db0a81db6d000000000000000000000000000000000000000000000000000000005a37050000000000000000000000000000000000000000000000000000012f2a36ecd555000000000000000000000000000000000000000000000000000000005a403f8000000000000000000000000000000000000000000000000000013c58925b4fc8000000000000000000000000000000000000000000000000000000005a497a0000000000000000000000000000000000000000000000000000014ab9b0482e8b000000000000000000000000000000000000000000000000000000005a52b48000000000000000000000000000000000000000000000000000016bcc41e90000000000000000000000000000000000000000000000000000000000005a80d90000000000000000000000000000000000000000000000000000015a796357cf3c000000000000000000000000000000000000000000000000000000005a8a138000000000000000000000000000000000000000000000000000016bcc41e90000000000000000000000000000000000000000000000000000000000005a934e000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _milestones (uint256[]): 1511640600,285714285714285,1513555200,333333333333333,1514160000,347826086957000,1514764800,363636363636363,1515369600,400000000000000,1518393600,380952380952380,1518998400,400000000000000,1519603200,0
-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [2] : 000000000000000000000000000000000000000000000000000000005a19ce18
Arg [3] : 000000000000000000000000000000000000000000000000000103db0a81db6d
Arg [4] : 000000000000000000000000000000000000000000000000000000005a370500
Arg [5] : 00000000000000000000000000000000000000000000000000012f2a36ecd555
Arg [6] : 000000000000000000000000000000000000000000000000000000005a403f80
Arg [7] : 00000000000000000000000000000000000000000000000000013c58925b4fc8
Arg [8] : 000000000000000000000000000000000000000000000000000000005a497a00
Arg [9] : 00000000000000000000000000000000000000000000000000014ab9b0482e8b
Arg [10] : 000000000000000000000000000000000000000000000000000000005a52b480
Arg [11] : 00000000000000000000000000000000000000000000000000016bcc41e90000
Arg [12] : 000000000000000000000000000000000000000000000000000000005a80d900
Arg [13] : 00000000000000000000000000000000000000000000000000015a796357cf3c
Arg [14] : 000000000000000000000000000000000000000000000000000000005a8a1380
Arg [15] : 00000000000000000000000000000000000000000000000000016bcc41e90000
Arg [16] : 000000000000000000000000000000000000000000000000000000005a934e00
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000
Swarm Source
bzzr://62b041bc39ac6f845ef92b73b5521799ac953890afbcef72126ce0383d19ee29
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.