ETH Price: $3,446.86 (+1.42%)

Contract

0x7585F835ae2d522722d2684323a0ba83401f32f5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer99444332020-04-25 22:55:201703 days ago1587855320IN
HelloGold: GBT Token
0 ETH0.000069693
Transfer65730452018-10-24 5:51:272253 days ago1540360287IN
HelloGold: GBT Token
0 ETH0.0012417951
Transfer61866462018-08-21 9:40:082317 days ago1534844408IN
HelloGold: GBT Token
0 ETH0.0009956841
Transfer61865642018-08-21 9:19:252317 days ago1534843165IN
HelloGold: GBT Token
0 ETH0.0009956841
Transfer61817772018-08-20 14:10:232318 days ago1534774223IN
HelloGold: GBT Token
0 ETH0.000998341
Transfer54939742018-04-23 21:56:272436 days ago1524520587IN
HelloGold: GBT Token
0 ETH0.000998341
Transfer54939592018-04-23 21:52:232436 days ago1524520343IN
HelloGold: GBT Token
0 ETH0.000998341
Approve50551802018-02-08 21:25:282510 days ago1518125128IN
HelloGold: GBT Token
0 ETH0.000025331
Approve50551672018-02-08 21:21:442510 days ago1518124904IN
HelloGold: GBT Token
0 ETH0.000025331
Pause48962932018-01-12 13:35:032538 days ago1515764103IN
HelloGold: GBT Token
0 ETH0.002168350
Burn Tokens48962892018-01-12 13:33:352538 days ago1515764015IN
HelloGold: GBT Token
0 ETH0.0030806550
Burn Tokens48962862018-01-12 13:33:072538 days ago1515763987IN
HelloGold: GBT Token
0 ETH0.0030806550
Burn Tokens48962822018-01-12 13:32:102538 days ago1515763930IN
HelloGold: GBT Token
0 ETH0.0030806550
Burn Tokens48962672018-01-12 13:27:172538 days ago1515763637IN
HelloGold: GBT Token
0 ETH0.0030838550
Burn Tokens48962622018-01-12 13:26:072538 days ago1515763567IN
HelloGold: GBT Token
0 ETH0.0030774550
Burn Tokens48962532018-01-12 13:23:312538 days ago1515763411IN
HelloGold: GBT Token
0 ETH0.0030806550
Burn Tokens48961542018-01-12 12:57:032538 days ago1515761823IN
HelloGold: GBT Token
0 ETH0.003658450
Unpause48961482018-01-12 12:55:322538 days ago1515761732IN
HelloGold: GBT Token
0 ETH0.0007229251.213
Pause48913252018-01-11 15:28:532539 days ago1515684533IN
HelloGold: GBT Token
0 ETH0.0043366100
Add Allocation P...48905982018-01-11 12:11:322539 days ago1515672692IN
HelloGold: GBT Token
0 ETH0.0081619725
Transfer47954052017-12-25 16:12:102556 days ago1514218330IN
HelloGold: GBT Token
0 ETH0.0018698.9
Mint Tokens47708352017-12-21 11:22:252560 days ago1513855345IN
HelloGold: GBT Token
0 ETH0.0053985963
Transfer47449412017-12-16 21:56:022564 days ago1513461362IN
HelloGold: GBT Token
0 ETH0.0007560110
Transfer47449192017-12-16 21:49:032564 days ago1513460943IN
HelloGold: GBT Token
0 ETH0.0009060110
Transfer47396172017-12-15 23:43:202565 days ago1513381400IN
HelloGold: GBT Token
0 ETH0.0034480550
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
195676042024-04-02 10:44:47266 days ago1712054687
0x7585F835...3401f32f5
0 ETH
195676032024-04-02 10:44:35266 days ago1712054675
0x7585F835...3401f32f5
0 ETH
192804292024-02-22 3:17:11306 days ago1708571831
0x7585F835...3401f32f5
0 ETH
192072922024-02-11 20:48:35316 days ago1707684515
0x7585F835...3401f32f5
0 ETH
182211942023-09-26 16:38:59455 days ago1695746339
0x7585F835...3401f32f5
0 ETH
177800452023-07-26 21:49:47516 days ago1690408187
0x7585F835...3401f32f5
0 ETH
167224902023-02-27 22:24:59665 days ago1677536699
0x7585F835...3401f32f5
0 ETH
164989452023-01-27 15:08:11697 days ago1674832091
0x7585F835...3401f32f5
0 ETH
163344452023-01-04 15:53:35720 days ago1672847615
0x7585F835...3401f32f5
0 ETH
163211662023-01-02 19:25:59722 days ago1672687559
0x7585F835...3401f32f5
0 ETH
163088822023-01-01 2:19:23723 days ago1672539563
0x7585F835...3401f32f5
0 ETH
160239612022-11-22 7:08:35763 days ago1669100915
0x7585F835...3401f32f5
0 ETH
159692422022-11-14 15:42:47771 days ago1668440567
0x7585F835...3401f32f5
0 ETH
158100282022-10-23 9:50:47793 days ago1666518647
0x7585F835...3401f32f5
0 ETH
154830832022-09-06 8:45:35840 days ago1662453935
0x7585F835...3401f32f5
0 ETH
153576062022-08-17 8:17:43860 days ago1660724263
0x7585F835...3401f32f5
0 ETH
153287372022-08-12 19:03:14865 days ago1660330994
0x7585F835...3401f32f5
0 ETH
153287302022-08-12 19:01:44865 days ago1660330904
0x7585F835...3401f32f5
0 ETH
153071282022-08-09 9:10:51868 days ago1660036251
0x7585F835...3401f32f5
0 ETH
152978142022-08-07 22:15:15869 days ago1659910515
0x7585F835...3401f32f5
0 ETH
152784072022-08-04 21:59:56872 days ago1659650396
0x7585F835...3401f32f5
0 ETH
144997842022-04-01 10:24:07998 days ago1648808647
0x7585F835...3401f32f5
0 ETH
142941182022-02-28 10:35:131030 days ago1646044513
0x7585F835...3401f32f5
0 ETH
139309432022-01-03 6:33:171086 days ago1641191597
0x7585F835...3401f32f5
0 ETH
139309382022-01-03 6:32:581086 days ago1641191578
0x7585F835...3401f32f5
0 ETH
View All Internal Transactions
Loading...
Loading

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.