ETH Price: $3,447.98 (+1.45%)

Token

HelloGold GBT (GBT)
 

Overview

Max Total Supply

0 GBT

Holders

81

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GoldBackedToken

Compiler Version
v0.4.15+commit.bbb8e64f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-08-25
*/

pragma solidity ^0.4.11;


contract DoNotDeployThisGetTheRightOneCosParityPutsThisOnTop {
    uint256 nothing;

    function DoNotDeployThisGetTheRightOneCosParityPutsThisOnTop() {
        nothing = 27;
    }
}


//*************** Ownable

contract Ownable {
  address public owner;

  function Ownable() {
    owner = msg.sender;
  }

  modifier onlyOwner() {
    require(msg.sender == owner);
    
    _;
  }

  function transferOwnership(address newOwner) onlyOwner {
    if (newOwner != address(0)) {
      owner = newOwner;
    }
  }

}

//***********Pausible

contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;

  /**
   * @dev modifier to allow actions only when the contract IS paused
   */
  modifier whenNotPaused() {
    require (!paused);
    _;
  }

  /**
   * @dev modifier to allow actions only when the contract IS NOT paused
   */
  modifier whenPaused {
    require (paused) ;
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused returns (bool) {
    paused = true;
    Pause();
    return true;
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused returns (bool) {
    paused = false;
    Unpause();
    return true;
  }
}

//*************ERC20

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);
}

//*************** SafeMath

contract 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;
  }

}

//**************** StandardToken

contract StandardToken is ERC20, SafeMath {

  /**
   * @dev Fix for the ERC20 short address attack.
   */
  modifier onlyPayloadSize(uint size) {
     require(msg.data.length >= size + 4);
     _;
  }

  mapping(address => uint) balances;
  mapping (address => mapping (address => uint)) allowed;

  function transfer(address _to, uint _value) onlyPayloadSize(2 * 32)  returns (bool success){
    balances[msg.sender] = safeSub(balances[msg.sender], _value);
    balances[_to] = safeAdd(balances[_to], _value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  function transferFrom(address _from, address _to, uint _value) onlyPayloadSize(3 * 32) returns (bool success) {
    var _allowance = allowed[_from][msg.sender];

    // Check is not needed because safeSub(_allowance, _value) will already throw if this condition is not met
    // if (_value > _allowance) throw;

    balances[_to] = safeAdd(balances[_to], _value);
    balances[_from] = safeSub(balances[_from], _value);
    allowed[_from][msg.sender] = safeSub(_allowance, _value);
    Transfer(_from, _to, _value);
    return true;
  }

  function balanceOf(address _owner) constant returns (uint balance) {
    return balances[_owner];
  }

  function approve(address _spender, uint _value) returns (bool success) {
    require((_value == 0) || (allowed[msg.sender][_spender] == 0));
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  function allowance(address _owner, address _spender) constant returns (uint remaining) {
    return allowed[_owner][_spender];
  }

}

contract GBT {
  function parentChange(address,uint);
  function parentFees(address);
  function setHGT(address _hgt);
}

//************ HELLOGOLDTOKEN

contract HelloGoldToken is ERC20, SafeMath, Pausable, StandardToken {

  string public name;
  string public symbol;
  uint8  public decimals;

  GBT  goldtoken;
  

  function setGBT(address gbt_) onlyOwner {
    goldtoken = GBT(gbt_);
  }

  function GBTAddress() constant returns (address) {
    return address(goldtoken);
  }

  function HelloGoldToken(address _reserve) {
    name = "HelloGold Token";
    symbol = "HGT";
    decimals = 8;
 
    totalSupply = 1 * 10 ** 9 * 10 ** uint256(decimals);
    balances[_reserve] = totalSupply;
  }


  function parentChange(address _to) internal {
    require(address(goldtoken) != 0x0);
    goldtoken.parentChange(_to,balances[_to]);
  }
  function parentFees(address _to) internal {
    require(address(goldtoken) != 0x0);
    goldtoken.parentFees(_to);
  }

  function transferFrom(address _from, address _to, uint256 _value) returns (bool success){
    parentFees(_from);
    parentFees(_to);
    success = super.transferFrom(_from,_to,_value);
    parentChange(_from);
    parentChange(_to);
    return;
  }

  function transfer(address _to, uint _value) whenNotPaused returns (bool success)  {
    parentFees(msg.sender);
    parentFees(_to);
    success = super.transfer(_to,_value);
    parentChange(msg.sender);
    parentChange(_to);
    return;
  }

  function approve(address _spender, uint _value) whenNotPaused returns (bool success)  {
    return super.approve(_spender,_value);
  }
}

//********* GOLDFEES ************************

contract GoldFees is SafeMath,Ownable {
    // e.g. if rate = 0.0054
    //uint rateN = 9999452055;
    uint rateN = 9999452054794520548;
    uint rateD = 19;
    uint public maxDays;
    uint public maxRate;

    
    function GoldFees() {
        calcMax();
    }

    function calcMax() {
        maxDays = 1;
        maxRate = rateN;
        
        
        uint pow = 2;
        do {
            uint newN = rateN ** pow;
            if (newN / maxRate != maxRate) {
                maxDays = pow / 2;
                break;
            }
            maxRate = newN;
            pow *= 2;
        } while (pow < 2000);
        
    }

    function updateRate(uint256 _n, uint256 _d) onlyOwner{
        rateN = _n;
        rateD = _d;
        calcMax();
    }
    
    function rateForDays(uint256 numDays) constant returns (uint256 rate) {
        if (numDays <= maxDays) {
            uint r = rateN ** numDays;
            uint d = rateD * numDays;
            if (d > 18) {
                uint div =  10 ** (d-18);
                rate = r / div;
            } else {
                div = 10 ** (18 - d);
                rate = r * div;
            }
        } else {
            uint256 md1 = numDays / 2;
            uint256 md2 = numDays - md1;
             uint256 r2;

            uint256 r1 = rateForDays(md1);
            if (md1 == md2) {
                r2 = r1;
            } else {
                r2 = rateForDays(md2);
            }
           

            //uint256 r1 = rateForDays(maxDays);
            //uint256 r2 = rateForDays(numDays-maxDays);
            rate  = safeMul( r1 , r2)  / 10 ** 18;
        }
        return; 
        
    }

    uint256 constant public UTC2MYT = 1483200000;

    function wotDay(uint256 time) returns (uint256) {
        return (time - UTC2MYT) / (1 days);
    }

    // minimum fee is 1 unless same day
    function calcFees(uint256 start, uint256 end, uint256 startAmount) constant returns (uint256 amount, uint256 fee) {
        if (startAmount == 0) return;
        uint256 numberOfDays = wotDay(end) - wotDay(start);
        if (numberOfDays == 0) {
            amount = startAmount;
            return;
        }
        amount = (rateForDays(numberOfDays) * startAmount) / (1 ether);
        if ((fee == 0) && (amount !=  0)) amount--;
        fee = safeSub(startAmount,amount);
    }
}

//******************** GoldBackedToken

contract GoldBackedToken is Ownable, SafeMath, ERC20, Pausable {

  event Transfer(address indexed from, address indexed to, uint value);
  event Approval(address indexed owner, address indexed spender, uint value);
  event DeductFees(address indexed owner,uint256 amount);

  event TokenMinted(address destination, uint256 amount);
  event TokenBurned(address source, uint256 amount);
  
	string public name = "HelloGold Gold Backed Token";
	string public symbol = "GBT";
	uint256 constant public  decimals = 18;  // same as ETH
	uint256 constant public  hgtDecimals = 8;
		
	uint256 constant public allocationPool = 1 *  10**9 * 10**hgtDecimals;      // total HGT holdings
	uint256	constant public	maxAllocation  = 38 * 10**5 * 10**decimals;			// max GBT that can ever ever be given out
	uint256	         public	totAllocation;			// amount of GBT so far
	
	address			 public feeCalculator;
	address		     public HGT;					// HGT contract address



	function setFeeCalculator(address newFC) onlyOwner {
		feeCalculator = newFC;
	}


	function calcFees(uint256 from, uint256 to, uint256 amount) returns (uint256 val, uint256 fee) {
		return GoldFees(feeCalculator).calcFees(from,to,amount);
	}

	function GoldBackedToken(address feeCalc) {
		feeCalculator = feeCalc;
	}

    struct allocation { 
        uint256     amount;
        uint256     date;
    }
	
	allocation[]   public allocationsOverTime;
	allocation[]   public currentAllocations;

	function currentAllocationLength() constant returns (uint256) {
		return currentAllocations.length;
	}

	function aotLength() constant returns (uint256) {
		return allocationsOverTime.length;
	}

	
    struct Balance {
        uint256 amount;                 // amount through update or transfer
        uint256 lastUpdated;            // DATE last updated
        uint256 nextAllocationIndex;    // which allocationsOverTime record contains next update
        uint256 allocationShare;        // the share of allocationPool that this holder gets (means they hold HGT)
    }

	/*Creates an array with all balances*/
	mapping (address => Balance) public balances;
	mapping (address => mapping (address => uint)) allowed;
	
	function update(address where) internal {
        uint256 pos;
		uint256 fees;
		uint256 val;
        (val,fees,pos) = updatedBalance(where);
	    balances[where].nextAllocationIndex = pos;
	    balances[where].amount = val;
        balances[where].lastUpdated = now;
	}
	
	function updatedBalance(address where) constant public returns (uint val, uint fees, uint pos) {
		uint256 c_val;
		uint256 c_fees;
		uint256 c_amount;

		(val, fees) = calcFees(balances[where].lastUpdated,now,balances[where].amount);

	    pos = balances[where].nextAllocationIndex;
		if ((pos < currentAllocations.length) &&  (balances[where].allocationShare != 0)) {

			c_amount = currentAllocations[balances[where].nextAllocationIndex].amount * balances[where].allocationShare / allocationPool;

			(c_val,c_fees)   = calcFees(currentAllocations[balances[where].nextAllocationIndex].date,now,c_amount);

		} 

	    val  += c_val;
		fees += c_fees;
		pos   = currentAllocations.length;
	}

    function balanceOf(address where) constant returns (uint256 val) {
        uint256 fees;
		uint256 pos;
        (val,fees,pos) = updatedBalance(where);
        return ;
    }

	event Allocation(uint256 amount, uint256 date);
	event FeeOnAllocation(uint256 fees, uint256 date);

	event PartComplete();
	event StillToGo(uint numLeft);
	uint256 public partPos;
	uint256 public partFees;
	uint256 partL;
	allocation[]   public partAllocations;

	function partAllocationLength() constant returns (uint) {
		return partAllocations.length;
	}

	function addAllocationPartOne(uint newAllocation,uint numSteps) onlyOwner{
		uint256 thisAllocation = newAllocation;

		require(totAllocation < maxAllocation);		// cannot allocate more than this;

		if (currentAllocations.length > partAllocations.length) {
			partAllocations = currentAllocations;
		}

		if (totAllocation + thisAllocation > maxAllocation) {
			thisAllocation = maxAllocation - totAllocation;
			log0("max alloc reached");
		}
		totAllocation += thisAllocation;

		Allocation(thisAllocation,now);

        allocation memory newDiv;
        newDiv.amount = thisAllocation;
        newDiv.date = now;
		// store into history
	    allocationsOverTime.push(newDiv);
		// add this record to the end of currentAllocations
		partL = partAllocations.push(newDiv);
		// update all other records with calcs from last record
		if (partAllocations.length < 2) { // no fees to consider
			PartComplete();
			currentAllocations = partAllocations;
			FeeOnAllocation(0,now);
			return;
		}
		//
		// The only fees that need to be collected are the fees on location zero.
		// Since they are the last calculated = they come out with the break
		//
		for (partPos = partAllocations.length - 2; partPos >= 0; partPos-- ){
			(partAllocations[partPos].amount,partFees) = calcFees(partAllocations[partPos].date,now,partAllocations[partPos].amount);

			partAllocations[partPos].amount += partAllocations[partL - 1].amount;
			partAllocations[partPos].date    = now;
			if ((partPos == 0) || (partPos == partAllocations.length-numSteps)){
				break; 
			}
		}
		if (partPos != 0) {
			StillToGo(partPos);
			return; // not done yet
		}
		PartComplete();
		FeeOnAllocation(partFees,now);
		currentAllocations = partAllocations;
	}

	function addAllocationPartTwo(uint numSteps) onlyOwner {
		require(numSteps > 0);
		require(partPos > 0);
		for (uint i = 0; i < numSteps; i++ ){
			partPos--;
			(partAllocations[partPos].amount,partFees) = calcFees(partAllocations[partPos].date,now,partAllocations[partPos].amount);

			partAllocations[partPos].amount += partAllocations[partL - 1].amount;
			partAllocations[partPos].date    = now;
			if (partPos == 0) {
				break; 
			}
		}
		if (partPos != 0) {
			StillToGo(partPos);
			return; // not done yet
		}
		PartComplete();
		FeeOnAllocation(partFees,now);
		currentAllocations = partAllocations;
	}


	function setHGT(address _hgt) onlyOwner {
		HGT = _hgt;
	}

	function parentFees(address where) whenNotPaused {
		require(msg.sender == HGT);
	    update(where);		
	}
	
	function parentChange(address where, uint newValue) whenNotPaused { // called when HGT balance changes
		require(msg.sender == HGT);
	    balances[where].allocationShare = newValue;
	}
	
	/* send GBT */
	function transfer(address _to, uint256 _value) whenNotPaused returns (bool ok) {
	    update(msg.sender);              // Do this to ensure sender has enough funds.
		update(_to); 

        balances[msg.sender].amount = safeSub(balances[msg.sender].amount, _value);
        balances[_to].amount = safeAdd(balances[_to].amount, _value);

		Transfer(msg.sender, _to, _value); //Notify anyone listening that this transfer took place
        return true;
	}

	function transferFrom(address _from, address _to, uint _value) whenNotPaused returns (bool success) {
		var _allowance = allowed[_from][msg.sender];

	    update(_from);              // Do this to ensure sender has enough funds.
		update(_to); 

		balances[_to].amount = safeAdd(balances[_to].amount, _value);
		balances[_from].amount = safeSub(balances[_from].amount, _value);
		allowed[_from][msg.sender] = safeSub(_allowance, _value);
		Transfer(_from, _to, _value);
		return true;
	}

  	function approve(address _spender, uint _value) whenNotPaused returns (bool success) {
		require((_value == 0) || (allowed[msg.sender][_spender] == 0));
    	allowed[msg.sender][_spender] = _value;
    	Approval(msg.sender, _spender, _value);
    	return true;
  	}

  	function allowance(address _owner, address _spender) constant returns (uint remaining) {
    	return allowed[_owner][_spender];
  	}

	// Minting Functions 
	address public authorisedMinter;

	function setMinter(address minter) onlyOwner {
		authorisedMinter = minter;
	}
	
	function mintTokens(address destination, uint256 amount) {
		require(msg.sender == authorisedMinter);
		update(destination);
		balances[destination].amount = safeAdd(balances[destination].amount, amount);
		balances[destination].lastUpdated = now;
		balances[destination].nextAllocationIndex = currentAllocations.length;
		TokenMinted(destination,amount);
	}

	function burnTokens(address source, uint256 amount) {
		require(msg.sender == authorisedMinter);
		update(source);
		balances[source].amount = safeSub(balances[source].amount,amount);
		balances[source].lastUpdated = now;
		balances[source].nextAllocationIndex = currentAllocations.length;
		TokenBurned(source,amount);
	}
}

//**************** HelloGoldSale

contract HelloGoldSale is Pausable, SafeMath {

  uint256 public decimals = 8;

  uint256 public startDate = 1503892800;      // Monday, August 28, 2017 12:00:00 PM GMT+08:00
  uint256 public endDate   = 1504497600;      // Monday, September 4, 2017 12:00:00 PM GMT+08:00

  uint256 tranchePeriod = 1 weeks;

  // address of HGT Token. HGT must Approve this contract to disburse 300M tokens
  HelloGoldToken          token;

  uint256 constant MaxCoinsR1      = 180 * 10**6 * 10**8;   // 180M HGT
  uint256 public coinsRemaining    = 180 * 10**6 * 10**8; 
  uint256 coinsPerTier             =  20 * 10**6 * 10**8;   // 20M HGT
  uint256 public coinsLeftInTier   =  20 * 10**6 * 10**8;

  uint256 public minimumCap        =  0;   // 40M HGT

  uint256 numTiers                  = 5;
  uint16  public tierNo;
  uint256 public preallocCoins;   // used for testing against cap (inc placement)
  uint256 public purchasedCoins;  // used for testing against tier pricing
  uint256 public ethRaised;
  uint256 public personalMax        = 10 * 1 ether;     // max ether per person during public sale
  uint256 public contributors;

  address public cs;
  address public multiSig;
  address public HGT_Reserve;
  
  struct csAction  {
      bool        passedKYC;
      bool        blocked;
  }

  /* This creates an array with all balances */
  mapping (address => csAction) public permissions;
  mapping (address => uint256)  public deposits;

  modifier MustBeEnabled(address x) {
      require (!permissions[x].blocked) ;
      require (permissions[x].passedKYC) ;
      
      _;
  }

  function HelloGoldSale(address _cs, address _hgt, address _multiSig, address _reserve) {
    cs          = _cs;
    token       = HelloGoldToken(_hgt);
    multiSig    = _multiSig;
    HGT_Reserve = _reserve;
  }

  // We only expect to use this to set/reset the start of the contract under exceptional circumstances
  function setStart(uint256 when_) onlyOwner {
      startDate = when_;
      endDate = when_ + tranchePeriod;
  }

  modifier MustBeCs() {
      require (msg.sender == cs) ;
      
      _;
  }


  // 1 ether = N HGT tokens 
  uint256[5] public hgtRates = [1248900000000,1196900000000,1144800000000,1092800000000,1040700000000];
                      

    /* Approve the account for operation */
    function approve(address user) MustBeCs {
        permissions[user].passedKYC = true;
    }
    
    function block(address user) MustBeCs {
        permissions[user].blocked = true;
    }

    function unblock(address user) MustBeCs {
         permissions[user].blocked = false;
    }

    function newCs(address newCs) onlyOwner {
        cs = newCs;
    }

    function setPeriod(uint256 period_) onlyOwner {
        require (!funding()) ;
        tranchePeriod = period_;
        endDate = startDate + tranchePeriod;
        if (endDate < now + tranchePeriod) {
            endDate = now + tranchePeriod;
        }
    }

    function when()  constant returns (uint256) {
        return now;
    }

  function funding() constant returns (bool) {     
    if (paused) return false;               // frozen
    if (now < startDate) return false;      // too early
    if (now > endDate) return false;        // too late
    if (coinsRemaining == 0) return false;  // no more coins
    if (tierNo >= numTiers ) return false;  // passed end of top tier. Tiers start at zero
    return true;
  }

  function success() constant returns (bool succeeded) {
    if (coinsRemaining == 0) return true;
    bool complete = (now > endDate) ;
    bool didOK = (coinsRemaining <= (MaxCoinsR1 - minimumCap)); // not even 40M Gone?? Aargh.
    succeeded = (complete && didOK)  ;  // (out of steam but enough sold) 
    return ;
  }

  function failed() constant returns (bool didNotSucceed) {
    bool complete = (now > endDate  );
    bool didBad = (coinsRemaining > (MaxCoinsR1 - minimumCap));
    didNotSucceed = (complete && didBad);
    return;
  }

  
  function () payable MustBeEnabled(msg.sender) whenNotPaused {    
    createTokens(msg.sender,msg.value);
  }

  function linkCoin(address coin) onlyOwner {
    token = HelloGoldToken(coin);
  }

  function coinAddress() constant returns (address) {
      return address(token);
  }

  // hgtRates in whole tokens per ETH
  // max individual contribution in whole ETH
  function setHgtRates(uint256 p0,uint256 p1,uint256 p2,uint256 p3,uint256 p4, uint256 _max ) onlyOwner {
              require (now < startDate) ;
              hgtRates[0]   = p0 * 10**8;
              hgtRates[1]   = p1 * 10**8;
              hgtRates[2]   = p2 * 10**8;
              hgtRates[3]   = p3 * 10**8;
              hgtRates[4]   = p4 * 10**8;
              personalMax = _max * 1 ether;           // max ETH per person
  }

  
  event Purchase(address indexed buyer, uint256 level,uint256 value, uint256 tokens);
  event Reduction(string msg, address indexed buyer, uint256 wanted, uint256 allocated);
  
  function createTokens(address recipient, uint256 value) private {
    uint256 totalTokens;
    uint256 hgtRate;
    require (funding()) ;
    require (value > 1 finney) ;
    require (deposits[recipient] < personalMax);

    uint256 maxRefund = 0;
    if ((deposits[msg.sender] + value) > personalMax) {
        maxRefund = deposits[msg.sender] + value - personalMax;
        value -= maxRefund;
        log0("maximum funds exceeded");
    }  

    uint256 val = value;

    ethRaised = safeAdd(ethRaised,value);
    if (deposits[recipient] == 0) contributors++;
    
    
    do {
      hgtRate = hgtRates[tierNo];                 // hgtRate must include the 10^8
      uint tokens = safeMul(val, hgtRate);      // (val in eth * 10^18) * #tokens per eth
      tokens = safeDiv(tokens, 1 ether);      // val is in ether, msg.value is in wei
   
      if (tokens <= coinsLeftInTier) {
        uint256 actualTokens = tokens;
        uint refund = 0;
        if (tokens > coinsRemaining) { //can't sell desired # tokens
            Reduction("in tier",recipient,tokens,coinsRemaining);
            actualTokens = coinsRemaining;
            refund = safeSub(tokens, coinsRemaining ); // refund amount in tokens
            refund = safeDiv(refund*1 ether,hgtRate );  // refund amount in ETH
            // need a refund mechanism here too
            coinsRemaining = 0;
            val = safeSub( val,refund);
        } else {
            coinsRemaining  = safeSub(coinsRemaining,  actualTokens);
        }
        purchasedCoins  = safeAdd(purchasedCoins, actualTokens);

        totalTokens = safeAdd(totalTokens,actualTokens);

        require (token.transferFrom(HGT_Reserve, recipient,totalTokens)) ;

        Purchase(recipient,tierNo,val,actualTokens); // event

        deposits[recipient] = safeAdd(deposits[recipient],val); // in case of refund - could pull off etherscan
        refund += maxRefund;
        if (refund > 0) {
            ethRaised = safeSub(ethRaised,refund);
            recipient.transfer(refund);
        }
        if (coinsRemaining <= (MaxCoinsR1 - minimumCap)){ // has passed success criteria
            if (!multiSig.send(this.balance)) {                // send funds to HGF
                log0("cannot forward funds to owner");
            }
        }
        coinsLeftInTier = safeSub(coinsLeftInTier,actualTokens);
        if ((coinsLeftInTier == 0) && (coinsRemaining != 0)) { // exact sell out of non final tier
            coinsLeftInTier = coinsPerTier;
            tierNo++;
            endDate = now + tranchePeriod;
        }
        return;
      }
      // check that coinsLeftInTier >= coinsRemaining

      uint256 coins2buy = min256(coinsLeftInTier , coinsRemaining); 

      endDate = safeAdd( now, tranchePeriod);
      // Have bumped levels - need to modify end date here
      purchasedCoins = safeAdd(purchasedCoins, coins2buy);  // give all coins remaining in this tier
      totalTokens    = safeAdd(totalTokens,coins2buy);
      coinsRemaining = safeSub(coinsRemaining,coins2buy);

      uint weiCoinsLeftInThisTier = safeMul(coins2buy,1 ether);
      uint costOfTheseCoins = safeDiv(weiCoinsLeftInThisTier, hgtRate);  // how much did that cost?

      Purchase(recipient, tierNo,costOfTheseCoins,coins2buy); // event

      deposits[recipient] = safeAdd(deposits[recipient],costOfTheseCoins);
      val    = safeSub(val,costOfTheseCoins);
      tierNo = tierNo + 1;
      coinsLeftInTier = coinsPerTier;
    } while ((val > 0) && funding());

    // escaped because we passed the end of the universe.....
    // so give them their tokens
    require (token.transferFrom(HGT_Reserve, recipient,totalTokens)) ;

    if ((val > 0) || (maxRefund > 0)){
        Reduction("finished crowdsale, returning ",recipient,value,totalTokens);
        // return the remainder !
        recipient.transfer(val+maxRefund); // if you can't return the balance, abort whole process
    }
    if (!multiSig.send(this.balance)) {
        ethRaised = safeSub(ethRaised,this.balance);
        log0("cannot send at tier jump");
    }
  }
  
  function allocatedTokens(address grantee, uint256 numTokens) onlyOwner {
    require (now < startDate) ;
    if (numTokens < coinsRemaining) {
        coinsRemaining = safeSub(coinsRemaining, numTokens);
       
    } else {
        numTokens = coinsRemaining;
        coinsRemaining = 0;
    }
    preallocCoins = safeAdd(preallocCoins,numTokens);
    require (token.transferFrom(HGT_Reserve,grantee,numTokens));
  }

  function withdraw() { // it failed. Come and get your ether.
      if (failed()) {
          if (deposits[msg.sender] > 0) {
              uint256 val = deposits[msg.sender];
              deposits[msg.sender] = 0;
              msg.sender.transfer(val);
          }
      }
  }

  function complete() onlyOwner {  // this should not have to be called. Extreme measures.
      if (success()) {
          uint256 val = this.balance;
          if (val > 0) {
            if (!multiSig.send(val)) {
                log0("cannot withdraw");
            } else {
                log0("funds withdrawn");
            }
          } else {
              log0("nothing to withdraw");
          }
      }
  }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"currentAllocations","outputs":[{"name":"amount","type":"uint256"},{"name":"date","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"source","type":"address"},{"name":"amount","type":"uint256"}],"name":"burnTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"amount","type":"uint256"},{"name":"lastUpdated","type":"uint256"},{"name":"nextAllocationIndex","type":"uint256"},{"name":"allocationShare","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totAllocation","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"where","type":"address"}],"name":"parentFees","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"currentAllocationLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"where","type":"address"}],"name":"balanceOf","outputs":[{"name":"val","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"where","type":"address"}],"name":"updatedBalance","outputs":[{"name":"val","type":"uint256"},{"name":"fees","type":"uint256"},{"name":"pos","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"allocationsOverTime","outputs":[{"name":"amount","type":"uint256"},{"name":"date","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"authorisedMinter","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"partAllocationLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newFC","type":"address"}],"name":"setFeeCalculator","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maxAllocation","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allocationPool","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"feeCalculator","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"numSteps","type":"uint256"}],"name":"addAllocationPartTwo","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"partAllocations","outputs":[{"name":"amount","type":"uint256"},{"name":"date","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_hgt","type":"address"}],"name":"setHGT","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"aotLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"from","type":"uint256"},{"name":"to","type":"uint256"},{"name":"amount","type":"uint256"}],"name":"calcFees","outputs":[{"name":"val","type":"uint256"},{"name":"fee","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newAllocation","type":"uint256"},{"name":"numSteps","type":"uint256"}],"name":"addAllocationPartOne","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"partFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"where","type":"address"},{"name":"newValue","type":"uint256"}],"name":"parentChange","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"HGT","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"destination","type":"address"},{"name":"amount","type":"uint256"}],"name":"mintTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"partPos","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"minter","type":"address"}],"name":"setMinter","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"hgtDecimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"feeCalc","type":"address"}],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DeductFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"destination","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"source","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"date","type":"uint256"}],"name":"Allocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fees","type":"uint256"},{"indexed":false,"name":"date","type":"uint256"}],"name":"FeeOnAllocation","type":"event"},{"anonymous":false,"inputs":[],"name":"PartComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"numLeft","type":"uint256"}],"name":"StillToGo","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"}]

606060409081526002805460ff191690558051908101604052601b81527f48656c6c6f476f6c6420476f6c64204261636b656420546f6b656e0000000000602082015260039080516200005792916020019062000106565b5060408051908101604052600381527f474254000000000000000000000000000000000000000000000000000000000060208201526004908051620000a192916020019062000106565b503415620000ae57600080fd5b60405160208062001e7c833981016040528080519150505b5b60008054600160a060020a03191633600160a060020a03161790555b60068054600160a060020a031916600160a060020a0383161790555b50620001b0565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014957805160ff191683800117855562000179565b8280016001018555821562000179579182015b82811115620001795782518255916020019190600101906200015c565b5b50620001889291506200018c565b5090565b620001ad91905b8082111562000188576000815560010162000193565b5090565b90565b611cbc80620001c06000396000f300606060405236156101f65763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101fb5780630901a3f114610286578063095ea7b3146102b45780630d1118ce146102ea57806318160ddd1461030e57806323b872dd1461033357806327e235e31461036f5780632a774c27146103b9578063313ce567146103de57806336b69367146104035780633e7d1acc146104245780633f4ba83a146104495780635c975abb1461047057806370a0823114610497578063735d3e81146104c857806378388eb61461050b5780637fc29fc9146105395780638456cb591461056857806385a735dd1461058f5780638c66d04f146105b45780638da5cb5b146105d557806395d89b41146106045780639b3ba79f1461068f5780639b9073e4146106b4578063a9059cbb146106d9578063b00eb9fe1461070f578063b64e8ad81461073e578063c074304414610756578063c74a96eb14610784578063cb1a32a4146107a5578063d0699c98146107ca578063d6edb047146107fe578063d8aba1c614610819578063dd62ed3e1461083e578063e5a7b51f14610875578063ed39eab314610899578063f0dda65c146108c8578063f2fde38b146108ec578063f764e8a01461090d578063fca3b5aa14610932578063ffc0d03514610953575b600080fd5b341561020657600080fd5b61020e610978565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561024b5780820151818401525b602001610232565b50505050905090810190601f1680156102785780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561029157600080fd5b61029c600435610a16565b60405191825260208201526040908101905180910390f35b34156102bf57600080fd5b6102d6600160a060020a0360043516602435610a44565b604051901515815260200160405180910390f35b34156102f557600080fd5b61030c600160a060020a0360043516602435610afd565b005b341561031957600080fd5b610321610bbd565b60405190815260200160405180910390f35b341561033e57600080fd5b6102d6600160a060020a0360043581169060243516604435610bc3565b604051901515815260200160405180910390f35b341561037a57600080fd5b61038e600160a060020a0360043516610cf8565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b34156103c457600080fd5b610321610d1f565b60405190815260200160405180910390f35b34156103e957600080fd5b610321610d25565b60405190815260200160405180910390f35b341561040e57600080fd5b61030c600160a060020a0360043516610d2a565b005b341561042f57600080fd5b610321610d63565b60405190815260200160405180910390f35b341561045457600080fd5b6102d6610d6a565b604051901515815260200160405180910390f35b341561047b57600080fd5b6102d6610dd6565b604051901515815260200160405180910390f35b34156104a257600080fd5b610321600160a060020a0360043516610ddf565b60405190815260200160405180910390f35b34156104d357600080fd5b6104e7600160a060020a0360043516610dfc565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561051657600080fd5b61029c600435610f49565b60405191825260208201526040908101905180910390f35b341561054457600080fd5b61054c610f77565b604051600160a060020a03909116815260200160405180910390f35b341561057357600080fd5b6102d6610f86565b604051901515815260200160405180910390f35b341561059a57600080fd5b610321610ff4565b60405190815260200160405180910390f35b34156105bf57600080fd5b61030c600160a060020a0360043516610ffb565b005b34156105e057600080fd5b61054c611043565b604051600160a060020a03909116815260200160405180910390f35b341561060f57600080fd5b61020e611052565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561024b5780820151818401525b602001610232565b50505050905090810190601f1680156102785780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561069a57600080fd5b6103216110f0565b60405190815260200160405180910390f35b34156106bf57600080fd5b6103216110ff565b60405190815260200160405180910390f35b34156106e457600080fd5b6102d6600160a060020a036004351660243561110b565b604051901515815260200160405180910390f35b341561071a57600080fd5b61054c6111e5565b604051600160a060020a03909116815260200160405180910390f35b341561074957600080fd5b61030c6004356111f4565b005b341561076157600080fd5b61029c600435611414565b60405191825260208201526040908101905180910390f35b341561078f57600080fd5b61030c600160a060020a0360043516611442565b005b34156107b057600080fd5b61032161148a565b60405190815260200160405180910390f35b34156107d557600080fd5b61029c600435602435604435611491565b60405191825260208201526040908101905180910390f35b341561080957600080fd5b61030c60043560243561153b565b005b341561082457600080fd5b610321611940565b60405190815260200160405180910390f35b341561084957600080fd5b610321600160a060020a0360043581169060243516611946565b60405190815260200160405180910390f35b341561088057600080fd5b61030c600160a060020a0360043516602435611973565b005b34156108a457600080fd5b61054c6119c2565b604051600160a060020a03909116815260200160405180910390f35b34156108d357600080fd5b61030c600160a060020a03600435166024356119d1565b005b34156108f757600080fd5b61030c600160a060020a0360043516611a91565b005b341561091857600080fd5b610321611ae9565b60405190815260200160405180910390f35b341561093d57600080fd5b61030c600160a060020a0360043516611aef565b005b341561095e57600080fd5b610321611b37565b60405190815260200160405180910390f35b60038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b505050505081565b6009805482908110610a2457fe5b906000526020600020906002020160005b50805460019091015490915082565b60025460009060ff1615610a5757600080fd5b811580610a875750600160a060020a033381166000908152600b6020908152604080832093871683529290522054155b1515610a9257600080fd5b600160a060020a033381166000818152600b6020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b5b92915050565b60105433600160a060020a03908116911614610b1857600080fd5b610b2182611b3c565b600160a060020a0382166000908152600a6020526040902054610b449082611b80565b600160a060020a0383166000908152600a6020526040908190209182554260018301556009546002909201919091557f1af5163f80e79b5e554f61e1d052084d3a3fe1166e42a265798c4e2ddce8ffa2908390839051600160a060020a03909216825260208201526040908101905180910390a15b5050565b60015481565b600254600090819060ff1615610bd857600080fd5b50600160a060020a038085166000908152600b602090815260408083203390941683529290522054610c0985611b3c565b610c1284611b3c565b600160a060020a0384166000908152600a6020526040902054610c359084611b97565b600160a060020a038086166000908152600a60205260408082209390935590871681522054610c649084611b80565b600160a060020a0386166000908152600a6020526040902055610c878184611b80565b600160a060020a038087166000818152600b6020908152604080832033861684529091529081902093909355908616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a3600191505b5b509392505050565b600a6020526000908152604090208054600182015460028301546003909301549192909184565b60055481565b601281565b60025460ff1615610d3a57600080fd5b60075433600160a060020a03908116911614610d5557600080fd5b610d5e81611b3c565b5b5b50565b6009545b90565b6000805433600160a060020a03908116911614610d8657600080fd5b60025460ff161515610d9757600080fd5b6002805460ff191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a15060015b5b5b90565b60025460ff1681565b6000806000610ded84610dfc565b919450925090505b5050919050565b600160a060020a0381166000908152600a602052604081206001810154905482918291829182918291610e30914290611491565b600160a060020a0389166000908152600a6020526040902060020154600954929850909650945084108015610e7f5750600160a060020a0387166000908152600a602052604090206003015415155b15610f3157600160a060020a0387166000908152600a6020526040902060038101546002909101546009805467016345785d8a00009392908110610ebf57fe5b906000526020600020906002020160005b505402811515610edc57fe5b600160a060020a0389166000908152600a602052604090206002015460098054939092049350610f2b928110610f0e57fe5b906000526020600020906002020160005b50600101544283611491565b90935091505b600954958301959482019493505b5050509193909250565b6008805482908110610a2457fe5b906000526020600020906002020160005b50805460019091015490915082565b601054600160a060020a031681565b6000805433600160a060020a03908116911614610fa257600080fd5b60025460ff1615610fb257600080fd5b6002805460ff191660011790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a15060015b5b5b90565b600f545b90565b60005433600160a060020a0390811691161461101657600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600054600160a060020a031681565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b505050505081565b6a0324ae69ab71209700000081565b67016345785d8a000081565b60025460009060ff161561111e57600080fd5b61112733611b3c565b61113083611b3c565b600160a060020a0333166000908152600a60205260409020546111539083611b80565b600160a060020a033381166000908152600a602052604080822093909355908516815220546111829083611b97565b600160a060020a038085166000818152600a602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b5b92915050565b600654600160a060020a031681565b6000805433600160a060020a0390811691161461121057600080fd5b6000821161121d57600080fd5b600c546000901161122d57600080fd5b5060005b8181101561135357600c80546000190190819055600f80546112969290811061125657fe5b906000526020600020906002020160005b506001015442600f600c5481548110151561127e57fe5b906000526020600020906002020160005b5054611491565b600f600c548154811015156112a757fe5b906000526020600020906002020160005b50600d9190915555600e54600f80549091600019019081106112d657fe5b906000526020600020906002020160005b5054600c54600f805490919081106112fb57fe5b906000526020600020906002020160005b5080549091019055600c54600f8054429290811061132657fe5b906000526020600020906002020160005b5060010155600c54151561134a57611353565b5b600101611231565b600c5415611395577fc94f798321235fa17dd9603fb88bb2634abbb740fede709d211ad44ba8c63870600c5460405190815260200160405180910390a1610bb9565b7fcadcbce497c428a85330c77795a87b336eeb93bc01259e2fea1cd998196f935060405160405180910390a17f2a0213f6a9134dfad8fe565f70d7764a32fe66ccfa431bd1f981d6a4db282680600d544260405191825260208201526040908101905180910390a1600f805461140d91600991611bbf565b505b5b5050565b600f805482908110610a2457fe5b906000526020600020906002020160005b50805460019091015490915082565b60005433600160a060020a0390811691161461145d57600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b6008545b90565b6006546000908190600160a060020a031663d0699c9886868685604051604001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff86160281526004810193909352602483019190915260448201526064016040805180830381600087803b151561150d57600080fd5b6102c65a03f1151561151e57600080fd5b50505060405180519060200180519050915091505b935093915050565b6000611545611c20565b60005433600160a060020a0390811691161461156057600080fd5b6005548492506a0324ae69ab712097000000901061157d57600080fd5b600f54600954111561159b576009805461159991600f91611bbf565b505b6005546a0324ae69ab71209700000090830111156115f7576005546a0324ae69ab7120970000000391506040517f6d617820616c6c6f632072656163686564000000000000000000000000000000815260110160405180910390a05b60058054830190557f2ccf21bc8a43b499670fe41c33ca0f7b56c83863aca7c1494f0ede9068d2731a824260405191825260208201526040908101905180910390a181815242602082015260088054600181016116548382611c37565b916000526020600020906002020160005b5082908151815560208201518160010155505050600f805480600101828161168d9190611c37565b916000526020600020906002020160005b50829081518155602082015160019091015550600e55600f54600290101561173d577fcadcbce497c428a85330c77795a87b336eeb93bc01259e2fea1cd998196f935060405160405180910390a1600f80546116fc91600991611bbf565b507f2a0213f6a9134dfad8fe565f70d7764a32fe66ccfa431bd1f981d6a4db28268060004260405191825260208201526040908101905180910390a1611939565b600f5460011901600c555b600c546000901061187d576117a7600f600c5481548110151561125657fe5b906000526020600020906002020160005b506001015442600f600c5481548110151561127e57fe5b906000526020600020906002020160005b5054611491565b600f600c548154811015156117b857fe5b906000526020600020906002020160005b50600d9190915555600e54600f80549091600019019081106117e757fe5b906000526020600020906002020160005b5054600c54600f8054909190811061180c57fe5b906000526020600020906002020160005b5080549091019055600c54600f8054429290811061183757fe5b906000526020600020906002020160005b5060010155600c5415806118635750600f54600c5490849003145b1561186d5761187d565b5b600c8054600019019055611748565b600c54156118bf577fc94f798321235fa17dd9603fb88bb2634abbb740fede709d211ad44ba8c63870600c5460405190815260200160405180910390a1611939565b7fcadcbce497c428a85330c77795a87b336eeb93bc01259e2fea1cd998196f935060405160405180910390a17f2a0213f6a9134dfad8fe565f70d7764a32fe66ccfa431bd1f981d6a4db282680600d544260405191825260208201526040908101905180910390a1600f805461193791600991611bbf565b505b5b50505050565b600d5481565b600160a060020a038083166000908152600b60209081526040808320938516835292905220545b92915050565b60025460ff161561198357600080fd5b60075433600160a060020a0390811691161461199e57600080fd5b600160a060020a0382166000908152600a602052604090206003018190555b5b5050565b600754600160a060020a031681565b60105433600160a060020a039081169116146119ec57600080fd5b6119f582611b3c565b600160a060020a0382166000908152600a6020526040902054611a189082611b97565b600160a060020a0383166000908152600a6020526040908190209182554260018301556009546002909201919091557fb9144c96c86541f6fa89c9f2f02495cccf4b08cd6643e26d34ee00aa586558a8908390839051600160a060020a03909216825260208201526040908101905180910390a15b5050565b60005433600160a060020a03908116911614611aac57600080fd5b600160a060020a03811615610d5e576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b50565b600c5481565b60005433600160a060020a03908116911614611b0a57600080fd5b6010805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600881565b6000806000611b4a84610dfc565b600160a060020a0387166000908152600a6020526040902060028101829055838155426001909101559450925090505b50505050565b600082821115611b8c57fe5b508082035b92915050565b6000828201838110801590611bac5750828110155b1515611bb457fe5b8091505b5092915050565b828054828255906000526020600020906002028101928215611c0f5760005260206000209160020282015b82811115611c0f57825482556001808401549083015560029283019290910190611bea565b5b50611c1c929150611c69565b5090565b604080519081016040526000808252602082015290565b81548183558181151161140d5760020281600202836000526020600020918201910161140d9190611c69565b5b505050565b610d6791905b80821115611c1c5760008082556001820155600201611c6f565b5090565b905600a165627a7a72305820d1d7ef691afa1b02b902bc3e09a7b0a814a25f1bb2083bf2d5917ecbf6abf3d10029000000000000000000000000d56ed0dae33a546d063e60a214dd76538a1ba5ab

Deployed Bytecode

0x606060405236156101f65763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101fb5780630901a3f114610286578063095ea7b3146102b45780630d1118ce146102ea57806318160ddd1461030e57806323b872dd1461033357806327e235e31461036f5780632a774c27146103b9578063313ce567146103de57806336b69367146104035780633e7d1acc146104245780633f4ba83a146104495780635c975abb1461047057806370a0823114610497578063735d3e81146104c857806378388eb61461050b5780637fc29fc9146105395780638456cb591461056857806385a735dd1461058f5780638c66d04f146105b45780638da5cb5b146105d557806395d89b41146106045780639b3ba79f1461068f5780639b9073e4146106b4578063a9059cbb146106d9578063b00eb9fe1461070f578063b64e8ad81461073e578063c074304414610756578063c74a96eb14610784578063cb1a32a4146107a5578063d0699c98146107ca578063d6edb047146107fe578063d8aba1c614610819578063dd62ed3e1461083e578063e5a7b51f14610875578063ed39eab314610899578063f0dda65c146108c8578063f2fde38b146108ec578063f764e8a01461090d578063fca3b5aa14610932578063ffc0d03514610953575b600080fd5b341561020657600080fd5b61020e610978565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561024b5780820151818401525b602001610232565b50505050905090810190601f1680156102785780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561029157600080fd5b61029c600435610a16565b60405191825260208201526040908101905180910390f35b34156102bf57600080fd5b6102d6600160a060020a0360043516602435610a44565b604051901515815260200160405180910390f35b34156102f557600080fd5b61030c600160a060020a0360043516602435610afd565b005b341561031957600080fd5b610321610bbd565b60405190815260200160405180910390f35b341561033e57600080fd5b6102d6600160a060020a0360043581169060243516604435610bc3565b604051901515815260200160405180910390f35b341561037a57600080fd5b61038e600160a060020a0360043516610cf8565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b34156103c457600080fd5b610321610d1f565b60405190815260200160405180910390f35b34156103e957600080fd5b610321610d25565b60405190815260200160405180910390f35b341561040e57600080fd5b61030c600160a060020a0360043516610d2a565b005b341561042f57600080fd5b610321610d63565b60405190815260200160405180910390f35b341561045457600080fd5b6102d6610d6a565b604051901515815260200160405180910390f35b341561047b57600080fd5b6102d6610dd6565b604051901515815260200160405180910390f35b34156104a257600080fd5b610321600160a060020a0360043516610ddf565b60405190815260200160405180910390f35b34156104d357600080fd5b6104e7600160a060020a0360043516610dfc565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561051657600080fd5b61029c600435610f49565b60405191825260208201526040908101905180910390f35b341561054457600080fd5b61054c610f77565b604051600160a060020a03909116815260200160405180910390f35b341561057357600080fd5b6102d6610f86565b604051901515815260200160405180910390f35b341561059a57600080fd5b610321610ff4565b60405190815260200160405180910390f35b34156105bf57600080fd5b61030c600160a060020a0360043516610ffb565b005b34156105e057600080fd5b61054c611043565b604051600160a060020a03909116815260200160405180910390f35b341561060f57600080fd5b61020e611052565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561024b5780820151818401525b602001610232565b50505050905090810190601f1680156102785780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561069a57600080fd5b6103216110f0565b60405190815260200160405180910390f35b34156106bf57600080fd5b6103216110ff565b60405190815260200160405180910390f35b34156106e457600080fd5b6102d6600160a060020a036004351660243561110b565b604051901515815260200160405180910390f35b341561071a57600080fd5b61054c6111e5565b604051600160a060020a03909116815260200160405180910390f35b341561074957600080fd5b61030c6004356111f4565b005b341561076157600080fd5b61029c600435611414565b60405191825260208201526040908101905180910390f35b341561078f57600080fd5b61030c600160a060020a0360043516611442565b005b34156107b057600080fd5b61032161148a565b60405190815260200160405180910390f35b34156107d557600080fd5b61029c600435602435604435611491565b60405191825260208201526040908101905180910390f35b341561080957600080fd5b61030c60043560243561153b565b005b341561082457600080fd5b610321611940565b60405190815260200160405180910390f35b341561084957600080fd5b610321600160a060020a0360043581169060243516611946565b60405190815260200160405180910390f35b341561088057600080fd5b61030c600160a060020a0360043516602435611973565b005b34156108a457600080fd5b61054c6119c2565b604051600160a060020a03909116815260200160405180910390f35b34156108d357600080fd5b61030c600160a060020a03600435166024356119d1565b005b34156108f757600080fd5b61030c600160a060020a0360043516611a91565b005b341561091857600080fd5b610321611ae9565b60405190815260200160405180910390f35b341561093d57600080fd5b61030c600160a060020a0360043516611aef565b005b341561095e57600080fd5b610321611b37565b60405190815260200160405180910390f35b60038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b505050505081565b6009805482908110610a2457fe5b906000526020600020906002020160005b50805460019091015490915082565b60025460009060ff1615610a5757600080fd5b811580610a875750600160a060020a033381166000908152600b6020908152604080832093871683529290522054155b1515610a9257600080fd5b600160a060020a033381166000818152600b6020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b5b92915050565b60105433600160a060020a03908116911614610b1857600080fd5b610b2182611b3c565b600160a060020a0382166000908152600a6020526040902054610b449082611b80565b600160a060020a0383166000908152600a6020526040908190209182554260018301556009546002909201919091557f1af5163f80e79b5e554f61e1d052084d3a3fe1166e42a265798c4e2ddce8ffa2908390839051600160a060020a03909216825260208201526040908101905180910390a15b5050565b60015481565b600254600090819060ff1615610bd857600080fd5b50600160a060020a038085166000908152600b602090815260408083203390941683529290522054610c0985611b3c565b610c1284611b3c565b600160a060020a0384166000908152600a6020526040902054610c359084611b97565b600160a060020a038086166000908152600a60205260408082209390935590871681522054610c649084611b80565b600160a060020a0386166000908152600a6020526040902055610c878184611b80565b600160a060020a038087166000818152600b6020908152604080832033861684529091529081902093909355908616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a3600191505b5b509392505050565b600a6020526000908152604090208054600182015460028301546003909301549192909184565b60055481565b601281565b60025460ff1615610d3a57600080fd5b60075433600160a060020a03908116911614610d5557600080fd5b610d5e81611b3c565b5b5b50565b6009545b90565b6000805433600160a060020a03908116911614610d8657600080fd5b60025460ff161515610d9757600080fd5b6002805460ff191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a15060015b5b5b90565b60025460ff1681565b6000806000610ded84610dfc565b919450925090505b5050919050565b600160a060020a0381166000908152600a602052604081206001810154905482918291829182918291610e30914290611491565b600160a060020a0389166000908152600a6020526040902060020154600954929850909650945084108015610e7f5750600160a060020a0387166000908152600a602052604090206003015415155b15610f3157600160a060020a0387166000908152600a6020526040902060038101546002909101546009805467016345785d8a00009392908110610ebf57fe5b906000526020600020906002020160005b505402811515610edc57fe5b600160a060020a0389166000908152600a602052604090206002015460098054939092049350610f2b928110610f0e57fe5b906000526020600020906002020160005b50600101544283611491565b90935091505b600954958301959482019493505b5050509193909250565b6008805482908110610a2457fe5b906000526020600020906002020160005b50805460019091015490915082565b601054600160a060020a031681565b6000805433600160a060020a03908116911614610fa257600080fd5b60025460ff1615610fb257600080fd5b6002805460ff191660011790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a15060015b5b5b90565b600f545b90565b60005433600160a060020a0390811691161461101657600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600054600160a060020a031681565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b505050505081565b6a0324ae69ab71209700000081565b67016345785d8a000081565b60025460009060ff161561111e57600080fd5b61112733611b3c565b61113083611b3c565b600160a060020a0333166000908152600a60205260409020546111539083611b80565b600160a060020a033381166000908152600a602052604080822093909355908516815220546111829083611b97565b600160a060020a038085166000818152600a602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b5b92915050565b600654600160a060020a031681565b6000805433600160a060020a0390811691161461121057600080fd5b6000821161121d57600080fd5b600c546000901161122d57600080fd5b5060005b8181101561135357600c80546000190190819055600f80546112969290811061125657fe5b906000526020600020906002020160005b506001015442600f600c5481548110151561127e57fe5b906000526020600020906002020160005b5054611491565b600f600c548154811015156112a757fe5b906000526020600020906002020160005b50600d9190915555600e54600f80549091600019019081106112d657fe5b906000526020600020906002020160005b5054600c54600f805490919081106112fb57fe5b906000526020600020906002020160005b5080549091019055600c54600f8054429290811061132657fe5b906000526020600020906002020160005b5060010155600c54151561134a57611353565b5b600101611231565b600c5415611395577fc94f798321235fa17dd9603fb88bb2634abbb740fede709d211ad44ba8c63870600c5460405190815260200160405180910390a1610bb9565b7fcadcbce497c428a85330c77795a87b336eeb93bc01259e2fea1cd998196f935060405160405180910390a17f2a0213f6a9134dfad8fe565f70d7764a32fe66ccfa431bd1f981d6a4db282680600d544260405191825260208201526040908101905180910390a1600f805461140d91600991611bbf565b505b5b5050565b600f805482908110610a2457fe5b906000526020600020906002020160005b50805460019091015490915082565b60005433600160a060020a0390811691161461145d57600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b6008545b90565b6006546000908190600160a060020a031663d0699c9886868685604051604001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff86160281526004810193909352602483019190915260448201526064016040805180830381600087803b151561150d57600080fd5b6102c65a03f1151561151e57600080fd5b50505060405180519060200180519050915091505b935093915050565b6000611545611c20565b60005433600160a060020a0390811691161461156057600080fd5b6005548492506a0324ae69ab712097000000901061157d57600080fd5b600f54600954111561159b576009805461159991600f91611bbf565b505b6005546a0324ae69ab71209700000090830111156115f7576005546a0324ae69ab7120970000000391506040517f6d617820616c6c6f632072656163686564000000000000000000000000000000815260110160405180910390a05b60058054830190557f2ccf21bc8a43b499670fe41c33ca0f7b56c83863aca7c1494f0ede9068d2731a824260405191825260208201526040908101905180910390a181815242602082015260088054600181016116548382611c37565b916000526020600020906002020160005b5082908151815560208201518160010155505050600f805480600101828161168d9190611c37565b916000526020600020906002020160005b50829081518155602082015160019091015550600e55600f54600290101561173d577fcadcbce497c428a85330c77795a87b336eeb93bc01259e2fea1cd998196f935060405160405180910390a1600f80546116fc91600991611bbf565b507f2a0213f6a9134dfad8fe565f70d7764a32fe66ccfa431bd1f981d6a4db28268060004260405191825260208201526040908101905180910390a1611939565b600f5460011901600c555b600c546000901061187d576117a7600f600c5481548110151561125657fe5b906000526020600020906002020160005b506001015442600f600c5481548110151561127e57fe5b906000526020600020906002020160005b5054611491565b600f600c548154811015156117b857fe5b906000526020600020906002020160005b50600d9190915555600e54600f80549091600019019081106117e757fe5b906000526020600020906002020160005b5054600c54600f8054909190811061180c57fe5b906000526020600020906002020160005b5080549091019055600c54600f8054429290811061183757fe5b906000526020600020906002020160005b5060010155600c5415806118635750600f54600c5490849003145b1561186d5761187d565b5b600c8054600019019055611748565b600c54156118bf577fc94f798321235fa17dd9603fb88bb2634abbb740fede709d211ad44ba8c63870600c5460405190815260200160405180910390a1611939565b7fcadcbce497c428a85330c77795a87b336eeb93bc01259e2fea1cd998196f935060405160405180910390a17f2a0213f6a9134dfad8fe565f70d7764a32fe66ccfa431bd1f981d6a4db282680600d544260405191825260208201526040908101905180910390a1600f805461193791600991611bbf565b505b5b50505050565b600d5481565b600160a060020a038083166000908152600b60209081526040808320938516835292905220545b92915050565b60025460ff161561198357600080fd5b60075433600160a060020a0390811691161461199e57600080fd5b600160a060020a0382166000908152600a602052604090206003018190555b5b5050565b600754600160a060020a031681565b60105433600160a060020a039081169116146119ec57600080fd5b6119f582611b3c565b600160a060020a0382166000908152600a6020526040902054611a189082611b97565b600160a060020a0383166000908152600a6020526040908190209182554260018301556009546002909201919091557fb9144c96c86541f6fa89c9f2f02495cccf4b08cd6643e26d34ee00aa586558a8908390839051600160a060020a03909216825260208201526040908101905180910390a15b5050565b60005433600160a060020a03908116911614611aac57600080fd5b600160a060020a03811615610d5e576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b50565b600c5481565b60005433600160a060020a03908116911614611b0a57600080fd5b6010805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600881565b6000806000611b4a84610dfc565b600160a060020a0387166000908152600a6020526040902060028101829055838155426001909101559450925090505b50505050565b600082821115611b8c57fe5b508082035b92915050565b6000828201838110801590611bac5750828110155b1515611bb457fe5b8091505b5092915050565b828054828255906000526020600020906002028101928215611c0f5760005260206000209160020282015b82811115611c0f57825482556001808401549083015560029283019290910190611bea565b5b50611c1c929150611c69565b5090565b604080519081016040526000808252602082015290565b81548183558181151161140d5760020281600202836000526020600020918201910161140d9190611c69565b5b505050565b610d6791905b80821115611c1c5760008082556001820155600201611c6f565b5090565b905600a165627a7a72305820d1d7ef691afa1b02b902bc3e09a7b0a814a25f1bb2083bf2d5917ecbf6abf3d10029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d56ed0dae33a546d063e60a214dd76538a1ba5ab

-----Decoded View---------------
Arg [0] : feeCalc (address): 0xd56ed0DAE33A546D063e60a214Dd76538a1ba5AB

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d56ed0dae33a546d063e60a214dd76538a1ba5ab


Swarm Source

bzzr://d1d7ef691afa1b02b902bc3e09a7b0a814a25f1bb2083bf2d5917ecbf6abf3d1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.