ETH Price: $2,409.76 (-8.88%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw116540582021-01-14 15:38:441843 days ago1610638724IN
0x0D5Ef019...07c5F424d
0 ETH0.00440642132
Withdraw77487672019-05-13 0:05:032456 days ago1557705903IN
0x0D5Ef019...07c5F424d
0 ETH0.000009070.3
Withdraw77487572019-05-13 0:02:352456 days ago1557705755IN
0x0D5Ef019...07c5F424d
0 ETH0.000009070.3
Withdraw77486002019-05-12 23:23:212456 days ago1557703401IN
0x0D5Ef019...07c5F424d
0 ETH0.000009070.3
Withdraw77485642019-05-12 23:13:372456 days ago1557702817IN
0x0D5Ef019...07c5F424d
0 ETH0.000009050.3
Withdraw77484802019-05-12 22:58:352456 days ago1557701915IN
0x0D5Ef019...07c5F424d
0 ETH0.000009050.3
Withdraw77484412019-05-12 22:50:192456 days ago1557701419IN
0x0D5Ef019...07c5F424d
0 ETH0.000009050.3
Withdraw77483462019-05-12 22:27:182456 days ago1557700038IN
0x0D5Ef019...07c5F424d
0 ETH0.000009050.3
Withdraw77483202019-05-12 22:22:162456 days ago1557699736IN
0x0D5Ef019...07c5F424d
0 ETH0.000009050.3
Withdraw77482902019-05-12 22:16:042456 days ago1557699364IN
0x0D5Ef019...07c5F424d
0 ETH0.000009070.3
Withdraw77482472019-05-12 22:05:332456 days ago1557698733IN
0x0D5Ef019...07c5F424d
0 ETH0.000009050.3
Withdraw77481932019-05-12 21:55:162456 days ago1557698116IN
0x0D5Ef019...07c5F424d
0 ETH0.000009050.3
Deposit72802622019-02-28 21:14:052529 days ago1551388445IN
0x0D5Ef019...07c5F424d
0 ETH0.000153843
Withdraw71730142019-02-04 10:48:512553 days ago1549277331IN
0x0D5Ef019...07c5F424d
0 ETH0.0005759619
Withdraw71730042019-02-04 10:46:262553 days ago1549277186IN
0x0D5Ef019...07c5F424d
0 ETH0.0005747519
Deposit70734652019-01-16 1:39:412573 days ago1547602781IN
0x0D5Ef019...07c5F424d
0 ETH0.000102562
Withdraw69378722018-12-23 10:30:332596 days ago1545561033IN
0x0D5Ef019...07c5F424d
0 ETH0.000090553
Withdraw69329672018-12-22 14:29:492597 days ago1545488989IN
0x0D5Ef019...07c5F424d
0 ETH0.000271116
Withdraw69264372018-12-21 11:41:172598 days ago1545392477IN
0x0D5Ef019...07c5F424d
0 ETH0.000090553
Withdraw69264142018-12-21 11:36:052598 days ago1545392165IN
0x0D5Ef019...07c5F424d
0 ETH0.000180744
Deposit69263982018-12-21 11:32:202598 days ago1545391940IN
0x0D5Ef019...07c5F424d
0 ETH0.000109033
Withdraw69257072018-12-21 8:45:532599 days ago1545381953IN
0x0D5Ef019...07c5F424d
0 ETH0.000407259
Withdraw69215532018-12-20 15:54:392599 days ago1545321279IN
0x0D5Ef019...07c5F424d
0 ETH0.000302510
Claim Failed Con...69212682018-12-20 14:41:002599 days ago1545316860IN
0x0D5Ef019...07c5F424d
0 ETH0.000830536
Claim Failed Con...69212592018-12-20 14:36:582599 days ago1545316618IN
0x0D5Ef019...07c5F424d
0 ETH0.000712687.2
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-69151972018-12-19 13:49:232600 days ago1545227363
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69151552018-12-19 13:38:192600 days ago1545226699
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69151202018-12-19 13:31:142600 days ago1545226274
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69150942018-12-19 13:24:302600 days ago1545225870
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69150662018-12-19 13:16:582600 days ago1545225418
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69150402018-12-19 13:09:212600 days ago1545224961
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69150082018-12-19 13:00:472600 days ago1545224447
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69149742018-12-19 12:52:402600 days ago1545223960
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69149432018-12-19 12:45:172600 days ago1545223517
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69149142018-12-19 12:37:122600 days ago1545223032
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69148302018-12-19 12:15:462600 days ago1545221746
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69147752018-12-19 12:01:202600 days ago1545220880
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69146282018-12-19 11:25:192600 days ago1545218719
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69145952018-12-19 11:16:002600 days ago1545218160
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69145512018-12-19 11:07:592600 days ago1545217679
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69144092018-12-19 10:30:312600 days ago1545215431
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69143322018-12-19 10:13:092600 days ago1545214389
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69142802018-12-19 10:00:362600 days ago1545213636
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69142262018-12-19 9:46:562600 days ago1545212816
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69141882018-12-19 9:37:432600 days ago1545212263
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69141412018-12-19 9:26:302601 days ago1545211590
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69141022018-12-19 9:14:002601 days ago1545210840
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69140652018-12-19 9:06:422601 days ago1545210402
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69140312018-12-19 8:57:472601 days ago1545209867
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
-69139472018-12-19 8:37:042601 days ago1545208624
0x0D5Ef019...07c5F424d
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
IexecHub

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-06-13
*/

//v1.0.14
//License: Apache2.0
pragma solidity ^0.4.8;

contract TokenSpender {
    function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData);
}

pragma solidity ^0.4.8;

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

pragma solidity ^0.4.8;

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

  function assert(bool assertion) internal {
    if (!assertion) {
      throw;
    }
  }
}

pragma solidity ^0.4.21;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 * last open zepplin version used for : add sub mul div function : https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/math/SafeMath.sol
* commit : https://github.com/OpenZeppelin/zeppelin-solidity/commit/815d9e1f457f57cfbb1b4e889f2255c9a517f661
 */
library SafeMathOZ
{
	function add(uint256 a, uint256 b) internal pure returns (uint256)
	{
		uint256 c = a + b;
		assert(c >= a);
		return c;
	}

	function sub(uint256 a, uint256 b) internal pure returns (uint256)
	{
		assert(b <= a);
		return a - b;
	}

	function mul(uint256 a, uint256 b) internal pure returns (uint256)
	{
		if (a == 0)
		{
			return 0;
		}
		uint256 c = a * b;
		assert(c / a == b);
		return c;
	}

	function div(uint256 a, uint256 b) internal pure returns (uint256)
	{
		// assert(b > 0); // Solidity automatically throws when dividing by 0
		uint256 c = a / b;
		// assert(a == b * c + a % b); // There is no case in which this doesn't hold
		return c;
	}

	function max(uint256 a, uint256 b) internal pure returns (uint256)
	{
		return a >= b ? a : b;
	}

	function min(uint256 a, uint256 b) internal pure returns (uint256)
	{
		return a < b ? a : b;
	}

	function mulByFraction(uint256 a, uint256 b, uint256 c) internal pure returns (uint256)
	{
		return div(mul(a, b), c);
	}

	function percentage(uint256 a, uint256 b) internal pure returns (uint256)
	{
		return mulByFraction(a, b, 100);
	}
	// Source : https://ethereum.stackexchange.com/questions/8086/logarithm-math-operation-in-solidity
	function log(uint x) internal pure returns (uint y)
	{
		assembly
		{
			let arg := x
			x := sub(x,1)
			x := or(x, div(x, 0x02))
			x := or(x, div(x, 0x04))
			x := or(x, div(x, 0x10))
			x := or(x, div(x, 0x100))
			x := or(x, div(x, 0x10000))
			x := or(x, div(x, 0x100000000))
			x := or(x, div(x, 0x10000000000000000))
			x := or(x, div(x, 0x100000000000000000000000000000000))
			x := add(x, 1)
			let m := mload(0x40)
			mstore(m,           0xf8f9cbfae6cc78fbefe7cdc3a1793dfcf4f0e8bbd8cec470b6a28a7a5a3e1efd)
			mstore(add(m,0x20), 0xf5ecf1b3e9debc68e1d9cfabc5997135bfb7a7a3938b7b606b5b4b3f2f1f0ffe)
			mstore(add(m,0x40), 0xf6e4ed9ff2d6b458eadcdf97bd91692de2d4da8fd2d0ac50c6ae9a8272523616)
			mstore(add(m,0x60), 0xc8c0b887b0a8a4489c948c7f847c6125746c645c544c444038302820181008ff)
			mstore(add(m,0x80), 0xf7cae577eec2a03cf3bad76fb589591debb2dd67e0aa9834bea6925f6a4a2e0e)
			mstore(add(m,0xa0), 0xe39ed557db96902cd38ed14fad815115c786af479b7e83247363534337271707)
			mstore(add(m,0xc0), 0xc976c13bb96e881cb166a933a55e490d9d56952b8d4e801485467d2362422606)
			mstore(add(m,0xe0), 0x753a6d1b65325d0c552a4d1345224105391a310b29122104190a110309020100)
			mstore(0x40, add(m, 0x100))
			let magic := 0x818283848586878898a8b8c8d8e8f929395969799a9b9d9e9faaeb6bedeeff
			let shift := 0x100000000000000000000000000000000000000000000000000000000000000
			let a := div(mul(x, magic), shift)
			y := div(mload(add(m,sub(255,a))), shift)
			y := add(y, mul(256, gt(arg, 0x8000000000000000000000000000000000000000000000000000000000000000)))
		}
	}
}


pragma solidity ^0.4.8;

contract Ownable {
  address public owner;

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

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

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

}

pragma solidity ^0.4.21;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract OwnableOZ
{
	address public m_owner;
	bool    public m_changeable;

	event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

	/**
	 * @dev Throws if called by any account other than the owner.
	 */
	modifier onlyOwner()
	{
		require(msg.sender == m_owner);
		_;
	}

	/**
	 * @dev The Ownable constructor sets the original `owner` of the contract to the sender
	 * account.
	 */
	function OwnableOZ() public
	{
		m_owner      = msg.sender;
		m_changeable = true;
	}

	/**
	 * @dev Allows the current owner to transfer control of the contract to a newOwner.
	 * @param _newOwner The address to transfer ownership to.
	 */
	function setImmutableOwnership(address _newOwner) public onlyOwner
	{
		require(m_changeable);
		require(_newOwner != address(0));
		emit OwnershipTransferred(m_owner, _newOwner);
		m_owner      = _newOwner;
		m_changeable = false;
	}

}


pragma solidity ^0.4.8;

contract RLC is ERC20, SafeMath, Ownable {

    /* Public variables of the token */
  string public name;       //fancy name
  string public symbol;
  uint8 public decimals;    //How many decimals to show.
  string public version = 'v0.1';
  uint public initialSupply;
  uint public totalSupply;
  bool public locked;
  //uint public unlockBlock;

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

  // lock transfer during the ICO
  modifier onlyUnlocked() {
    if (msg.sender != owner && locked) throw;
    _;
  }

  /*
   *  The RLC Token created with the time at which the crowdsale end
   */

  function RLC() {
    // lock the transfer function during the crowdsale
    locked = true;
    //unlockBlock=  now + 45 days; // (testnet) - for mainnet put the block number

    initialSupply = 87000000000000000;
    totalSupply = initialSupply;
    balances[msg.sender] = initialSupply;// Give the creator all initial tokens
    name = 'iEx.ec Network Token';        // Set the name for display purposes
    symbol = 'RLC';                       // Set the symbol for display purposes
    decimals = 9;                        // Amount of decimals for display purposes
  }

  function unlock() onlyOwner {
    locked = false;
  }

  function burn(uint256 _value) returns (bool){
    balances[msg.sender] = safeSub(balances[msg.sender], _value) ;
    totalSupply = safeSub(totalSupply, _value);
    Transfer(msg.sender, 0x0, _value);
    return true;
  }

  function transfer(address _to, uint _value) onlyUnlocked returns (bool) {
    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) onlyUnlocked returns (bool) {
    var _allowance = allowed[_from][msg.sender];

    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) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

    /* Approve and then comunicate the approved contract in a single tx */
  function approveAndCall(address _spender, uint256 _value, bytes _extraData){
      TokenSpender spender = TokenSpender(_spender);
      if (approve(_spender, _value)) {
          spender.receiveApproval(msg.sender, _value, this, _extraData);
      }
  }

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

}


pragma solidity ^0.4.21;

library IexecLib
{
	/***************************************************************************/
	/*                              Market Order                               */
	/***************************************************************************/
	enum MarketOrderDirectionEnum
	{
		UNSET,
		BID,
		ASK,
		CLOSED
	}
	struct MarketOrder
	{
		MarketOrderDirectionEnum direction;
		uint256 category;        // runtime selection
		uint256 trust;           // for PoCo
		uint256 value;           // value/cost/price
		uint256 volume;          // quantity of instances (total)
		uint256 remaining;       // remaining instances
		address workerpool;      // BID can use null for any
		address workerpoolOwner; // fix ownership if workerpool ownership change during the workorder steps
	}

	/***************************************************************************/
	/*                               Work Order                                */
	/***************************************************************************/
	enum WorkOrderStatusEnum
	{
		UNSET,     // Work order not yet initialized (invalid address)
		ACTIVE,    // Marketed → constributions are open
		REVEALING, // Starting consensus reveal
		CLAIMED,   // failed consensus
		COMPLETED  // Concensus achieved
	}

	/***************************************************************************/
	/*                                Consensus                                */
	/*                                   ---                                   */
	/*                         used in WorkerPool.sol                          */
	/***************************************************************************/
	struct Consensus
	{
		uint256 poolReward;
		uint256 stakeAmount;
		bytes32 consensus;
		uint256 revealDate;
		uint256 revealCounter;
		uint256 consensusTimeout;
		uint256 winnerCount;
		address[] contributors;
		address workerpoolOwner;
		uint256 schedulerRewardRatioPolicy;

	}

	/***************************************************************************/
	/*                              Contribution                               */
	/*                                   ---                                   */
	/*                         used in WorkerPool.sol                          */
	/***************************************************************************/
	enum ContributionStatusEnum
	{
		UNSET,
		AUTHORIZED,
		CONTRIBUTED,
		PROVED,
		REJECTED
	}
	struct Contribution
	{
		ContributionStatusEnum status;
		bytes32 resultHash;
		bytes32 resultSign;
		address enclaveChallenge;
		uint256 score;
		uint256 weight;
	}

	/***************************************************************************/
	/*                Account / ContributionHistory / Category                 */
	/*                                   ---                                   */
	/*                          used in IexecHub.sol                           */
	/***************************************************************************/
	struct Account
	{
		uint256 stake;
		uint256 locked;
	}

	struct ContributionHistory // for credibility computation, f = failed/total
	{
		uint256 success;
		uint256 failed;
	}

	struct Category
	{
		uint256 catid;
		string  name;
		string  description;
		uint256 workClockTimeRef;
	}

}


pragma solidity ^0.4.21;

contract WorkOrder
{


	event WorkOrderActivated();
	event WorkOrderReActivated();
	event WorkOrderRevealing();
	event WorkOrderClaimed  ();
	event WorkOrderCompleted();

	/**
	 * Members
	 */
	IexecLib.WorkOrderStatusEnum public m_status;

	uint256 public m_marketorderIdx;

	address public m_app;
	address public m_dataset;
	address public m_workerpool;
	address public m_requester;

	uint256 public m_emitcost;
	string  public m_params;
	address public m_callback;
	address public m_beneficiary;

	bytes32 public m_resultCallbackProof;
	string  public m_stdout;
	string  public m_stderr;
	string  public m_uri;

	address public m_iexecHubAddress;

	modifier onlyIexecHub()
	{
		require(msg.sender == m_iexecHubAddress);
		_;
	}

	/**
	 * Constructor
	 */
	function WorkOrder(
		uint256 _marketorderIdx,
		address _requester,
		address _app,
		address _dataset,
		address _workerpool,
		uint256 _emitcost,
		string  _params,
		address _callback,
		address _beneficiary)
	public
	{
		m_iexecHubAddress = msg.sender;
		require(_requester != address(0));
		m_status         = IexecLib.WorkOrderStatusEnum.ACTIVE;
		m_marketorderIdx = _marketorderIdx;
		m_app            = _app;
		m_dataset        = _dataset;
		m_workerpool     = _workerpool;
		m_requester      = _requester;
		m_emitcost       = _emitcost;
		m_params         = _params;
		m_callback       = _callback;
		m_beneficiary    = _beneficiary;
		// needed for the scheduler to authorize api token access on this m_beneficiary address in case _requester is a smart contract.
	}

	function startRevealingPhase() public returns (bool)
	{
		require(m_workerpool == msg.sender);
		require(m_status == IexecLib.WorkOrderStatusEnum.ACTIVE);
		m_status = IexecLib.WorkOrderStatusEnum.REVEALING;
		emit WorkOrderRevealing();
		return true;
	}

	function reActivate() public returns (bool)
	{
		require(m_workerpool == msg.sender);
		require(m_status == IexecLib.WorkOrderStatusEnum.REVEALING);
		m_status = IexecLib.WorkOrderStatusEnum.ACTIVE;
		emit WorkOrderReActivated();
		return true;
	}


	function claim() public onlyIexecHub
	{
		require(m_status == IexecLib.WorkOrderStatusEnum.ACTIVE || m_status == IexecLib.WorkOrderStatusEnum.REVEALING);
		m_status = IexecLib.WorkOrderStatusEnum.CLAIMED;
		emit WorkOrderClaimed();
	}


	function setResult(string _stdout, string _stderr, string _uri) public onlyIexecHub
	{
		require(m_status == IexecLib.WorkOrderStatusEnum.REVEALING);
		m_status = IexecLib.WorkOrderStatusEnum.COMPLETED;
		m_stdout = _stdout;
		m_stderr = _stderr;
		m_uri    = _uri;
		m_resultCallbackProof =keccak256(_stdout,_stderr,_uri);
		emit WorkOrderCompleted();
	}

}

pragma solidity ^0.4.21;

contract IexecHubInterface
{
	RLC public rlc;

	function attachContracts(
		address _tokenAddress,
		address _marketplaceAddress,
		address _workerPoolHubAddress,
		address _appHubAddress,
		address _datasetHubAddress)
		public;

	function setCategoriesCreator(
		address _categoriesCreator)
	public;

	function createCategory(
		string  _name,
		string  _description,
		uint256 _workClockTimeRef)
	public returns (uint256 catid);

	function createWorkerPool(
		string  _description,
		uint256 _subscriptionLockStakePolicy,
		uint256 _subscriptionMinimumStakePolicy,
		uint256 _subscriptionMinimumScorePolicy)
	external returns (address createdWorkerPool);

	function createApp(
		string  _appName,
		uint256 _appPrice,
		string  _appParams)
	external returns (address createdApp);

	function createDataset(
		string  _datasetName,
		uint256 _datasetPrice,
		string  _datasetParams)
	external returns (address createdDataset);

	function buyForWorkOrder(
		uint256 _marketorderIdx,
		address _workerpool,
		address _app,
		address _dataset,
		string  _params,
		address _callback,
		address _beneficiary)
	external returns (address);

	function isWoidRegistred(
		address _woid)
	public view returns (bool);

	function lockWorkOrderCost(
		address _requester,
		address _workerpool, // Address of a smartcontract
		address _app,        // Address of a smartcontract
		address _dataset)    // Address of a smartcontract
	internal returns (uint256);

	function claimFailedConsensus(
		address _woid)
	public returns (bool);

	function finalizeWorkOrder(
		address _woid,
		string  _stdout,
		string  _stderr,
		string  _uri)
	public returns (bool);

	function getCategoryWorkClockTimeRef(
		uint256 _catId)
	public view returns (uint256 workClockTimeRef);

	function existingCategory(
		uint256 _catId)
	public view  returns (bool categoryExist);

	function getCategory(
		uint256 _catId)
		public view returns (uint256 catid, string name, string  description, uint256 workClockTimeRef);

	function getWorkerStatus(
		address _worker)
	public view returns (address workerPool, uint256 workerScore);

	function getWorkerScore(address _worker) public view returns (uint256 workerScore);

	function registerToPool(address _worker) public returns (bool subscribed);

	function unregisterFromPool(address _worker) public returns (bool unsubscribed);

	function evictWorker(address _worker) public returns (bool unsubscribed);

	function removeWorker(address _workerpool, address _worker) internal returns (bool unsubscribed);

	function lockForOrder(address _user, uint256 _amount) public returns (bool);

	function unlockForOrder(address _user, uint256 _amount) public returns (bool);

	function lockForWork(address _woid, address _user, uint256 _amount) public returns (bool);

	function unlockForWork(address _woid, address _user, uint256 _amount) public returns (bool);

	function rewardForWork(address _woid, address _worker, uint256 _amount, bool _reputation) public returns (bool);

	function seizeForWork(address _woid, address _worker, uint256 _amount, bool _reputation) public returns (bool);

	function deposit(uint256 _amount) external returns (bool);

	function withdraw(uint256 _amount) external returns (bool);

	function checkBalance(address _owner) public view returns (uint256 stake, uint256 locked);

	function reward(address _user, uint256 _amount) internal returns (bool);

	function seize(address _user, uint256 _amount) internal returns (bool);

	function lock(address _user, uint256 _amount) internal returns (bool);

	function unlock(address _user, uint256 _amount) internal returns (bool);
}


pragma solidity ^0.4.21;

contract IexecHubAccessor
{
	IexecHubInterface internal iexecHubInterface;

	modifier onlyIexecHub()
	{
		require(msg.sender == address(iexecHubInterface));
		_;
	}

	function IexecHubAccessor(address _iexecHubAddress) public
	{
		require(_iexecHubAddress != address(0));
		iexecHubInterface = IexecHubInterface(_iexecHubAddress);
	}

}

pragma solidity ^0.4.21;

contract IexecCallbackInterface
{

	function workOrderCallback(
		address _woid,
		string  _stdout,
		string  _stderr,
		string  _uri) public returns (bool);

	event WorkOrderCallback(address woid, string stdout, string stderr, string uri);
}

pragma solidity ^0.4.21;
contract MarketplaceInterface
{
	function createMarketOrder(
		IexecLib.MarketOrderDirectionEnum _direction,
		uint256 _category,
		uint256 _trust,
		uint256 _value,
		address _workerpool,
		uint256 _volume)
	public returns (uint);

	function closeMarketOrder(
		uint256 _marketorderIdx)
	public returns (bool);

	function getMarketOrderValue(
		uint256 _marketorderIdx)
	public view returns(uint256);

	function getMarketOrderWorkerpoolOwner(
		uint256 _marketorderIdx)
	public view returns(address);

	function getMarketOrderCategory(
		uint256 _marketorderIdx)
	public view returns (uint256);

	function getMarketOrderTrust(
		uint256 _marketorderIdx)
	public view returns(uint256);

	function getMarketOrder(
		uint256 _marketorderIdx)
	public view returns(
		IexecLib.MarketOrderDirectionEnum direction,
		uint256 category,       // runtime selection
		uint256 trust,          // for PoCo
		uint256 value,          // value/cost/price
		uint256 volume,         // quantity of instances (total)
		uint256 remaining,      // remaining instances
		address workerpool);    // BID can use null for any
}


pragma solidity ^0.4.21;

contract MarketplaceAccessor
{
	address              internal marketplaceAddress;
	MarketplaceInterface internal marketplaceInterface;
/* not used
	modifier onlyMarketplace()
	{
		require(msg.sender == marketplaceAddress);
		_;
	}*/

	function MarketplaceAccessor(address _marketplaceAddress) public
	{
		require(_marketplaceAddress != address(0));
		marketplaceAddress   = _marketplaceAddress;
		marketplaceInterface = MarketplaceInterface(_marketplaceAddress);
	}
}

pragma solidity ^0.4.21;

contract WorkerPool is OwnableOZ, IexecHubAccessor, MarketplaceAccessor
{
	using SafeMathOZ for uint256;


	/**
	 * Members
	 */
	string                      public m_description;
	uint256                     public m_stakeRatioPolicy;               // % of reward to stake
	uint256                     public m_schedulerRewardRatioPolicy;     // % of reward given to scheduler
	uint256                     public m_subscriptionLockStakePolicy;    // Stake locked when in workerpool - Constant set by constructor, do not update
	uint256                     public m_subscriptionMinimumStakePolicy; // Minimum stake for subscribing
	uint256                     public m_subscriptionMinimumScorePolicy; // Minimum score for subscribing
	address[]                   public m_workers;
	mapping(address => uint256) public m_workerIndex;

	// mapping(woid => IexecLib.Consensus)
	mapping(address => IexecLib.Consensus) public m_consensus;
	// mapping(woid => worker address => Contribution);
	mapping(address => mapping(address => IexecLib.Contribution)) public m_contributions;

	uint256 public constant REVEAL_PERIOD_DURATION_RATIO  = 2;
	uint256 public constant CONSENSUS_DURATION_RATIO      = 10;

	/**
	 * Address of slave/related contracts
	 */
	address        public  m_workerPoolHubAddress;


	/**
	 * Events
	 */
	event WorkerPoolPolicyUpdate(
		uint256 oldStakeRatioPolicy,               uint256 newStakeRatioPolicy,
		uint256 oldSchedulerRewardRatioPolicy,     uint256 newSchedulerRewardRatioPolicy,
		uint256 oldSubscriptionMinimumStakePolicy, uint256 newSubscriptionMinimumStakePolicy,
		uint256 oldSubscriptionMinimumScorePolicy, uint256 newSubscriptionMinimumScorePolicy);

	event WorkOrderActive         (address indexed woid);
	event WorkOrderClaimed        (address indexed woid);

	event AllowWorkerToContribute (address indexed woid, address indexed worker, uint256 workerScore);
	event Contribute              (address indexed woid, address indexed worker, bytes32 resultHash);
	event RevealConsensus         (address indexed woid, bytes32 consensus);
	event Reveal                  (address indexed woid, address indexed worker, bytes32 result);
	event Reopen                  (address indexed woid);
  event FinalizeWork            (address indexed woid, string stdout, string stderr, string uri);



	event WorkerSubscribe         (address indexed worker);
	event WorkerUnsubscribe       (address indexed worker);
	event WorkerEviction          (address indexed worker);

	/**
	 * Methods
	 */
	// Constructor
	function WorkerPool(
		address _iexecHubAddress,
		string  _description,
		uint256 _subscriptionLockStakePolicy,
		uint256 _subscriptionMinimumStakePolicy,
		uint256 _subscriptionMinimumScorePolicy,
		address _marketplaceAddress)
	IexecHubAccessor(_iexecHubAddress)
	MarketplaceAccessor(_marketplaceAddress)
	public
	{
		// tx.origin == owner
		// msg.sender ==  WorkerPoolHub
		require(tx.origin != msg.sender);
		setImmutableOwnership(tx.origin); // owner → tx.origin

		m_description                    = _description;
		m_stakeRatioPolicy               = 30; // % of the work order price to stake
		m_schedulerRewardRatioPolicy     = 1;  // % of the work reward going to scheduler vs workers reward
		m_subscriptionLockStakePolicy    = _subscriptionLockStakePolicy; // only at creation. cannot be change to respect lock/unlock of worker stake
		m_subscriptionMinimumStakePolicy = _subscriptionMinimumStakePolicy;
		m_subscriptionMinimumScorePolicy = _subscriptionMinimumScorePolicy;
		m_workerPoolHubAddress           = msg.sender;

	}

	function changeWorkerPoolPolicy(
		uint256 _newStakeRatioPolicy,
		uint256 _newSchedulerRewardRatioPolicy,
		uint256 _newSubscriptionMinimumStakePolicy,
		uint256 _newSubscriptionMinimumScorePolicy)
	public onlyOwner
	{
		emit WorkerPoolPolicyUpdate(
			m_stakeRatioPolicy,               _newStakeRatioPolicy,
			m_schedulerRewardRatioPolicy,     _newSchedulerRewardRatioPolicy,
			m_subscriptionMinimumStakePolicy, _newSubscriptionMinimumStakePolicy,
			m_subscriptionMinimumScorePolicy, _newSubscriptionMinimumScorePolicy
		);
		require(_newSchedulerRewardRatioPolicy <= 100);
		m_stakeRatioPolicy               = _newStakeRatioPolicy;
		m_schedulerRewardRatioPolicy     = _newSchedulerRewardRatioPolicy;
		m_subscriptionMinimumStakePolicy = _newSubscriptionMinimumStakePolicy;
		m_subscriptionMinimumScorePolicy = _newSubscriptionMinimumScorePolicy;
	}

	/************************* worker list management **************************/
	function getWorkerAddress(uint _index) public view returns (address)
	{
		return m_workers[_index];
	}
	function getWorkerIndex(address _worker) public view returns (uint)
	{
		uint index = m_workerIndex[_worker];
		require(m_workers[index] == _worker);
		return index;
	}
	function getWorkersCount() public view returns (uint)
	{
		return m_workers.length;
	}

	function subscribeToPool() public returns (bool)
	{
		// msg.sender = worker
		require(iexecHubInterface.registerToPool(msg.sender));
		uint index = m_workers.push(msg.sender);
		m_workerIndex[msg.sender] = index.sub(1);
		emit WorkerSubscribe(msg.sender);
		return true;
	}

	function unsubscribeFromPool() public  returns (bool)
	{
		// msg.sender = worker
		require(iexecHubInterface.unregisterFromPool(msg.sender));
		require(removeWorker(msg.sender));
		emit WorkerUnsubscribe(msg.sender);
		return true;
	}

	function evictWorker(address _worker) public onlyOwner returns (bool)
	{
		// msg.sender = scheduler
		require(iexecHubInterface.evictWorker(_worker));
		require(removeWorker(_worker));
		emit WorkerEviction(_worker);
		return true;
	}

	function removeWorker(address _worker) internal returns (bool)
	{
		uint index = getWorkerIndex(_worker); // fails if worker not registered
		address lastWorker = m_workers[m_workers.length.sub(1)];
		m_workers    [index     ] = lastWorker;
		m_workerIndex[lastWorker] = index;
		delete m_workers[m_workers.length.sub(1)];
		m_workers.length = m_workers.length.sub(1);
		return true;
	}

	function getConsensusDetails(address _woid) public view returns (
		uint256 c_poolReward,
		uint256 c_stakeAmount,
		bytes32 c_consensus,
		uint256 c_revealDate,
		uint256 c_revealCounter,
		uint256 c_consensusTimeout,
		uint256 c_winnerCount,
		address c_workerpoolOwner)
	{
		IexecLib.Consensus storage consensus = m_consensus[_woid];
		return (
			consensus.poolReward,
			consensus.stakeAmount,
			consensus.consensus,
			consensus.revealDate,
			consensus.revealCounter,
			consensus.consensusTimeout,
			consensus.winnerCount,
			consensus.workerpoolOwner
		);
	}

	function getContributorsCount(address _woid) public view returns (uint256 contributorsCount)
	{
		return m_consensus[_woid].contributors.length;
	}

	function getContributor(address _woid, uint256 index) public view returns (address contributor)
	{
		return m_consensus[_woid].contributors[index];
	}

	function existingContribution(address _woid, address _worker) public view  returns (bool contributionExist)
	{
		return m_contributions[_woid][_worker].status != IexecLib.ContributionStatusEnum.UNSET;
	}

	function getContribution(address _woid, address _worker) public view returns
	(
		IexecLib.ContributionStatusEnum status,
		bytes32 resultHash,
		bytes32 resultSign,
		address enclaveChallenge,
		uint256 score,
		uint256 weight)
	{
		require(existingContribution(_woid, _worker)); // no silent value returned
		IexecLib.Contribution storage contribution = m_contributions[_woid][_worker];
		return (
			contribution.status,
			contribution.resultHash,
			contribution.resultSign,
			contribution.enclaveChallenge,
			contribution.score,
			contribution.weight
		);
	}


	/**************************** Works management *****************************/
	function emitWorkOrder(address _woid, uint256 _marketorderIdx) public onlyIexecHub returns (bool)
	{
		uint256 catid   = marketplaceInterface.getMarketOrderCategory(_marketorderIdx);
		uint256 timeout = iexecHubInterface.getCategoryWorkClockTimeRef(catid).mul(CONSENSUS_DURATION_RATIO).add(now);

		IexecLib.Consensus storage consensus = m_consensus[_woid];
		consensus.poolReward                 = marketplaceInterface.getMarketOrderValue(_marketorderIdx);
		consensus.workerpoolOwner            = marketplaceInterface.getMarketOrderWorkerpoolOwner(_marketorderIdx);
		consensus.stakeAmount                = consensus.poolReward.percentage(m_stakeRatioPolicy);
		consensus.consensusTimeout            = timeout;
		consensus.schedulerRewardRatioPolicy = m_schedulerRewardRatioPolicy;

		emit WorkOrderActive(_woid);

		return true;
	}

	function claimFailedConsensus(address _woid) public onlyIexecHub returns (bool)
	{
	  IexecLib.Consensus storage consensus = m_consensus[_woid];
		require(now > consensus.consensusTimeout);
		uint256 i;
		address w;
		for (i = 0; i < consensus.contributors.length; ++i)
		{
			w = consensus.contributors[i];
			if (m_contributions[_woid][w].status != IexecLib.ContributionStatusEnum.AUTHORIZED)
			{
				require(iexecHubInterface.unlockForWork(_woid, w, consensus.stakeAmount));
			}
		}
		emit WorkOrderClaimed(_woid);
		return true;
	}

	function allowWorkersToContribute(address _woid, address[] _workers, address _enclaveChallenge) public onlyOwner /*onlySheduler*/ returns (bool)
	{
		for (uint i = 0; i < _workers.length; ++i)
		{
			require(allowWorkerToContribute(_woid, _workers[i], _enclaveChallenge));
		}
		return true;
	}

	function allowWorkerToContribute(address _woid, address _worker, address _enclaveChallenge) public onlyOwner /*onlySheduler*/ returns (bool)
	{
		require(iexecHubInterface.isWoidRegistred(_woid));
		require(WorkOrder(_woid).m_status() == IexecLib.WorkOrderStatusEnum.ACTIVE);
		IexecLib.Contribution storage contribution = m_contributions[_woid][_worker];
		IexecLib.Consensus    storage consensus    = m_consensus[_woid];
		require(now <= consensus.consensusTimeout);

		address workerPool;
		uint256 workerScore;
		(workerPool, workerScore) = iexecHubInterface.getWorkerStatus(_worker); // workerPool, workerScore
		require(workerPool == address(this));

		require(contribution.status == IexecLib.ContributionStatusEnum.UNSET);
		contribution.status           = IexecLib.ContributionStatusEnum.AUTHORIZED;
		contribution.enclaveChallenge = _enclaveChallenge;

		emit AllowWorkerToContribute(_woid, _worker, workerScore);
		return true;
	}

	function contribute(address _woid, bytes32 _resultHash, bytes32 _resultSign, uint8 _v, bytes32 _r, bytes32 _s) public returns (uint256 workerStake)
	{
		require(iexecHubInterface.isWoidRegistred(_woid));
		IexecLib.Consensus    storage consensus    = m_consensus[_woid];
		require(now <= consensus.consensusTimeout);
		require(WorkOrder(_woid).m_status() == IexecLib.WorkOrderStatusEnum.ACTIVE); // can't contribute on a claimed or completed workorder
		IexecLib.Contribution storage contribution = m_contributions[_woid][msg.sender];

		// msg.sender = a worker
		require(_resultHash != 0x0);
		require(_resultSign != 0x0);
		if (contribution.enclaveChallenge != address(0))
		{
			require(contribution.enclaveChallenge == ecrecover(keccak256("\x19Ethereum Signed Message:\n64", _resultHash, _resultSign), _v, _r, _s));
		}

		require(contribution.status == IexecLib.ContributionStatusEnum.AUTHORIZED);
		contribution.status     = IexecLib.ContributionStatusEnum.CONTRIBUTED;
		contribution.resultHash = _resultHash;
		contribution.resultSign = _resultSign;
		contribution.score      = iexecHubInterface.getWorkerScore(msg.sender);
		consensus.contributors.push(msg.sender);

		require(iexecHubInterface.lockForWork(_woid, msg.sender, consensus.stakeAmount));
		emit Contribute(_woid, msg.sender, _resultHash);
		return consensus.stakeAmount;
	}

	function revealConsensus(address _woid, bytes32 _consensus) public onlyOwner /*onlySheduler*/ returns (bool)
	{
		require(iexecHubInterface.isWoidRegistred(_woid));
		IexecLib.Consensus storage consensus = m_consensus[_woid];
		require(now <= consensus.consensusTimeout);
		require(WorkOrder(_woid).startRevealingPhase());

		consensus.winnerCount = 0;
		for (uint256 i = 0; i<consensus.contributors.length; ++i)
		{
			address w = consensus.contributors[i];
			if (
				m_contributions[_woid][w].resultHash == _consensus
				&&
				m_contributions[_woid][w].status == IexecLib.ContributionStatusEnum.CONTRIBUTED // REJECTED contribution must not be count
			)
			{
				consensus.winnerCount = consensus.winnerCount.add(1);
			}
		}
		require(consensus.winnerCount > 0); // you cannot revealConsensus if no worker has contributed to this hash

		consensus.consensus  = _consensus;
		consensus.revealDate = iexecHubInterface.getCategoryWorkClockTimeRef(marketplaceInterface.getMarketOrderCategory(WorkOrder(_woid).m_marketorderIdx())).mul(REVEAL_PERIOD_DURATION_RATIO).add(now); // is it better to store th catid ?
		emit RevealConsensus(_woid, _consensus);
		return true;
	}

	function reveal(address _woid, bytes32 _result) public returns (bool)
	{
		require(iexecHubInterface.isWoidRegistred(_woid));
		IexecLib.Consensus    storage consensus    = m_consensus[_woid];
		require(now <= consensus.consensusTimeout);
		IexecLib.Contribution storage contribution = m_contributions[_woid][msg.sender];

		require(WorkOrder(_woid).m_status() == IexecLib.WorkOrderStatusEnum.REVEALING     );
		require(consensus.revealDate        >  now                                        );
		require(contribution.status         == IexecLib.ContributionStatusEnum.CONTRIBUTED);
		require(contribution.resultHash     == consensus.consensus                        );
		require(contribution.resultHash     == keccak256(_result                        ) );
		require(contribution.resultSign     == keccak256(_result ^ keccak256(msg.sender)) );

		contribution.status     = IexecLib.ContributionStatusEnum.PROVED;
		consensus.revealCounter = consensus.revealCounter.add(1);

		emit Reveal(_woid, msg.sender, _result);
		return true;
	}

	function reopen(address _woid) public onlyOwner /*onlySheduler*/ returns (bool)
	{
		require(iexecHubInterface.isWoidRegistred(_woid));
		IexecLib.Consensus storage consensus = m_consensus[_woid];
		require(now <= consensus.consensusTimeout);
		require(consensus.revealDate <= now && consensus.revealCounter == 0);
		require(WorkOrder(_woid).reActivate());

		for (uint256 i = 0; i < consensus.contributors.length; ++i)
		{
			address w = consensus.contributors[i];
			if (m_contributions[_woid][w].resultHash == consensus.consensus)
			{
				m_contributions[_woid][w].status = IexecLib.ContributionStatusEnum.REJECTED;
			}
		}
		// Reset to status before revealConsensus. Must be after REJECTED traitement above because of consensus.consensus check
		consensus.winnerCount = 0;
		consensus.consensus   = 0x0;
		consensus.revealDate  = 0;
		emit Reopen(_woid);
		return true;
	}

	// if sheduler never call finalized ? no incetive to do that. schedulermust be pay also at this time
	function finalizeWork(address _woid, string _stdout, string _stderr, string _uri) public onlyOwner /*onlySheduler*/ returns (bool)
	{
		require(iexecHubInterface.isWoidRegistred(_woid));
		IexecLib.Consensus storage consensus = m_consensus[_woid];
		require(now <= consensus.consensusTimeout);
		require((consensus.revealDate <= now && consensus.revealCounter > 0) || (consensus.revealCounter == consensus.winnerCount)); // consensus.winnerCount never 0 at this step

		// add penalized to the call worker to contribution and they never contribute ?
		require(distributeRewards(_woid, consensus));

		require(iexecHubInterface.finalizeWorkOrder(_woid, _stdout, _stderr, _uri));
		emit FinalizeWork(_woid,_stdout,_stderr,_uri);
		return true;
	}

	function distributeRewards(address _woid, IexecLib.Consensus _consensus) internal returns (bool)
	{
		uint256 i;
		address w;
		uint256 workerBonus;
		uint256 workerWeight;
		uint256 totalWeight;
		uint256 individualWorkerReward;
		uint256 totalReward = _consensus.poolReward;
		address[] memory contributors = _consensus.contributors;
		for (i = 0; i<contributors.length; ++i)
		{
			w = contributors[i];
			IexecLib.Contribution storage c = m_contributions[_woid][w];
			if (c.status == IexecLib.ContributionStatusEnum.PROVED)
			{
				workerBonus  = (c.enclaveChallenge != address(0)) ? 3 : 1; // TODO: bonus sgx = 3 ?
				workerWeight = 1 + c.score.mul(workerBonus).log();
				totalWeight  = totalWeight.add(workerWeight);
				c.weight     = workerWeight; // store so we don't have to recompute
			}
			else // ContributionStatusEnum.REJECT or ContributionStatusEnum.CONTRIBUTED (not revealed)
			{
				totalReward = totalReward.add(_consensus.stakeAmount);
			}
		}
		require(totalWeight > 0);

		// compute how much is going to the workers
		uint256 totalWorkersReward = totalReward.percentage(uint256(100).sub(_consensus.schedulerRewardRatioPolicy));

		for (i = 0; i<contributors.length; ++i)
		{
			w = contributors[i];
			if (m_contributions[_woid][w].status == IexecLib.ContributionStatusEnum.PROVED)
			{
				individualWorkerReward = totalWorkersReward.mulByFraction(m_contributions[_woid][w].weight, totalWeight);
				totalReward  = totalReward.sub(individualWorkerReward);
				require(iexecHubInterface.unlockForWork(_woid, w, _consensus.stakeAmount));
				require(iexecHubInterface.rewardForWork(_woid, w, individualWorkerReward, true));
			}
			else // WorkStatusEnum.POCO_REJECT or ContributionStatusEnum.CONTRIBUTED (not revealed)
			{
				require(iexecHubInterface.seizeForWork(_woid, w, _consensus.stakeAmount, true));
				// No Reward
			}
		}
		// totalReward now contains the scheduler share
		require(iexecHubInterface.rewardForWork(_woid, _consensus.workerpoolOwner, totalReward, false));

		return true;
	}

}


pragma solidity ^0.4.21;

contract Marketplace is IexecHubAccessor
{
	using SafeMathOZ for uint256;

	/**
	 * Marketplace
	 */
	uint                                 public m_orderCount;
	mapping(uint =>IexecLib.MarketOrder) public m_orderBook;

	uint256 public constant ASK_STAKE_RATIO  = 30;

	/**
	 * Events
	 */
	event MarketOrderCreated   (uint marketorderIdx);
	event MarketOrderClosed    (uint marketorderIdx);
	event MarketOrderAskConsume(uint marketorderIdx, address requester);

	/**
	 * Constructor
	 */
	function Marketplace(address _iexecHubAddress)
	IexecHubAccessor(_iexecHubAddress)
	public
	{
	}

	/**
	 * Market orders
	 */
	function createMarketOrder(
		IexecLib.MarketOrderDirectionEnum _direction,
		uint256 _category,
		uint256 _trust,
		uint256 _value,
		address _workerpool,
		uint256 _volume)
	public returns (uint)
	{
		require(iexecHubInterface.existingCategory(_category));
		require(_volume >0);
		m_orderCount = m_orderCount.add(1);
		IexecLib.MarketOrder storage marketorder    = m_orderBook[m_orderCount];
		marketorder.direction      = _direction;
		marketorder.category       = _category;
		marketorder.trust          = _trust;
		marketorder.value          = _value;
		marketorder.volume         = _volume;
		marketorder.remaining      = _volume;

		if (_direction == IexecLib.MarketOrderDirectionEnum.ASK)
		{
			require(WorkerPool(_workerpool).m_owner() == msg.sender);

			require(iexecHubInterface.lockForOrder(msg.sender, _value.percentage(ASK_STAKE_RATIO).mul(_volume))); // mul must be done after percentage to avoid rounding errors
			marketorder.workerpool      = _workerpool;
			marketorder.workerpoolOwner = msg.sender;
		}
		else
		{
			// no BID implementation
			revert();
		}
		emit MarketOrderCreated(m_orderCount);
		return m_orderCount;
	}

	function closeMarketOrder(uint256 _marketorderIdx) public returns (bool)
	{
		IexecLib.MarketOrder storage marketorder = m_orderBook[_marketorderIdx];
		if (marketorder.direction == IexecLib.MarketOrderDirectionEnum.ASK)
		{
			require(marketorder.workerpoolOwner == msg.sender);
			require(iexecHubInterface.unlockForOrder(marketorder.workerpoolOwner, marketorder.value.percentage(ASK_STAKE_RATIO).mul(marketorder.remaining))); // mul must be done after percentage to avoid rounding errors
		}
		else
		{
			// no BID implementation
			revert();
		}
		marketorder.direction = IexecLib.MarketOrderDirectionEnum.CLOSED;
		emit MarketOrderClosed(_marketorderIdx);
		return true;
	}


	/**
	 * Assets consumption
	 */
	function consumeMarketOrderAsk(
		uint256 _marketorderIdx,
		address _requester,
		address _workerpool)
	public onlyIexecHub returns (bool)
	{
		IexecLib.MarketOrder storage marketorder = m_orderBook[_marketorderIdx];
		require(marketorder.direction  == IexecLib.MarketOrderDirectionEnum.ASK);
		require(marketorder.remaining  >  0);
		require(marketorder.workerpool == _workerpool);

		marketorder.remaining = marketorder.remaining.sub(1);
		if (marketorder.remaining == 0)
		{
			marketorder.direction = IexecLib.MarketOrderDirectionEnum.CLOSED;
		}
		require(iexecHubInterface.lockForOrder(_requester, marketorder.value));
		emit MarketOrderAskConsume(_marketorderIdx, _requester);
		return true;
	}

	function existingMarketOrder(uint256 _marketorderIdx) public view  returns (bool marketOrderExist)
	{
		return m_orderBook[_marketorderIdx].category > 0;
	}

	/**
	 * Views
	 */
	function getMarketOrderValue(uint256 _marketorderIdx) public view returns (uint256)
	{
		require(existingMarketOrder(_marketorderIdx)); // no silent value returned
		return m_orderBook[_marketorderIdx].value;
	}
	function getMarketOrderWorkerpoolOwner(uint256 _marketorderIdx) public view returns (address)
	{
		require(existingMarketOrder(_marketorderIdx)); // no silent value returned
		return m_orderBook[_marketorderIdx].workerpoolOwner;
	}
	function getMarketOrderCategory(uint256 _marketorderIdx) public view returns (uint256)
	{
		require(existingMarketOrder(_marketorderIdx)); // no silent value returned
		return m_orderBook[_marketorderIdx].category;
	}
	function getMarketOrderTrust(uint256 _marketorderIdx) public view returns (uint256)
	{
		require(existingMarketOrder(_marketorderIdx)); // no silent value returned
		return m_orderBook[_marketorderIdx].trust;
	}
	function getMarketOrder(uint256 _marketorderIdx) public view returns
	(
		IexecLib.MarketOrderDirectionEnum direction,
		uint256 category,       // runtime selection
		uint256 trust,          // for PoCo
		uint256 value,          // value/cost/price
		uint256 volume,         // quantity of instances (total)
		uint256 remaining,      // remaining instances
		address workerpool,     // BID can use null for any
		address workerpoolOwner)
	{
		require(existingMarketOrder(_marketorderIdx)); // no silent value returned
		IexecLib.MarketOrder storage marketorder = m_orderBook[_marketorderIdx];
		return (
			marketorder.direction,
			marketorder.category,
			marketorder.trust,
			marketorder.value,
			marketorder.volume,
			marketorder.remaining,
			marketorder.workerpool,
			marketorder.workerpoolOwner
		);
	}

	/**
	 * Callback Proof managment
	 */

	event WorkOrderCallbackProof(address indexed woid, address requester, address beneficiary,address indexed callbackTo, address indexed gasCallbackProvider,string stdout, string stderr , string uri);

	//mapping(workorder => bool)
	 mapping(address => bool) m_callbackDone;

	 function isCallbackDone(address _woid) public view  returns (bool callbackDone)
	 {
		 return m_callbackDone[_woid];
	 }

	 function workOrderCallback(address _woid,string _stdout, string _stderr, string _uri) public
	 {
		 require(iexecHubInterface.isWoidRegistred(_woid));
		 require(!isCallbackDone(_woid));
		 m_callbackDone[_woid] = true;
		 require(WorkOrder(_woid).m_status() == IexecLib.WorkOrderStatusEnum.COMPLETED);
		 require(WorkOrder(_woid).m_resultCallbackProof() == keccak256(_stdout,_stderr,_uri));
		 address callbackTo =WorkOrder(_woid).m_callback();
		 require(callbackTo != address(0));
		 require(IexecCallbackInterface(callbackTo).workOrderCallback(
			 _woid,
			 _stdout,
			 _stderr,
			 _uri
		 ));
		 emit WorkOrderCallbackProof(_woid,WorkOrder(_woid).m_requester(),WorkOrder(_woid).m_beneficiary(),callbackTo,tx.origin,_stdout,_stderr,_uri);
	 }

}

pragma solidity ^0.4.21;

contract App is OwnableOZ, IexecHubAccessor
{

	/**
	 * Members
	 */
	string        public m_appName;
	uint256       public m_appPrice;
	string        public m_appParams;

	/**
	 * Constructor
	 */
	function App(
		address _iexecHubAddress,
		string  _appName,
		uint256 _appPrice,
		string  _appParams)
	IexecHubAccessor(_iexecHubAddress)
	public
	{
		// tx.origin == owner
		// msg.sender == DatasetHub
		require(tx.origin != msg.sender);
		setImmutableOwnership(tx.origin); // owner → tx.origin

		m_appName   = _appName;
		m_appPrice  = _appPrice;
		m_appParams = _appParams;

	}

}


pragma solidity ^0.4.21;

contract AppHub is OwnableOZ // is Owned by IexecHub
{

	using SafeMathOZ for uint256;

	/**
	 * Members
	 */
	mapping(address => uint256)                     m_appCountByOwner;
	mapping(address => mapping(uint256 => address)) m_appByOwnerByIndex;
	mapping(address => bool)                        m_appRegistered;

	mapping(uint256 => address)                     m_appByIndex;
	uint256 public                                  m_totalAppCount;

	/**
	 * Constructor
	 */
	function AppHub() public
	{
	}

	/**
	 * Methods
	 */
	function isAppRegistered(address _app) public view returns (bool)
	{
		return m_appRegistered[_app];
	}
	function getAppsCount(address _owner) public view returns (uint256)
	{
		return m_appCountByOwner[_owner];
	}
	function getApp(address _owner, uint256 _index) public view returns (address)
	{
		return m_appByOwnerByIndex[_owner][_index];
	}
	function getAppByIndex(uint256 _index) public view returns (address)
	{
		return m_appByIndex[_index];
	}

	function addApp(address _owner, address _app) internal
	{
		uint id = m_appCountByOwner[_owner].add(1);
		m_totalAppCount=m_totalAppCount.add(1);
		m_appByIndex       [m_totalAppCount] = _app;
		m_appCountByOwner  [_owner]          = id;
		m_appByOwnerByIndex[_owner][id]      = _app;
		m_appRegistered    [_app]            = true;
	}

	function createApp(
		string  _appName,
		uint256 _appPrice,
		string  _appParams)
	public onlyOwner /*owner == IexecHub*/ returns (address createdApp)
	{
		// tx.origin == owner
		// msg.sender == IexecHub
		address newApp = new App(
			msg.sender,
			_appName,
			_appPrice,
			_appParams
		);
		addApp(tx.origin, newApp);
		return newApp;
	}

}


pragma solidity ^0.4.21;

contract Dataset is OwnableOZ, IexecHubAccessor
{

	/**
	 * Members
	 */
	string            public m_datasetName;
	uint256           public m_datasetPrice;
	string            public m_datasetParams;

	/**
	 * Constructor
	 */
	function Dataset(
		address _iexecHubAddress,
		string  _datasetName,
		uint256 _datasetPrice,
		string  _datasetParams)
	IexecHubAccessor(_iexecHubAddress)
	public
	{
		// tx.origin == owner
		// msg.sender == DatasetHub
		require(tx.origin != msg.sender);
		setImmutableOwnership(tx.origin); // owner → tx.origin

		m_datasetName   = _datasetName;
		m_datasetPrice  = _datasetPrice;
		m_datasetParams = _datasetParams;

	}


}

pragma solidity ^0.4.21;

contract DatasetHub is OwnableOZ // is Owned by IexecHub
{
	using SafeMathOZ for uint256;

	/**
	 * Members
	 */
	mapping(address => uint256)                     m_datasetCountByOwner;
	mapping(address => mapping(uint256 => address)) m_datasetByOwnerByIndex;
	mapping(address => bool)                        m_datasetRegistered;

	mapping(uint256 => address)                     m_datasetByIndex;
	uint256 public                                  m_totalDatasetCount;



	/**
	 * Constructor
	 */
	function DatasetHub() public
	{
	}

	/**
	 * Methods
	 */
	function isDatasetRegistred(address _dataset) public view returns (bool)
	{
		return m_datasetRegistered[_dataset];
	}
	function getDatasetsCount(address _owner) public view returns (uint256)
	{
		return m_datasetCountByOwner[_owner];
	}
	function getDataset(address _owner, uint256 _index) public view returns (address)
	{
		return m_datasetByOwnerByIndex[_owner][_index];
	}
	function getDatasetByIndex(uint256 _index) public view returns (address)
	{
		return m_datasetByIndex[_index];
	}

	function addDataset(address _owner, address _dataset) internal
	{
		uint id = m_datasetCountByOwner[_owner].add(1);
		m_totalDatasetCount = m_totalDatasetCount.add(1);
		m_datasetByIndex       [m_totalDatasetCount] = _dataset;
		m_datasetCountByOwner  [_owner]              = id;
		m_datasetByOwnerByIndex[_owner][id]          = _dataset;
		m_datasetRegistered    [_dataset]            = true;
	}

	function createDataset(
		string _datasetName,
		uint256 _datasetPrice,
		string _datasetParams)
	public onlyOwner /*owner == IexecHub*/ returns (address createdDataset)
	{
		// tx.origin == owner
		// msg.sender == IexecHub
		address newDataset = new Dataset(
			msg.sender,
			_datasetName,
			_datasetPrice,
			_datasetParams
		);
		addDataset(tx.origin, newDataset);
		return newDataset;
	}
}


pragma solidity ^0.4.21;

contract WorkerPoolHub is OwnableOZ // is Owned by IexecHub
{

	using SafeMathOZ for uint256;

	/**
	 * Members
	 */
	// worker => workerPool
	mapping(address => address)                     m_workerAffectation;
	// owner => index
	mapping(address => uint256)                     m_workerPoolCountByOwner;
	// owner => index => workerPool
	mapping(address => mapping(uint256 => address)) m_workerPoolByOwnerByIndex;
	//  workerPool => owner // stored in the workerPool
	/* mapping(address => address)                     m_ownerByWorkerPool; */
	mapping(address => bool)                        m_workerPoolRegistered;

	mapping(uint256 => address)                     m_workerPoolByIndex;
	uint256 public                                  m_totalWorkerPoolCount;



	/**
	 * Constructor
	 */
	function WorkerPoolHub() public
	{
	}

	/**
	 * Methods
	 */
	function isWorkerPoolRegistered(address _workerPool) public view returns (bool)
	{
		return m_workerPoolRegistered[_workerPool];
	}
	function getWorkerPoolsCount(address _owner) public view returns (uint256)
	{
		return m_workerPoolCountByOwner[_owner];
	}
	function getWorkerPool(address _owner, uint256 _index) public view returns (address)
	{
		return m_workerPoolByOwnerByIndex[_owner][_index];
	}
	function getWorkerPoolByIndex(uint256 _index) public view returns (address)
	{
		return m_workerPoolByIndex[_index];
	}
	function getWorkerAffectation(address _worker) public view returns (address workerPool)
	{
		return m_workerAffectation[_worker];
	}

	function addWorkerPool(address _owner, address _workerPool) internal
	{
		uint id = m_workerPoolCountByOwner[_owner].add(1);
		m_totalWorkerPoolCount = m_totalWorkerPoolCount.add(1);
		m_workerPoolByIndex       [m_totalWorkerPoolCount] = _workerPool;
		m_workerPoolCountByOwner  [_owner]                 = id;
		m_workerPoolByOwnerByIndex[_owner][id]             = _workerPool;
		m_workerPoolRegistered    [_workerPool]            = true;
	}

	function createWorkerPool(
		string _description,
		uint256 _subscriptionLockStakePolicy,
		uint256 _subscriptionMinimumStakePolicy,
		uint256 _subscriptionMinimumScorePolicy,
		address _marketplaceAddress)
	external onlyOwner /*owner == IexecHub*/ returns (address createdWorkerPool)
	{
		// tx.origin == owner
		// msg.sender == IexecHub
		// At creating ownership is transfered to tx.origin
		address newWorkerPool = new WorkerPool(
			msg.sender, // iexecHubAddress
			_description,
			_subscriptionLockStakePolicy,
			_subscriptionMinimumStakePolicy,
			_subscriptionMinimumScorePolicy,
			_marketplaceAddress
		);
		addWorkerPool(tx.origin, newWorkerPool);
		return newWorkerPool;
	}

	function registerWorkerAffectation(address _workerPool, address _worker) public onlyOwner /*owner == IexecHub*/ returns (bool subscribed)
	{
		// you must have no cuurent affectation on others worker Pool
		require(m_workerAffectation[_worker] == address(0));
		m_workerAffectation[_worker] = _workerPool;
		return true;
	}

	function unregisterWorkerAffectation(address _workerPool, address _worker) public onlyOwner /*owner == IexecHub*/ returns (bool unsubscribed)
	{
		require(m_workerAffectation[_worker] == _workerPool);
		m_workerAffectation[_worker] = address(0);
		return true;
	}
}


pragma solidity ^0.4.21;

/**
 * @title IexecHub
 */

contract IexecHub
{
	using SafeMathOZ for uint256;

	/**
	* RLC contract for token transfers.
	*/
	RLC public rlc;

	uint256 public constant STAKE_BONUS_RATIO         = 10;
	uint256 public constant STAKE_BONUS_MIN_THRESHOLD = 1000;
	uint256 public constant SCORE_UNITARY_SLASH       = 50;

	/**
	 * Slaves contracts
	 */
	AppHub        public appHub;
	DatasetHub    public datasetHub;
	WorkerPoolHub public workerPoolHub;

	/**
	 * Market place
	 */
	Marketplace public marketplace;
	modifier onlyMarketplace()
	{
		require(msg.sender == address(marketplace));
		_;
	}
	/**
	 * Categories
	 */
	mapping(uint256 => IexecLib.Category) public m_categories;
	uint256                               public m_categoriesCount;
	address                               public m_categoriesCreator;
	modifier onlyCategoriesCreator()
	{
		require(msg.sender == m_categoriesCreator);
		_;
	}

	/**
	 * Escrow
	 */
	mapping(address => IexecLib.Account) public m_accounts;


	/**
	 * workOrder Registered
	 */
	mapping(address => bool) public m_woidRegistered;
	modifier onlyRegisteredWoid(address _woid)
	{
		require(m_woidRegistered[_woid]);
		_;
	}

	/**
	 * Reputation for PoCo
	 */
	mapping(address => uint256)  public m_scores;
	IexecLib.ContributionHistory public m_contributionHistory;


	event WorkOrderActivated(address woid, address indexed workerPool);
	event WorkOrderClaimed  (address woid, address workerPool);
	event WorkOrderCompleted(address woid, address workerPool);

	event CreateApp       (address indexed appOwner,        address indexed app,        string appName,     uint256 appPrice,     string appParams    );
	event CreateDataset   (address indexed datasetOwner,    address indexed dataset,    string datasetName, uint256 datasetPrice, string datasetParams);
	event CreateWorkerPool(address indexed workerPoolOwner, address indexed workerPool, string workerPoolDescription                                        );

	event CreateCategory  (uint256 catid, string name, string description, uint256 workClockTimeRef);

	event WorkerPoolSubscription  (address indexed workerPool, address worker);
	event WorkerPoolUnsubscription(address indexed workerPool, address worker);
	event WorkerPoolEviction      (address indexed workerPool, address worker);

	event AccurateContribution(address woid, address indexed worker);
	event FaultyContribution  (address woid, address indexed worker);

	event Deposit (address owner, uint256 amount);
	event Withdraw(address owner, uint256 amount);
	event Reward  (address user,  uint256 amount);
	event Seize   (address user,  uint256 amount);

	/**
	 * Constructor
	 */
	function IexecHub()
	public
	{
		m_categoriesCreator = msg.sender;
	}

	function attachContracts(
		address _tokenAddress,
		address _marketplaceAddress,
		address _workerPoolHubAddress,
		address _appHubAddress,
		address _datasetHubAddress)
	public onlyCategoriesCreator
	{
		require(address(rlc) == address(0));
		rlc                = RLC          (_tokenAddress        );
		marketplace        = Marketplace  (_marketplaceAddress  );
		workerPoolHub      = WorkerPoolHub(_workerPoolHubAddress);
		appHub             = AppHub       (_appHubAddress       );
		datasetHub         = DatasetHub   (_datasetHubAddress   );

	}

	function setCategoriesCreator(address _categoriesCreator)
	public onlyCategoriesCreator
	{
		m_categoriesCreator = _categoriesCreator;
	}
	/**
	 * Factory
	 */

	function createCategory(
		string  _name,
		string  _description,
		uint256 _workClockTimeRef)
	public onlyCategoriesCreator returns (uint256 catid)
	{
		m_categoriesCount                  = m_categoriesCount.add(1);
		IexecLib.Category storage category = m_categories[m_categoriesCount];
		category.catid                     = m_categoriesCount;
		category.name                      = _name;
		category.description               = _description;
		category.workClockTimeRef          = _workClockTimeRef;
		emit CreateCategory(m_categoriesCount, _name, _description, _workClockTimeRef);
		return m_categoriesCount;
	}

	function createWorkerPool(
		string  _description,
		uint256 _subscriptionLockStakePolicy,
		uint256 _subscriptionMinimumStakePolicy,
		uint256 _subscriptionMinimumScorePolicy)
	external returns (address createdWorkerPool)
	{
		address newWorkerPool = workerPoolHub.createWorkerPool(
			_description,
			_subscriptionLockStakePolicy,
			_subscriptionMinimumStakePolicy,
			_subscriptionMinimumScorePolicy,
			address(marketplace)
		);
		emit CreateWorkerPool(tx.origin, newWorkerPool, _description);
		return newWorkerPool;
	}

	function createApp(
		string  _appName,
		uint256 _appPrice,
		string  _appParams)
	external returns (address createdApp)
	{
		address newApp = appHub.createApp(
			_appName,
			_appPrice,
			_appParams
		);
		emit CreateApp(tx.origin, newApp, _appName, _appPrice, _appParams);
		return newApp;
	}

	function createDataset(
		string  _datasetName,
		uint256 _datasetPrice,
		string  _datasetParams)
	external returns (address createdDataset)
	{
		address newDataset = datasetHub.createDataset(
			_datasetName,
			_datasetPrice,
			_datasetParams
			);
		emit CreateDataset(tx.origin, newDataset, _datasetName, _datasetPrice, _datasetParams);
		return newDataset;
	}

	/**
	 * WorkOrder Emission
	 */
	function buyForWorkOrder(
		uint256 _marketorderIdx,
		address _workerpool,
		address _app,
		address _dataset,
		string  _params,
		address _callback,
		address _beneficiary)
	external returns (address)
	{
		address requester = msg.sender;
		require(marketplace.consumeMarketOrderAsk(_marketorderIdx, requester, _workerpool));

		uint256 emitcost = lockWorkOrderCost(requester, _workerpool, _app, _dataset);

		WorkOrder workorder = new WorkOrder(
			_marketorderIdx,
			requester,
			_app,
			_dataset,
			_workerpool,
			emitcost,
			_params,
			_callback,
			_beneficiary
		);

		m_woidRegistered[workorder] = true;

		require(WorkerPool(_workerpool).emitWorkOrder(workorder, _marketorderIdx));

		emit WorkOrderActivated(workorder, _workerpool);
		return workorder;
	}

	function isWoidRegistred(address _woid) public view returns (bool)
	{
		return m_woidRegistered[_woid];
	}

	function lockWorkOrderCost(
		address _requester,
		address _workerpool, // Address of a smartcontract
		address _app,        // Address of a smartcontract
		address _dataset)    // Address of a smartcontract
	internal returns (uint256)
	{
		// APP
		App app = App(_app);
		require(appHub.isAppRegistered (_app));
		// initialize usercost with dapp price
		uint256 emitcost = app.m_appPrice();

		// DATASET
		if (_dataset != address(0)) // address(0) → no dataset
		{
			Dataset dataset = Dataset(_dataset);
			require(datasetHub.isDatasetRegistred(_dataset));
			// add optional datasetPrice for userCost
			emitcost = emitcost.add(dataset.m_datasetPrice());
		}

		// WORKERPOOL
		require(workerPoolHub.isWorkerPoolRegistered(_workerpool));

		require(lock(_requester, emitcost)); // Lock funds for app + dataset payment

		return emitcost;
	}

	/**
	 * WorkOrder life cycle
	 */

	function claimFailedConsensus(address _woid)
	public onlyRegisteredWoid(_woid) returns (bool)
	{
		WorkOrder  workorder  = WorkOrder(_woid);
		require(workorder.m_requester() == msg.sender);
		WorkerPool workerpool = WorkerPool(workorder.m_workerpool());

		IexecLib.WorkOrderStatusEnum currentStatus = workorder.m_status();
		require(currentStatus == IexecLib.WorkOrderStatusEnum.ACTIVE || currentStatus == IexecLib.WorkOrderStatusEnum.REVEALING);
		// Unlock stakes for all workers
		require(workerpool.claimFailedConsensus(_woid));
		workorder.claim(); // revert on error

		/* uint256 value           = marketplace.getMarketOrderValue(workorder.m_marketorderIdx()); // revert if not exist */
		/* address workerpoolOwner = marketplace.getMarketOrderWorkerpoolOwner(workorder.m_marketorderIdx()); // revert if not exist */
		uint256 value;
		address workerpoolOwner;
		(,,,value,,,,workerpoolOwner) = marketplace.getMarketOrder(workorder.m_marketorderIdx()); // Single call cost less gas
		uint256 workerpoolStake = value.percentage(marketplace.ASK_STAKE_RATIO());

		require(unlock (workorder.m_requester(), value.add(workorder.m_emitcost()))); // UNLOCK THE FUNDS FOR REINBURSEMENT
		require(seize  (workerpoolOwner,         workerpoolStake));
		// put workerpoolOwner stake seize into iexecHub address for bonus for scheduler on next well finalized Task
		require(reward (this,                    workerpoolStake));
		require(lock   (this,                    workerpoolStake));

		emit WorkOrderClaimed(_woid, workorder.m_workerpool());
		return true;
	}

	function finalizeWorkOrder(
		address _woid,
		string  _stdout,
		string  _stderr,
		string  _uri)
	public onlyRegisteredWoid(_woid) returns (bool)
	{
		WorkOrder workorder = WorkOrder(_woid);
		require(workorder.m_workerpool() == msg.sender);
		require(workorder.m_status()     == IexecLib.WorkOrderStatusEnum.REVEALING);

		// APP
		App     app      = App(workorder.m_app());
		uint256 appPrice = app.m_appPrice();
		if (appPrice > 0)
		{
			require(reward(app.m_owner(), appPrice));
		}

		// DATASET
		Dataset dataset = Dataset(workorder.m_dataset());
		if (dataset != address(0))
		{
			uint256 datasetPrice = dataset.m_datasetPrice();
			if (datasetPrice > 0)
			{
				require(reward(dataset.m_owner(), datasetPrice));
			}
		}

		// WORKERPOOL → rewarding done by the caller itself

		/**
		 * seize stacked funds from requester.
		 * reward = value: was locked at market making
		 * emitcost: was locked at when emiting the workorder
		 */
		/* uint256 value           = marketplace.getMarketOrderValue(workorder.m_marketorderIdx()); // revert if not exist */
		/* address workerpoolOwner = marketplace.getMarketOrderWorkerpoolOwner(workorder.m_marketorderIdx()); // revert if not exist */
		uint256 value;
		address workerpoolOwner;
		(,,,value,,,,workerpoolOwner) = marketplace.getMarketOrder(workorder.m_marketorderIdx()); // Single call cost less gas
		uint256 workerpoolStake       = value.percentage(marketplace.ASK_STAKE_RATIO());

		require(seize (workorder.m_requester(), value.add(workorder.m_emitcost()))); // seize funds for payment (market value + emitcost)
		require(unlock(workerpoolOwner,         workerpoolStake)); // unlock scheduler stake

		// write results
		workorder.setResult(_stdout, _stderr, _uri); // revert on error

		// Rien ne se perd, rien ne se crée, tout se transfere
		// distribute bonus to scheduler. jackpot bonus come from scheduler stake loose on IexecHub contract
		// we reuse the varaible value for the kitty / fraction of the kitty (stack too deep)
		/* (,value) = checkBalance(this); // kitty is locked on `this` wallet */
		value = m_accounts[this].locked; // kitty is locked on `this` wallet
		if(value > 0)
		{
			value = value.min(value.percentage(STAKE_BONUS_RATIO).max(STAKE_BONUS_MIN_THRESHOLD));
			require(seize(this,             value));
			require(reward(workerpoolOwner, value));
		}

		emit WorkOrderCompleted(_woid, workorder.m_workerpool());
		return true;
	}

	/**
	 * Views
	 */
	function getCategoryWorkClockTimeRef(uint256 _catId) public view returns (uint256 workClockTimeRef)
	{
		require(existingCategory(_catId));
		return m_categories[_catId].workClockTimeRef;
	}

	function existingCategory(uint256 _catId) public view  returns (bool categoryExist)
	{
		return m_categories[_catId].catid > 0;
	}

	function getCategory(uint256 _catId) public view returns (uint256 catid, string name, string  description, uint256 workClockTimeRef)
	{
		require(existingCategory(_catId));
		return (
			m_categories[_catId].catid,
			m_categories[_catId].name,
			m_categories[_catId].description,
			m_categories[_catId].workClockTimeRef
		);
	}

	function getWorkerStatus(address _worker) public view returns (address workerPool, uint256 workerScore)
	{
		return (workerPoolHub.getWorkerAffectation(_worker), m_scores[_worker]);
	}

	function getWorkerScore(address _worker) public view returns (uint256 workerScore)
	{
		return m_scores[_worker];
	}

	/**
	 * Worker subscription
	 */
	function registerToPool(address _worker) public returns (bool subscribed)
	// msg.sender = workerPool
	{
		WorkerPool workerpool = WorkerPool(msg.sender);
		// Check credentials
		require(workerPoolHub.isWorkerPoolRegistered(msg.sender));
		// Lock worker deposit
		require(lock(_worker, workerpool.m_subscriptionLockStakePolicy()));
		// Check subscription policy
		require(m_accounts[_worker].stake >= workerpool.m_subscriptionMinimumStakePolicy());
		require(m_scores[_worker]         >= workerpool.m_subscriptionMinimumScorePolicy());
		// Update affectation
		require(workerPoolHub.registerWorkerAffectation(msg.sender, _worker));
		// Trigger event notice
		emit WorkerPoolSubscription(msg.sender, _worker);
		return true;
	}

	function unregisterFromPool(address _worker) public returns (bool unsubscribed)
	// msg.sender = workerPool
	{
		require(removeWorker(msg.sender, _worker));
		// Trigger event notice
		emit WorkerPoolUnsubscription(msg.sender, _worker);
		return true;
	}

	function evictWorker(address _worker) public returns (bool unsubscribed)
	// msg.sender = workerpool
	{
		require(removeWorker(msg.sender, _worker));
		// Trigger event notice
		emit WorkerPoolEviction(msg.sender, _worker);
		return true;
	}

	function removeWorker(address _workerpool, address _worker) internal returns (bool unsubscribed)
	{
		WorkerPool workerpool = WorkerPool(_workerpool);
		// Check credentials
		require(workerPoolHub.isWorkerPoolRegistered(_workerpool));
		// Unlick worker stake
		require(unlock(_worker, workerpool.m_subscriptionLockStakePolicy()));
		// Update affectation
		require(workerPoolHub.unregisterWorkerAffectation(_workerpool, _worker));
		return true;
	}

	/**
	 * Stake, reward and penalty functions
	 */
	/* Marketplace */
	function lockForOrder(address _user, uint256 _amount) public onlyMarketplace returns (bool)
	{
		require(lock(_user, _amount));
		return true;
	}
	function unlockForOrder(address _user, uint256 _amount) public  onlyMarketplace returns (bool)
	{
		require(unlock(_user, _amount));
		return true;
	}
	/* Work */
	function lockForWork(address _woid, address _user, uint256 _amount) public onlyRegisteredWoid(_woid) returns (bool)
	{
		require(WorkOrder(_woid).m_workerpool() == msg.sender);
		require(lock(_user, _amount));
		return true;
	}
	function unlockForWork(address _woid, address _user, uint256 _amount) public onlyRegisteredWoid(_woid) returns (bool)
	{
		require(WorkOrder(_woid).m_workerpool() == msg.sender);
		require(unlock(_user, _amount));
		return true;
	}
	function rewardForWork(address _woid, address _worker, uint256 _amount, bool _reputation) public onlyRegisteredWoid(_woid) returns (bool)
	{
		require(WorkOrder(_woid).m_workerpool() == msg.sender);
		require(reward(_worker, _amount));
		if (_reputation)
		{
			m_contributionHistory.success = m_contributionHistory.success.add(1);
			m_scores[_worker] = m_scores[_worker].add(1);
			emit AccurateContribution(_woid, _worker);
		}
		return true;
	}
	function seizeForWork(address _woid, address _worker, uint256 _amount, bool _reputation) public onlyRegisteredWoid(_woid) returns (bool)
	{
		require(WorkOrder(_woid).m_workerpool() == msg.sender);
		require(seize(_worker, _amount));
		if (_reputation)
		{
			m_contributionHistory.failed = m_contributionHistory.failed.add(1);
			m_scores[_worker] = m_scores[_worker].sub(m_scores[_worker].min(SCORE_UNITARY_SLASH));
			emit FaultyContribution(_woid, _worker);
		}
		return true;
	}
	/**
	 * Wallet methods: public
	 */
	function deposit(uint256 _amount) external returns (bool)
	{
		require(rlc.transferFrom(msg.sender, address(this), _amount));
		m_accounts[msg.sender].stake = m_accounts[msg.sender].stake.add(_amount);
		emit Deposit(msg.sender, _amount);
		return true;
	}
	function withdraw(uint256 _amount) external returns (bool)
	{
		m_accounts[msg.sender].stake = m_accounts[msg.sender].stake.sub(_amount);
		require(rlc.transfer(msg.sender, _amount));
		emit Withdraw(msg.sender, _amount);
		return true;
	}
	function checkBalance(address _owner) public view returns (uint256 stake, uint256 locked)
	{
		return (m_accounts[_owner].stake, m_accounts[_owner].locked);
	}
	/**
	 * Wallet methods: Internal
	 */
	function reward(address _user, uint256 _amount) internal returns (bool)
	{
		m_accounts[_user].stake = m_accounts[_user].stake.add(_amount);
		emit Reward(_user, _amount);
		return true;
	}
	function seize(address _user, uint256 _amount) internal returns (bool)
	{
		m_accounts[_user].locked = m_accounts[_user].locked.sub(_amount);
		emit Seize(_user, _amount);
		return true;
	}
	function lock(address _user, uint256 _amount) internal returns (bool)
	{
		m_accounts[_user].stake  = m_accounts[_user].stake.sub(_amount);
		m_accounts[_user].locked = m_accounts[_user].locked.add(_amount);
		return true;
	}
	function unlock(address _user, uint256 _amount) internal returns (bool)
	{
		m_accounts[_user].locked = m_accounts[_user].locked.sub(_amount);
		m_accounts[_user].stake  = m_accounts[_user].stake.add(_amount);
		return true;
	}
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_categoriesCreator","type":"address"}],"name":"setCategoriesCreator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_woid","type":"address"},{"name":"_worker","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_reputation","type":"bool"}],"name":"rewardForWork","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"m_contributionHistory","outputs":[{"name":"success","type":"uint256"},{"name":"failed","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_worker","type":"address"}],"name":"unregisterFromPool","outputs":[{"name":"unsubscribed","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_catId","type":"uint256"}],"name":"getCategoryWorkClockTimeRef","outputs":[{"name":"workClockTimeRef","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"appHub","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_description","type":"string"},{"name":"_workClockTimeRef","type":"uint256"}],"name":"createCategory","outputs":[{"name":"catid","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_catId","type":"uint256"}],"name":"existingCategory","outputs":[{"name":"categoryExist","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_woid","type":"address"}],"name":"isWoidRegistred","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_datasetName","type":"string"},{"name":"_datasetPrice","type":"uint256"},{"name":"_datasetParams","type":"string"}],"name":"createDataset","outputs":[{"name":"createdDataset","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STAKE_BONUS_MIN_THRESHOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_marketorderIdx","type":"uint256"},{"name":"_workerpool","type":"address"},{"name":"_app","type":"address"},{"name":"_dataset","type":"address"},{"name":"_params","type":"string"},{"name":"_callback","type":"address"},{"name":"_beneficiary","type":"address"}],"name":"buyForWorkOrder","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"checkBalance","outputs":[{"name":"stake","type":"uint256"},{"name":"locked","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_description","type":"string"},{"name":"_subscriptionLockStakePolicy","type":"uint256"},{"name":"_subscriptionMinimumStakePolicy","type":"uint256"},{"name":"_subscriptionMinimumScorePolicy","type":"uint256"}],"name":"createWorkerPool","outputs":[{"name":"createdWorkerPool","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"m_scores","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_woid","type":"address"},{"name":"_user","type":"address"},{"name":"_amount","type":"uint256"}],"name":"unlockForWork","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"workerPoolHub","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SCORE_UNITARY_SLASH","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STAKE_BONUS_RATIO","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_worker","type":"address"}],"name":"evictWorker","outputs":[{"name":"unsubscribed","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_woid","type":"address"},{"name":"_user","type":"address"},{"name":"_amount","type":"uint256"}],"name":"lockForWork","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_woid","type":"address"}],"name":"claimFailedConsensus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_worker","type":"address"}],"name":"getWorkerScore","outputs":[{"name":"workerScore","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_woid","type":"address"},{"name":"_worker","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_reputation","type":"bool"}],"name":"seizeForWork","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"m_categoriesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"marketplace","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_amount","type":"uint256"}],"name":"lockForOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rlc","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_worker","type":"address"}],"name":"registerToPool","outputs":[{"name":"subscribed","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"deposit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_woid","type":"address"},{"name":"_stdout","type":"string"},{"name":"_stderr","type":"string"},{"name":"_uri","type":"string"}],"name":"finalizeWorkOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"m_categoriesCreator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_amount","type":"uint256"}],"name":"unlockForOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"datasetHub","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"m_accounts","outputs":[{"name":"stake","type":"uint256"},{"name":"locked","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"m_woidRegistered","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddress","type":"address"},{"name":"_marketplaceAddress","type":"address"},{"name":"_workerPoolHubAddress","type":"address"},{"name":"_appHubAddress","type":"address"},{"name":"_datasetHubAddress","type":"address"}],"name":"attachContracts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"m_categories","outputs":[{"name":"catid","type":"uint256"},{"name":"name","type":"string"},{"name":"description","type":"string"},{"name":"workClockTimeRef","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_catId","type":"uint256"}],"name":"getCategory","outputs":[{"name":"catid","type":"uint256"},{"name":"name","type":"string"},{"name":"description","type":"string"},{"name":"workClockTimeRef","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_worker","type":"address"}],"name":"getWorkerStatus","outputs":[{"name":"workerPool","type":"address"},{"name":"workerScore","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_appName","type":"string"},{"name":"_appPrice","type":"uint256"},{"name":"_appParams","type":"string"}],"name":"createApp","outputs":[{"name":"createdApp","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"woid","type":"address"},{"indexed":true,"name":"workerPool","type":"address"}],"name":"WorkOrderActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"woid","type":"address"},{"indexed":false,"name":"workerPool","type":"address"}],"name":"WorkOrderClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"woid","type":"address"},{"indexed":false,"name":"workerPool","type":"address"}],"name":"WorkOrderCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"appOwner","type":"address"},{"indexed":true,"name":"app","type":"address"},{"indexed":false,"name":"appName","type":"string"},{"indexed":false,"name":"appPrice","type":"uint256"},{"indexed":false,"name":"appParams","type":"string"}],"name":"CreateApp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"datasetOwner","type":"address"},{"indexed":true,"name":"dataset","type":"address"},{"indexed":false,"name":"datasetName","type":"string"},{"indexed":false,"name":"datasetPrice","type":"uint256"},{"indexed":false,"name":"datasetParams","type":"string"}],"name":"CreateDataset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"workerPoolOwner","type":"address"},{"indexed":true,"name":"workerPool","type":"address"},{"indexed":false,"name":"workerPoolDescription","type":"string"}],"name":"CreateWorkerPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"catid","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"description","type":"string"},{"indexed":false,"name":"workClockTimeRef","type":"uint256"}],"name":"CreateCategory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"workerPool","type":"address"},{"indexed":false,"name":"worker","type":"address"}],"name":"WorkerPoolSubscription","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"workerPool","type":"address"},{"indexed":false,"name":"worker","type":"address"}],"name":"WorkerPoolUnsubscription","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"workerPool","type":"address"},{"indexed":false,"name":"worker","type":"address"}],"name":"WorkerPoolEviction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"woid","type":"address"},{"indexed":true,"name":"worker","type":"address"}],"name":"AccurateContribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"woid","type":"address"},{"indexed":true,"name":"worker","type":"address"}],"name":"FaultyContribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Reward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Seize","type":"event"}]

6060604052341561000f57600080fd5b60078054600160a060020a03191633600160a060020a0316179055614408806100396000396000f300606060405260043610620002155763ffffffff60e060020a6000350416630800b89e81146200021a5780630c91f2d0146200023e57806310793b5014620002825780631708d72514620002b05780631f87172614620002d2578063234a0ee714620002fd578063298503d9146200032f5780632e1a7d4d14620003c757806332baa8d914620003e057806332ca558714620003f957806339b73122146200041b5780634f73b8e6146200044c578063536e280014620004625780635f51522614620004ac57806366de5a4f14620004ce57806369e99b5c14620004f95780636b4f6865146200051b5780636e885bd71462000546578063747bcd72146200055c578063817e83321462000572578063835436b414620005885780638981d07714620005aa5780638986916314620005d55780638c0f8e1114620005f75780639fdf96251462000619578063a0efe2551462000649578063abc8c7af146200065f578063ac26109e1462000675578063b017c036146200069a578063b218cf1514620006b0578063b6b55f2514620006d2578063b6b57ebd14620006eb578063b6b8c3cd14620007d1578063b7b6e97814620007e7578063bc04d77b146200080c578063be02ee6e1462000822578063ddaeb6001462000844578063e760a11a1462000866578063eeeb2ba014620008a0578063f3052d2614620009ae578063f69f190c14620009c7578063fc06a8771462000a0b575b600080fd5b34156200022657600080fd5b6200023c600160a060020a036004351662000a3c565b005b34156200024a57600080fd5b6200026e600160a060020a0360043581169060243516604435606435151562000a87565b604051901515815260200160405180910390f35b34156200028e57600080fd5b6200029862000bf4565b60405191825260208201526040908101905180910390f35b3415620002bc57600080fd5b6200026e600160a060020a036004351662000bfd565b3415620002de57600080fd5b620002eb60043562000c66565b60405190815260200160405180910390f35b34156200030957600080fd5b6200031362000c95565b604051600160a060020a03909116815260200160405180910390f35b34156200033b57600080fd5b620002eb60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650509335935062000ca492505050565b3415620003d357600080fd5b6200026e60043562000e52565b3415620003ec57600080fd5b6200026e60043562000f5a565b34156200040557600080fd5b6200026e600160a060020a036004351662000f6d565b34156200042757600080fd5b6200031360246004803582810192908201359181359160443590810191013562000f8b565b34156200045857600080fd5b620002eb620010c9565b34156200046e57600080fd5b620003136004803590600160a060020a03602480358216926044358316926064358116926084359081019201359060a43581169060c43516620010cf565b3415620004b857600080fd5b62000298600160a060020a0360043516620012f9565b3415620004da57600080fd5b620003136024600480358281019291013590356044356064356200131c565b34156200050557600080fd5b620002eb600160a060020a036004351662001449565b34156200052757600080fd5b6200026e600160a060020a03600435811690602435166044356200145b565b34156200055257600080fd5b620003136200151e565b34156200056857600080fd5b620002eb6200152d565b34156200057e57600080fd5b620002eb62001532565b34156200059457600080fd5b6200026e600160a060020a036004351662001537565b3415620005b657600080fd5b6200026e600160a060020a0360043581169060243516604435620015a0565b3415620005e157600080fd5b6200026e600160a060020a03600435166200164c565b34156200060357600080fd5b620002eb600160a060020a036004351662001bbd565b34156200062557600080fd5b6200026e600160a060020a0360043581169060243516604435606435151562001bd8565b34156200065557600080fd5b620002eb62001d6f565b34156200066b57600080fd5b6200031362001d75565b34156200068157600080fd5b6200026e600160a060020a036004351660243562001d84565b3415620006a657600080fd5b6200031362001dc4565b3415620006bc57600080fd5b6200026e600160a060020a036004351662001dd3565b3415620006de57600080fd5b6200026e6004356200207d565b3415620006f757600080fd5b6200026e60048035600160a060020a03169060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506200219b95505050505050565b3415620007dd57600080fd5b62000313620029e9565b3415620007f357600080fd5b6200026e600160a060020a0360043516602435620029f8565b34156200081857600080fd5b6200031362002a23565b34156200082e57600080fd5b62000298600160a060020a036004351662002a32565b34156200085057600080fd5b6200026e600160a060020a036004351662002a4b565b34156200087257600080fd5b6200023c600160a060020a036004358116906024358116906044358116906064358116906084351662002a60565b3415620008ac57600080fd5b620008b960043562002aff565b604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101562000908578082015183820152602001620008ee565b50505050905090810190601f168015620009365780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156200096e57808201518382015260200162000954565b50505050905090810190601f1680156200099c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3415620009ba57600080fd5b620008b960043562002c67565b3415620009d357600080fd5b620009e9600160a060020a036004351662002e0d565b604051600160a060020a03909216825260208201526040908101905180910390f35b341562000a1757600080fd5b6200031360246004803582810192908201359181359160443590810191013562002e9c565b60075433600160a060020a0390811691161462000a5857600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a038416600090815260096020526040812054859060ff16151562000ab157600080fd5b33600160a060020a031686600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000af957600080fd5b5af1151562000b0757600080fd5b50505060405180519050600160a060020a031614151562000b2757600080fd5b62000b33858562002fda565b151562000b3f57600080fd5b821562000be857600b5462000b5c90600163ffffffff6200307116565b600b55600160a060020a0385166000908152600a602052604090205462000b8b90600163ffffffff6200307116565b600160a060020a0386166000818152600a60205260409081902092909255907f98b231d22df4a95e9d99b5d3f4d25fab5a821c22d7f517a522731c2892ed453590889051600160a060020a03909116815260200160405180910390a25b50600195945050505050565b600b54600c5482565b600062000c0b33836200308c565b151562000c1757600080fd5b33600160a060020a03167f9644170e77fec17243f5fdc3519cba6d2162d1dda59af75508fd9a2005aeb78483604051600160a060020a03909116815260200160405180910390a2506001919050565b600062000c738262000f5a565b151562000c7f57600080fd5b5060009081526005602052604090206003015490565b600154600160a060020a031681565b600754600090819033600160a060020a0390811691161462000cc557600080fd5b60065462000cdb90600163ffffffff6200307116565b6006819055600081815260056020526040902090815590506001810185805162000d0a929160200190620036ba565b506002810184805162000d22929160200190620036ba565b50600381018390556006547f62bf08360c9d561749c54eaf4f8bf8cb6c8b6f4f40607bcec39a8172e714d25c90868686604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101562000da157808201518382015260200162000d87565b50505050905090810190601f16801562000dcf5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b8381101562000e0757808201518382015260200162000ded565b50505050905090810190601f16801562000e355780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a150506006549392505050565b600160a060020a03331660009081526008602052604081205462000e7d908363ffffffff620031fa16565b33600160a060020a038181166000908152600860205260408082209490945554169163a9059cbb919085905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000eea57600080fd5b5af1151562000ef857600080fd5b50505060405180519050151562000f0e57600080fd5b7f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243643383604051600160a060020a03909216825260208201526040908101905180910390a1506001919050565b6000908152600560205260408120541190565b600160a060020a031660009081526009602052604090205460ff1690565b6002546000908190600160a060020a03166339b7312288888888886040518663ffffffff1660e060020a0281526004018080602001858152602001806020018381038352888882818152602001925080828437909101848103835285815260200190508585808284378201915050975050505050505050602060405180830381600087803b15156200101c57600080fd5b5af115156200102a57600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f49413c774d3fe9c92f6ada69299963d9b4b1c13a1f2a95a019188e2c161ed1438989898989604051602081018490526060808252810185905280604081016080820188888082843790910184810383528581526020019050858580828437820191505097505050505050505060405180910390a39695505050505050565b6103e881565b600454600090339082908190600160a060020a03166302a63c288d858e60405160e060020a63ffffffff86160281526004810193909352600160a060020a039182166024840152166044820152606401602060405180830381600087803b15156200113957600080fd5b5af115156200114757600080fd5b5050506040518051905015156200115d57600080fd5b6200116b838c8c8c6200320d565b91508b838b8b8e868d8d8d8d620011816200373f565b8a8152600160a060020a03808b16602083015289811660408301528881166060830152878116608083015260a0820187905283811660e0830152821661010082015261012060c08201818152908201859052610140820186868082843782019150509b505050505050505050505050604051809103906000f08015156200120757600080fd5b600160a060020a0380821660009081526009602052604090819020805460ff191660011790559192508c1690637919233f9083908f905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200127f57600080fd5b5af115156200128d57600080fd5b505050604051805190501515620012a357600080fd5b8a600160a060020a03167f359f2105b31d71ee8e2315c3dc3427b3f7297dcc85dd3883d4554e67f1f22d0082604051600160a060020a03909116815260200160405180910390a29b9a5050505050505050505050565b600160a060020a0316600090815260086020526040902080546001909101549091565b6003546004546000918291600160a060020a039182169163215bd303918a918a918a918a918a91166040518763ffffffff1660e060020a028152600401808060200186815260200185815260200184815260200183600160a060020a0316600160a060020a0316815260200182810382528888828181526020019250808284378201915050975050505050505050602060405180830381600087803b1515620013c457600080fd5b5af11515620013d257600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f3c29f4ff1e741e465a1ad9cc4c0b8e51c046c021ca9e77172d812ae667f566f889896040516020808252810182905280604081018484808284378201915050935050505060405180910390a39695505050505050565b600a6020526000908152604090205481565b600160a060020a038316600090815260096020526040812054849060ff1615156200148557600080fd5b33600160a060020a031685600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620014cd57600080fd5b5af11515620014db57600080fd5b50505060405180519050600160a060020a0316141515620014fb57600080fd5b6200150784846200346c565b15156200151357600080fd5b506001949350505050565b600354600160a060020a031681565b603281565b600a81565b60006200154533836200308c565b15156200155157600080fd5b33600160a060020a03167f5580db655b3146ef4d1fdba3305cf74dbc3f29126c7a3832533f84e00d149ee383604051600160a060020a03909116815260200160405180910390a2506001919050565b600160a060020a038316600090815260096020526040812054849060ff161515620015ca57600080fd5b33600160a060020a031685600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200161257600080fd5b5af115156200162057600080fd5b50505060405180519050600160a060020a03161415156200164057600080fd5b620015078484620034ef565b600160a060020a038116600090815260096020526040812054819081908190819081908190889060ff1615156200168257600080fd5b88965033600160a060020a031687600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620016cd57600080fd5b5af11515620016db57600080fd5b50505060405180519050600160a060020a0316141515620016fb57600080fd5b86600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200173957600080fd5b5af115156200174757600080fd5b5050506040518051965050600160a060020a03871663e329c4786040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200179057600080fd5b5af115156200179e57600080fd5b5050506040518051955060019050856004811115620017b957fe5b1480620017d257506002856004811115620017d057fe5b145b1515620017de57600080fd5b85600160a060020a031663898691638a60405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200182d57600080fd5b5af115156200183b57600080fd5b5050506040518051905015156200185157600080fd5b86600160a060020a0316634e71d92d6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156200188f57600080fd5b5af115156200189d57600080fd5b5050600454600160a060020a03908116915063eb3721be90891663ecc40f646040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620018eb57600080fd5b5af11515620018f957600080fd5b5050506040518051905060405160e060020a63ffffffff8416028152600481019190915260240161010060405180830381600087803b15156200193b57600080fd5b5af115156200194957600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051906020018051600454959c509a50620019f6975050600160a060020a039093169450636b14ea369350604092505050518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019d157600080fd5b5af11515620019df57600080fd5b505050604051805186915063ffffffff6200357416565b915062001abf87600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a3a57600080fd5b5af1151562001a4857600080fd5b5050506040518051905062001ab989600160a060020a0316638628aaff6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a9457600080fd5b5af1151562001aa257600080fd5b505050604051805188915063ffffffff6200307116565b6200346c565b151562001acb57600080fd5b62001ad783836200358b565b151562001ae357600080fd5b62001aef308362002fda565b151562001afb57600080fd5b62001b073083620034ef565b151562001b1357600080fd5b7fb3cae8ec1c2754530963fb2e254826aae88dda74178f1a0c5656776941e604b88988600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001b7357600080fd5b5af1151562001b8157600080fd5b50505060405180519050604051600160a060020a039283168152911660208201526040908101905180910390a150600198975050505050505050565b600160a060020a03166000908152600a602052604090205490565b600160a060020a038416600090815260096020526040812054859060ff16151562001c0257600080fd5b33600160a060020a031686600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001c4a57600080fd5b5af1151562001c5857600080fd5b50505060405180519050600160a060020a031614151562001c7857600080fd5b62001c8485856200358b565b151562001c9057600080fd5b821562000be857600c5462001cad90600163ffffffff6200307116565b600c55600160a060020a0385166000908152600a602052604090205462001d079062001ce190603263ffffffff6200362816565b600160a060020a0387166000908152600a60205260409020549063ffffffff620031fa16565b600160a060020a0386166000818152600a60205260409081902092909255907fd21e70eb7104cb6f403402b79fe1c088dc56b69ecb7474ae68a3e861a5a6d49990889051600160a060020a03909116815260200160405180910390a250600195945050505050565b60065481565b600454600160a060020a031681565b60045460009033600160a060020a0390811691161462001da357600080fd5b62001daf8383620034ef565b151562001dbb57600080fd5b50600192915050565b600054600160a060020a031681565b6003546000903390600160a060020a03166368c197dd8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001e2957600080fd5b5af1151562001e3757600080fd5b50505060405180519050151562001e4d57600080fd5b62001eae8382600160a060020a031663e2d36ef56040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001e9057600080fd5b5af1151562001e9e57600080fd5b50505060405180519050620034ef565b151562001eba57600080fd5b80600160a060020a0316636ab6936a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001ef857600080fd5b5af1151562001f0657600080fd5b5050506040518051600160a060020a0385166000908152600860205260409020541015905062001f3557600080fd5b80600160a060020a031663cc6f06a36040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001f7357600080fd5b5af1151562001f8157600080fd5b5050506040518051600160a060020a0385166000908152600a60205260409020541015905062001fb057600080fd5b600354600160a060020a0316631884c517338560405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b15156200200957600080fd5b5af115156200201757600080fd5b5050506040518051905015156200202d57600080fd5b33600160a060020a03167fd3548f8b6a2a11c4a35ef5a16dbf7142c9db5163c7d46e7f66482664277cff0784604051600160a060020a03909116815260200160405180910390a250600192915050565b60008054600160a060020a03166323b872dd33308560405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515620020e257600080fd5b5af11515620020f057600080fd5b5050506040518051905015156200210657600080fd5b600160a060020a03331660009081526008602052604090205462002131908363ffffffff6200307116565b33600160a060020a03811660009081526008602052604090819020929092557fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c91849051600160a060020a03909216825260208201526040908101905180910390a1506001919050565b600160a060020a038416600090815260096020526040812054819081908190819081908190819081908d9060ff161515620021d557600080fd5b8d985033600160a060020a031689600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200222057600080fd5b5af115156200222e57600080fd5b50505060405180519050600160a060020a03161415156200224e57600080fd5b600289600160a060020a031663e329c4786040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200228e57600080fd5b5af115156200229c57600080fd5b505050604051805190506004811115620022b257fe5b14620022bd57600080fd5b88600160a060020a0316636946f6926040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620022fb57600080fd5b5af115156200230957600080fd5b5050506040518051985050600160a060020a0388166326137e6b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200235257600080fd5b5af115156200236057600080fd5b50505060405180519750506000871115620023e257620023d688600160a060020a031663deff41c16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620023b757600080fd5b5af11515620023c557600080fd5b505050604051805190508862002fda565b1515620023e257600080fd5b88600160a060020a03166371a599ca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200242057600080fd5b5af115156200242e57600080fd5b5050506040518051965050600160a060020a03861615620025175785600160a060020a03166362d598eb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200248757600080fd5b5af115156200249557600080fd5b5050506040518051955050600085111562002517576200250b86600160a060020a031663deff41c16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620024ec57600080fd5b5af11515620024fa57600080fd5b505050604051805190508662002fda565b15156200251757600080fd5b600454600160a060020a039081169063eb3721be908b1663ecc40f646040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200256257600080fd5b5af115156200257057600080fd5b5050506040518051905060405160e060020a63ffffffff8416028152600481019190915260240161010060405180830381600087803b1515620025b257600080fd5b5af11515620025c057600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051906020018051600454959c509a5062002648975050600160a060020a039093169450636b14ea369350604092505050518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019d157600080fd5b9150620026ec89600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200268c57600080fd5b5af115156200269a57600080fd5b50505060405180519050620026e68b600160a060020a0316638628aaff6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a9457600080fd5b6200358b565b1515620026f857600080fd5b6200270483836200346c565b15156200271057600080fd5b88600160a060020a031663d5fdfdbc8e8e8e6040518463ffffffff1660e060020a02815260040180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156200277b57808201518382015260200162002761565b50505050905090810190601f168015620027a95780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b83811015620027e1578082015183820152602001620027c7565b50505050905090810190601f1680156200280f5780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015620028475780820151838201526020016200282d565b50505050905090810190601f168015620028755780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b15156200289857600080fd5b5af11515620028a657600080fd5b505050600160a060020a03301660009081526008602052604081206001015494508411156200293a5762002908620028fa6103e8620028ed87600a63ffffffff6200357416565b9063ffffffff6200364016565b859063ffffffff6200362816565b93506200291630856200358b565b15156200292257600080fd5b6200292e838562002fda565b15156200293a57600080fd5b7fed236d0a24cb7a32c76960696e44bac711b80ef76780688405dc96c2495b75f98e8a600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200299a57600080fd5b5af11515620029a857600080fd5b50505060405180519050604051600160a060020a039283168152911660208201526040908101905180910390a15060019d9c50505050505050505050505050565b600754600160a060020a031681565b60045460009033600160a060020a0390811691161462002a1757600080fd5b62001daf83836200346c565b600254600160a060020a031681565b6008602052600090815260409020805460019091015482565b60096020526000908152604090205460ff1681565b60075433600160a060020a0390811691161462002a7c57600080fd5b600054600160a060020a03161562002a9357600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03978816179091556004805482169587169590951790945560038054851693861693909317909255600180548416918516919091179055600280549092169216919091179055565b6005602052806000526040600020600091509050806000015490806001018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002bb55780601f1062002b895761010080835404028352916020019162002bb5565b820191906000526020600020905b81548152906001019060200180831162002b9757829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002c575780601f1062002c2b5761010080835404028352916020019162002c57565b820191906000526020600020905b81548152906001019060200180831162002c3957829003601f168201915b5050505050908060030154905084565b600062002c7362003750565b62002c7d62003750565b600062002c8a8562000f5a565b151562002c9657600080fd5b60008581526005602090815260409182902080546003820154600180840180549396909560029586019593948794938116156101000260001901169290920491601f83018190048102019051908101604052809291908181526020018280546001816001161561010002031660029004801562002d575780601f1062002d2b5761010080835404028352916020019162002d57565b820191906000526020600020905b81548152906001019060200180831162002d3957829003601f168201915b50505050509250818054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002df75780601f1062002dcb5761010080835404028352916020019162002df7565b820191906000526020600020905b81548152906001019060200180831162002dd957829003601f168201915b5050505050915093509350935093509193509193565b6003546000908190600160a060020a031663d440c6f38460405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002e6357600080fd5b5af1151562002e7157600080fd5b5050506040518051600160a060020a03949094166000908152600a6020526040902054939492505050565b6001546000908190600160a060020a031663fc06a87788888888886040518663ffffffff1660e060020a0281526004018080602001858152602001806020018381038352888882818152602001925080828437909101848103835285815260200190508585808284378201915050975050505050505050602060405180830381600087803b151562002f2d57600080fd5b5af1151562002f3b57600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f03d3b6187bbe7d21aa3cf229e292ba41fa8bca6ec2128c0f1625178b8191cdc28989898989604051602081018490526060808252810185905280604081016080820188888082843790910184810383528581526020019050858580828437820191505097505050505050505060405180910390a39695505050505050565b600160a060020a03821660009081526008602052604081205462003005908363ffffffff6200307116565b600160a060020a03841660009081526008602052604090819020919091557f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc9908490849051600160a060020a03909216825260208201526040908101905180910390a150600192915050565b6000828201838110156200308157fe5b8091505b5092915050565b6003546000908390600160a060020a03166368c197dd8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515620030e257600080fd5b5af11515620030f057600080fd5b5050506040518051905015156200310657600080fd5b620031678382600160a060020a031663e2d36ef56040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200314957600080fd5b5af115156200315757600080fd5b505050604051805190506200346c565b15156200317357600080fd5b600354600160a060020a0316630b00de8d858560405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b1515620031cc57600080fd5b5af11515620031da57600080fd5b505050604051805190501515620031f057600080fd5b5060019392505050565b6000828211156200320757fe5b50900390565b600154600090839082908190600160a060020a0316638403be918460405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200326757600080fd5b5af115156200327557600080fd5b5050506040518051905015156200328b57600080fd5b82600160a060020a03166326137e6b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620032c957600080fd5b5af11515620032d757600080fd5b5050506040518051925050600160a060020a03851615620033d457506002548490600160a060020a03166316265b4e8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200334657600080fd5b5af115156200335457600080fd5b5050506040518051905015156200336a57600080fd5b620033d181600160a060020a03166362d598eb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620033ac57600080fd5b5af11515620033ba57600080fd5b505050604051805184915063ffffffff6200307116565b91505b600354600160a060020a03166368c197dd8860405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200342557600080fd5b5af115156200343357600080fd5b5050506040518051905015156200344957600080fd5b620034558883620034ef565b15156200346157600080fd5b509695505050505050565b600160a060020a0382166000908152600860205260408120600101546200349a908363ffffffff620031fa16565b600160a060020a0384166000908152600860205260409020600181019190915554620034cd908363ffffffff6200307116565b600160a060020a03841660009081526008602052604090205550600192915050565b600160a060020a0382166000908152600860205260408120546200351a908363ffffffff620031fa16565b600160a060020a0384166000908152600860205260409020908155600101546200354b908363ffffffff6200307116565b600160a060020a0384166000908152600860205260409020600190810191909155905092915050565b6000620035848383606462003652565b9392505050565b600160a060020a038216600090815260086020526040812060010154620035b9908363ffffffff620031fa16565b600160a060020a03841660009081526008602052604090819020600101919091557f4051ba94e08bb094159fc38391422b4b8ccfd2b1f8919c0eb37bb042d4b9cd8e908490849051600160a060020a03909216825260208201526040908101905180910390a150600192915050565b600081831062003639578162003584565b5090919050565b60008183101562003639578162003584565b60006200366b62003664858562003673565b83620036a2565b949350505050565b60008083151562003688576000915062003085565b508282028284828115156200369957fe5b04146200308157fe5b6000808284811515620036b157fe5b04949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620036fd57805160ff19168380011785556200372d565b828001600101855582156200372d579182015b828111156200372d57825182559160200191906001019062003710565b506200373b92915062003762565b5090565b604051610c5a806200378383390190565b60206040519081016040526000815290565b6200377f91905b808211156200373b576000815560010162003769565b9056006060604052341561000f57600080fd5b604051610c5a380380610c5a8339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805182019190602001805191906020018051600e8054600160a060020a03191633600160a060020a039081169190911790915590925089161515905061009257600080fd5b6000805460ff1916600190811790915589905560028054600160a060020a0319908116600160a060020a038a81169190911790925560038054821689841617905560048054821688841617905560058054909116918a1691909117905560068490556007838051610107929160200190610141565b5060088054600160a060020a03938416600160a060020a03199182161790915560098054929093169116179055506101dc95505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061018257805160ff19168380011785556101af565b828001600101855582156101af579182015b828111156101af578251825591602001919060010190610194565b506101bb9291506101bf565b5090565b6101d991905b808211156101bb57600081556001016101c5565b90565b610a6f806101eb6000396000f3006060604052600436106101065763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630690e5b8811461010b57806315298c771461013a5780631a514d97146101c45780632d4d671f146101eb5780634e71d92d146101fe5780635f44910c146102135780636946f6921461022657806371a599ca146102395780638628aaff1461024c5780639c4a856114610271578063cc3a2dfa14610284578063d3281fd614610297578063d3a69e01146102aa578063d5fdfdbc146102bd578063da1fea2814610392578063e329c478146103a5578063ecc40f64146103dc578063f3859f57146103ef578063f6a5b13e14610402575b600080fd5b341561011657600080fd5b61011e610415565b604051600160a060020a03909116815260200160405180910390f35b341561014557600080fd5b61014d610424565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610189578082015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101cf57600080fd5b6101d76104c2565b604051901515815260200160405180910390f35b34156101f657600080fd5b6101d761053d565b341561020957600080fd5b6102116105b7565b005b341561021e57600080fd5b61011e610647565b341561023157600080fd5b61011e610656565b341561024457600080fd5b61011e610665565b341561025757600080fd5b61025f610674565b60405190815260200160405180910390f35b341561027c57600080fd5b61014d61067a565b341561028f57600080fd5b61014d6106e5565b34156102a257600080fd5b61025f610750565b34156102b557600080fd5b61011e610756565b34156102c857600080fd5b61021160046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061076595505050505050565b341561039d57600080fd5b61011e610913565b34156103b057600080fd5b6103b8610922565b604051808260048111156103c857fe5b60ff16815260200191505060405180910390f35b34156103e757600080fd5b61025f61092b565b34156103fa57600080fd5b61014d610931565b341561040d57600080fd5b61011e61099c565b600454600160a060020a031681565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b505050505081565b60045460009033600160a060020a039081169116146104e057600080fd5b600260005460ff1660048111156104f357fe5b146104fd57600080fd5b6000805460ff191660011790557f06c42818c4ab74dff6aec55942f601c2e9b7f2aa4321ee71690b125eacfe465460405160405180910390a15060015b90565b60045460009033600160a060020a0390811691161461055b57600080fd5b600160005460ff16600481111561056e57fe5b1461057857600080fd5b6000805460ff191660021790557f2b0cab0be6d82b2661b3b789c540ec9c7223aac635ac8e59a1e71e1137f2dd7760405160405180910390a150600190565b600e5433600160a060020a039081169116146105d257600080fd5b600160005460ff1660048111156105e557fe5b14806106015750600260005460ff1660048111156105ff57fe5b145b151561060c57600080fd5b6000805460ff191660031790557f1938697ee29e363ecda49e464c6d2aae25f0974bd1f2c81a91c21e13ad8dbf7760405160405180910390a1565b600554600160a060020a031681565b600254600160a060020a031681565b600354600160a060020a031681565b60065481565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600a5481565b600e54600160a060020a031681565b600e5433600160a060020a0390811691161461078057600080fd5b600260005460ff16600481111561079357fe5b1461079d57600080fd5b6000805460ff19166004179055600b8380516107bd9291602001906109ab565b50600c8280516107d19291602001906109ab565b50600d8180516107e59291602001906109ab565b508282826040518084805190602001908083835b602083106108185780518252601f1990920191602091820191016107f9565b6001836020036101000a038019825116818451161790925250505091909101905083805190602001908083835b602083106108645780518252601f199092019160209182019101610845565b6001836020036101000a038019825116818451161790925250505091909101905082805190602001908083835b602083106108b05780518252601f199092019160209182019101610891565b6001836020036101000a03801982511681845116179092525050509190910194506040935050505051908190039020600a557f777f59509d985349c80271b657d2649b218bc6f075a4625821b64448cc235b8660405160405180910390a1505050565b600854600160a060020a031681565b60005460ff1681565b60015481565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600954600160a060020a031681565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106109ec57805160ff1916838001178555610a19565b82800160010185558215610a19579182015b82811115610a195782518255916020019190600101906109fe565b50610a25929150610a29565b5090565b61053a91905b80821115610a255760008155600101610a2f5600a165627a7a72305820aab9d309bae837f3417f3dc81c0f650543365c210e440786b5dfc09f1981eba70029a165627a7a7230582046504159ab1dbf3323b50d5d77d2f716286b233fadce62375204e0fc7ad76d490029

Deployed Bytecode

0x606060405260043610620002155763ffffffff60e060020a6000350416630800b89e81146200021a5780630c91f2d0146200023e57806310793b5014620002825780631708d72514620002b05780631f87172614620002d2578063234a0ee714620002fd578063298503d9146200032f5780632e1a7d4d14620003c757806332baa8d914620003e057806332ca558714620003f957806339b73122146200041b5780634f73b8e6146200044c578063536e280014620004625780635f51522614620004ac57806366de5a4f14620004ce57806369e99b5c14620004f95780636b4f6865146200051b5780636e885bd71462000546578063747bcd72146200055c578063817e83321462000572578063835436b414620005885780638981d07714620005aa5780638986916314620005d55780638c0f8e1114620005f75780639fdf96251462000619578063a0efe2551462000649578063abc8c7af146200065f578063ac26109e1462000675578063b017c036146200069a578063b218cf1514620006b0578063b6b55f2514620006d2578063b6b57ebd14620006eb578063b6b8c3cd14620007d1578063b7b6e97814620007e7578063bc04d77b146200080c578063be02ee6e1462000822578063ddaeb6001462000844578063e760a11a1462000866578063eeeb2ba014620008a0578063f3052d2614620009ae578063f69f190c14620009c7578063fc06a8771462000a0b575b600080fd5b34156200022657600080fd5b6200023c600160a060020a036004351662000a3c565b005b34156200024a57600080fd5b6200026e600160a060020a0360043581169060243516604435606435151562000a87565b604051901515815260200160405180910390f35b34156200028e57600080fd5b6200029862000bf4565b60405191825260208201526040908101905180910390f35b3415620002bc57600080fd5b6200026e600160a060020a036004351662000bfd565b3415620002de57600080fd5b620002eb60043562000c66565b60405190815260200160405180910390f35b34156200030957600080fd5b6200031362000c95565b604051600160a060020a03909116815260200160405180910390f35b34156200033b57600080fd5b620002eb60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650509335935062000ca492505050565b3415620003d357600080fd5b6200026e60043562000e52565b3415620003ec57600080fd5b6200026e60043562000f5a565b34156200040557600080fd5b6200026e600160a060020a036004351662000f6d565b34156200042757600080fd5b6200031360246004803582810192908201359181359160443590810191013562000f8b565b34156200045857600080fd5b620002eb620010c9565b34156200046e57600080fd5b620003136004803590600160a060020a03602480358216926044358316926064358116926084359081019201359060a43581169060c43516620010cf565b3415620004b857600080fd5b62000298600160a060020a0360043516620012f9565b3415620004da57600080fd5b620003136024600480358281019291013590356044356064356200131c565b34156200050557600080fd5b620002eb600160a060020a036004351662001449565b34156200052757600080fd5b6200026e600160a060020a03600435811690602435166044356200145b565b34156200055257600080fd5b620003136200151e565b34156200056857600080fd5b620002eb6200152d565b34156200057e57600080fd5b620002eb62001532565b34156200059457600080fd5b6200026e600160a060020a036004351662001537565b3415620005b657600080fd5b6200026e600160a060020a0360043581169060243516604435620015a0565b3415620005e157600080fd5b6200026e600160a060020a03600435166200164c565b34156200060357600080fd5b620002eb600160a060020a036004351662001bbd565b34156200062557600080fd5b6200026e600160a060020a0360043581169060243516604435606435151562001bd8565b34156200065557600080fd5b620002eb62001d6f565b34156200066b57600080fd5b6200031362001d75565b34156200068157600080fd5b6200026e600160a060020a036004351660243562001d84565b3415620006a657600080fd5b6200031362001dc4565b3415620006bc57600080fd5b6200026e600160a060020a036004351662001dd3565b3415620006de57600080fd5b6200026e6004356200207d565b3415620006f757600080fd5b6200026e60048035600160a060020a03169060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506200219b95505050505050565b3415620007dd57600080fd5b62000313620029e9565b3415620007f357600080fd5b6200026e600160a060020a0360043516602435620029f8565b34156200081857600080fd5b6200031362002a23565b34156200082e57600080fd5b62000298600160a060020a036004351662002a32565b34156200085057600080fd5b6200026e600160a060020a036004351662002a4b565b34156200087257600080fd5b6200023c600160a060020a036004358116906024358116906044358116906064358116906084351662002a60565b3415620008ac57600080fd5b620008b960043562002aff565b604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101562000908578082015183820152602001620008ee565b50505050905090810190601f168015620009365780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156200096e57808201518382015260200162000954565b50505050905090810190601f1680156200099c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3415620009ba57600080fd5b620008b960043562002c67565b3415620009d357600080fd5b620009e9600160a060020a036004351662002e0d565b604051600160a060020a03909216825260208201526040908101905180910390f35b341562000a1757600080fd5b6200031360246004803582810192908201359181359160443590810191013562002e9c565b60075433600160a060020a0390811691161462000a5857600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a038416600090815260096020526040812054859060ff16151562000ab157600080fd5b33600160a060020a031686600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000af957600080fd5b5af1151562000b0757600080fd5b50505060405180519050600160a060020a031614151562000b2757600080fd5b62000b33858562002fda565b151562000b3f57600080fd5b821562000be857600b5462000b5c90600163ffffffff6200307116565b600b55600160a060020a0385166000908152600a602052604090205462000b8b90600163ffffffff6200307116565b600160a060020a0386166000818152600a60205260409081902092909255907f98b231d22df4a95e9d99b5d3f4d25fab5a821c22d7f517a522731c2892ed453590889051600160a060020a03909116815260200160405180910390a25b50600195945050505050565b600b54600c5482565b600062000c0b33836200308c565b151562000c1757600080fd5b33600160a060020a03167f9644170e77fec17243f5fdc3519cba6d2162d1dda59af75508fd9a2005aeb78483604051600160a060020a03909116815260200160405180910390a2506001919050565b600062000c738262000f5a565b151562000c7f57600080fd5b5060009081526005602052604090206003015490565b600154600160a060020a031681565b600754600090819033600160a060020a0390811691161462000cc557600080fd5b60065462000cdb90600163ffffffff6200307116565b6006819055600081815260056020526040902090815590506001810185805162000d0a929160200190620036ba565b506002810184805162000d22929160200190620036ba565b50600381018390556006547f62bf08360c9d561749c54eaf4f8bf8cb6c8b6f4f40607bcec39a8172e714d25c90868686604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101562000da157808201518382015260200162000d87565b50505050905090810190601f16801562000dcf5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b8381101562000e0757808201518382015260200162000ded565b50505050905090810190601f16801562000e355780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a150506006549392505050565b600160a060020a03331660009081526008602052604081205462000e7d908363ffffffff620031fa16565b33600160a060020a038181166000908152600860205260408082209490945554169163a9059cbb919085905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000eea57600080fd5b5af1151562000ef857600080fd5b50505060405180519050151562000f0e57600080fd5b7f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243643383604051600160a060020a03909216825260208201526040908101905180910390a1506001919050565b6000908152600560205260408120541190565b600160a060020a031660009081526009602052604090205460ff1690565b6002546000908190600160a060020a03166339b7312288888888886040518663ffffffff1660e060020a0281526004018080602001858152602001806020018381038352888882818152602001925080828437909101848103835285815260200190508585808284378201915050975050505050505050602060405180830381600087803b15156200101c57600080fd5b5af115156200102a57600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f49413c774d3fe9c92f6ada69299963d9b4b1c13a1f2a95a019188e2c161ed1438989898989604051602081018490526060808252810185905280604081016080820188888082843790910184810383528581526020019050858580828437820191505097505050505050505060405180910390a39695505050505050565b6103e881565b600454600090339082908190600160a060020a03166302a63c288d858e60405160e060020a63ffffffff86160281526004810193909352600160a060020a039182166024840152166044820152606401602060405180830381600087803b15156200113957600080fd5b5af115156200114757600080fd5b5050506040518051905015156200115d57600080fd5b6200116b838c8c8c6200320d565b91508b838b8b8e868d8d8d8d620011816200373f565b8a8152600160a060020a03808b16602083015289811660408301528881166060830152878116608083015260a0820187905283811660e0830152821661010082015261012060c08201818152908201859052610140820186868082843782019150509b505050505050505050505050604051809103906000f08015156200120757600080fd5b600160a060020a0380821660009081526009602052604090819020805460ff191660011790559192508c1690637919233f9083908f905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200127f57600080fd5b5af115156200128d57600080fd5b505050604051805190501515620012a357600080fd5b8a600160a060020a03167f359f2105b31d71ee8e2315c3dc3427b3f7297dcc85dd3883d4554e67f1f22d0082604051600160a060020a03909116815260200160405180910390a29b9a5050505050505050505050565b600160a060020a0316600090815260086020526040902080546001909101549091565b6003546004546000918291600160a060020a039182169163215bd303918a918a918a918a918a91166040518763ffffffff1660e060020a028152600401808060200186815260200185815260200184815260200183600160a060020a0316600160a060020a0316815260200182810382528888828181526020019250808284378201915050975050505050505050602060405180830381600087803b1515620013c457600080fd5b5af11515620013d257600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f3c29f4ff1e741e465a1ad9cc4c0b8e51c046c021ca9e77172d812ae667f566f889896040516020808252810182905280604081018484808284378201915050935050505060405180910390a39695505050505050565b600a6020526000908152604090205481565b600160a060020a038316600090815260096020526040812054849060ff1615156200148557600080fd5b33600160a060020a031685600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620014cd57600080fd5b5af11515620014db57600080fd5b50505060405180519050600160a060020a0316141515620014fb57600080fd5b6200150784846200346c565b15156200151357600080fd5b506001949350505050565b600354600160a060020a031681565b603281565b600a81565b60006200154533836200308c565b15156200155157600080fd5b33600160a060020a03167f5580db655b3146ef4d1fdba3305cf74dbc3f29126c7a3832533f84e00d149ee383604051600160a060020a03909116815260200160405180910390a2506001919050565b600160a060020a038316600090815260096020526040812054849060ff161515620015ca57600080fd5b33600160a060020a031685600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200161257600080fd5b5af115156200162057600080fd5b50505060405180519050600160a060020a03161415156200164057600080fd5b620015078484620034ef565b600160a060020a038116600090815260096020526040812054819081908190819081908190889060ff1615156200168257600080fd5b88965033600160a060020a031687600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620016cd57600080fd5b5af11515620016db57600080fd5b50505060405180519050600160a060020a0316141515620016fb57600080fd5b86600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200173957600080fd5b5af115156200174757600080fd5b5050506040518051965050600160a060020a03871663e329c4786040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200179057600080fd5b5af115156200179e57600080fd5b5050506040518051955060019050856004811115620017b957fe5b1480620017d257506002856004811115620017d057fe5b145b1515620017de57600080fd5b85600160a060020a031663898691638a60405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200182d57600080fd5b5af115156200183b57600080fd5b5050506040518051905015156200185157600080fd5b86600160a060020a0316634e71d92d6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156200188f57600080fd5b5af115156200189d57600080fd5b5050600454600160a060020a03908116915063eb3721be90891663ecc40f646040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620018eb57600080fd5b5af11515620018f957600080fd5b5050506040518051905060405160e060020a63ffffffff8416028152600481019190915260240161010060405180830381600087803b15156200193b57600080fd5b5af115156200194957600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051906020018051600454959c509a50620019f6975050600160a060020a039093169450636b14ea369350604092505050518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019d157600080fd5b5af11515620019df57600080fd5b505050604051805186915063ffffffff6200357416565b915062001abf87600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a3a57600080fd5b5af1151562001a4857600080fd5b5050506040518051905062001ab989600160a060020a0316638628aaff6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a9457600080fd5b5af1151562001aa257600080fd5b505050604051805188915063ffffffff6200307116565b6200346c565b151562001acb57600080fd5b62001ad783836200358b565b151562001ae357600080fd5b62001aef308362002fda565b151562001afb57600080fd5b62001b073083620034ef565b151562001b1357600080fd5b7fb3cae8ec1c2754530963fb2e254826aae88dda74178f1a0c5656776941e604b88988600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001b7357600080fd5b5af1151562001b8157600080fd5b50505060405180519050604051600160a060020a039283168152911660208201526040908101905180910390a150600198975050505050505050565b600160a060020a03166000908152600a602052604090205490565b600160a060020a038416600090815260096020526040812054859060ff16151562001c0257600080fd5b33600160a060020a031686600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001c4a57600080fd5b5af1151562001c5857600080fd5b50505060405180519050600160a060020a031614151562001c7857600080fd5b62001c8485856200358b565b151562001c9057600080fd5b821562000be857600c5462001cad90600163ffffffff6200307116565b600c55600160a060020a0385166000908152600a602052604090205462001d079062001ce190603263ffffffff6200362816565b600160a060020a0387166000908152600a60205260409020549063ffffffff620031fa16565b600160a060020a0386166000818152600a60205260409081902092909255907fd21e70eb7104cb6f403402b79fe1c088dc56b69ecb7474ae68a3e861a5a6d49990889051600160a060020a03909116815260200160405180910390a250600195945050505050565b60065481565b600454600160a060020a031681565b60045460009033600160a060020a0390811691161462001da357600080fd5b62001daf8383620034ef565b151562001dbb57600080fd5b50600192915050565b600054600160a060020a031681565b6003546000903390600160a060020a03166368c197dd8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001e2957600080fd5b5af1151562001e3757600080fd5b50505060405180519050151562001e4d57600080fd5b62001eae8382600160a060020a031663e2d36ef56040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001e9057600080fd5b5af1151562001e9e57600080fd5b50505060405180519050620034ef565b151562001eba57600080fd5b80600160a060020a0316636ab6936a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001ef857600080fd5b5af1151562001f0657600080fd5b5050506040518051600160a060020a0385166000908152600860205260409020541015905062001f3557600080fd5b80600160a060020a031663cc6f06a36040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001f7357600080fd5b5af1151562001f8157600080fd5b5050506040518051600160a060020a0385166000908152600a60205260409020541015905062001fb057600080fd5b600354600160a060020a0316631884c517338560405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b15156200200957600080fd5b5af115156200201757600080fd5b5050506040518051905015156200202d57600080fd5b33600160a060020a03167fd3548f8b6a2a11c4a35ef5a16dbf7142c9db5163c7d46e7f66482664277cff0784604051600160a060020a03909116815260200160405180910390a250600192915050565b60008054600160a060020a03166323b872dd33308560405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515620020e257600080fd5b5af11515620020f057600080fd5b5050506040518051905015156200210657600080fd5b600160a060020a03331660009081526008602052604090205462002131908363ffffffff6200307116565b33600160a060020a03811660009081526008602052604090819020929092557fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c91849051600160a060020a03909216825260208201526040908101905180910390a1506001919050565b600160a060020a038416600090815260096020526040812054819081908190819081908190819081908d9060ff161515620021d557600080fd5b8d985033600160a060020a031689600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200222057600080fd5b5af115156200222e57600080fd5b50505060405180519050600160a060020a03161415156200224e57600080fd5b600289600160a060020a031663e329c4786040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200228e57600080fd5b5af115156200229c57600080fd5b505050604051805190506004811115620022b257fe5b14620022bd57600080fd5b88600160a060020a0316636946f6926040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620022fb57600080fd5b5af115156200230957600080fd5b5050506040518051985050600160a060020a0388166326137e6b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200235257600080fd5b5af115156200236057600080fd5b50505060405180519750506000871115620023e257620023d688600160a060020a031663deff41c16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620023b757600080fd5b5af11515620023c557600080fd5b505050604051805190508862002fda565b1515620023e257600080fd5b88600160a060020a03166371a599ca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200242057600080fd5b5af115156200242e57600080fd5b5050506040518051965050600160a060020a03861615620025175785600160a060020a03166362d598eb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200248757600080fd5b5af115156200249557600080fd5b5050506040518051955050600085111562002517576200250b86600160a060020a031663deff41c16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620024ec57600080fd5b5af11515620024fa57600080fd5b505050604051805190508662002fda565b15156200251757600080fd5b600454600160a060020a039081169063eb3721be908b1663ecc40f646040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200256257600080fd5b5af115156200257057600080fd5b5050506040518051905060405160e060020a63ffffffff8416028152600481019190915260240161010060405180830381600087803b1515620025b257600080fd5b5af11515620025c057600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051906020018051600454959c509a5062002648975050600160a060020a039093169450636b14ea369350604092505050518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019d157600080fd5b9150620026ec89600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200268c57600080fd5b5af115156200269a57600080fd5b50505060405180519050620026e68b600160a060020a0316638628aaff6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a9457600080fd5b6200358b565b1515620026f857600080fd5b6200270483836200346c565b15156200271057600080fd5b88600160a060020a031663d5fdfdbc8e8e8e6040518463ffffffff1660e060020a02815260040180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156200277b57808201518382015260200162002761565b50505050905090810190601f168015620027a95780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b83811015620027e1578082015183820152602001620027c7565b50505050905090810190601f1680156200280f5780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015620028475780820151838201526020016200282d565b50505050905090810190601f168015620028755780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b15156200289857600080fd5b5af11515620028a657600080fd5b505050600160a060020a03301660009081526008602052604081206001015494508411156200293a5762002908620028fa6103e8620028ed87600a63ffffffff6200357416565b9063ffffffff6200364016565b859063ffffffff6200362816565b93506200291630856200358b565b15156200292257600080fd5b6200292e838562002fda565b15156200293a57600080fd5b7fed236d0a24cb7a32c76960696e44bac711b80ef76780688405dc96c2495b75f98e8a600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200299a57600080fd5b5af11515620029a857600080fd5b50505060405180519050604051600160a060020a039283168152911660208201526040908101905180910390a15060019d9c50505050505050505050505050565b600754600160a060020a031681565b60045460009033600160a060020a0390811691161462002a1757600080fd5b62001daf83836200346c565b600254600160a060020a031681565b6008602052600090815260409020805460019091015482565b60096020526000908152604090205460ff1681565b60075433600160a060020a0390811691161462002a7c57600080fd5b600054600160a060020a03161562002a9357600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03978816179091556004805482169587169590951790945560038054851693861693909317909255600180548416918516919091179055600280549092169216919091179055565b6005602052806000526040600020600091509050806000015490806001018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002bb55780601f1062002b895761010080835404028352916020019162002bb5565b820191906000526020600020905b81548152906001019060200180831162002b9757829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002c575780601f1062002c2b5761010080835404028352916020019162002c57565b820191906000526020600020905b81548152906001019060200180831162002c3957829003601f168201915b5050505050908060030154905084565b600062002c7362003750565b62002c7d62003750565b600062002c8a8562000f5a565b151562002c9657600080fd5b60008581526005602090815260409182902080546003820154600180840180549396909560029586019593948794938116156101000260001901169290920491601f83018190048102019051908101604052809291908181526020018280546001816001161561010002031660029004801562002d575780601f1062002d2b5761010080835404028352916020019162002d57565b820191906000526020600020905b81548152906001019060200180831162002d3957829003601f168201915b50505050509250818054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002df75780601f1062002dcb5761010080835404028352916020019162002df7565b820191906000526020600020905b81548152906001019060200180831162002dd957829003601f168201915b5050505050915093509350935093509193509193565b6003546000908190600160a060020a031663d440c6f38460405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002e6357600080fd5b5af1151562002e7157600080fd5b5050506040518051600160a060020a03949094166000908152600a6020526040902054939492505050565b6001546000908190600160a060020a031663fc06a87788888888886040518663ffffffff1660e060020a0281526004018080602001858152602001806020018381038352888882818152602001925080828437909101848103835285815260200190508585808284378201915050975050505050505050602060405180830381600087803b151562002f2d57600080fd5b5af1151562002f3b57600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f03d3b6187bbe7d21aa3cf229e292ba41fa8bca6ec2128c0f1625178b8191cdc28989898989604051602081018490526060808252810185905280604081016080820188888082843790910184810383528581526020019050858580828437820191505097505050505050505060405180910390a39695505050505050565b600160a060020a03821660009081526008602052604081205462003005908363ffffffff6200307116565b600160a060020a03841660009081526008602052604090819020919091557f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc9908490849051600160a060020a03909216825260208201526040908101905180910390a150600192915050565b6000828201838110156200308157fe5b8091505b5092915050565b6003546000908390600160a060020a03166368c197dd8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515620030e257600080fd5b5af11515620030f057600080fd5b5050506040518051905015156200310657600080fd5b620031678382600160a060020a031663e2d36ef56040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200314957600080fd5b5af115156200315757600080fd5b505050604051805190506200346c565b15156200317357600080fd5b600354600160a060020a0316630b00de8d858560405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b1515620031cc57600080fd5b5af11515620031da57600080fd5b505050604051805190501515620031f057600080fd5b5060019392505050565b6000828211156200320757fe5b50900390565b600154600090839082908190600160a060020a0316638403be918460405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200326757600080fd5b5af115156200327557600080fd5b5050506040518051905015156200328b57600080fd5b82600160a060020a03166326137e6b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620032c957600080fd5b5af11515620032d757600080fd5b5050506040518051925050600160a060020a03851615620033d457506002548490600160a060020a03166316265b4e8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200334657600080fd5b5af115156200335457600080fd5b5050506040518051905015156200336a57600080fd5b620033d181600160a060020a03166362d598eb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620033ac57600080fd5b5af11515620033ba57600080fd5b505050604051805184915063ffffffff6200307116565b91505b600354600160a060020a03166368c197dd8860405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200342557600080fd5b5af115156200343357600080fd5b5050506040518051905015156200344957600080fd5b620034558883620034ef565b15156200346157600080fd5b509695505050505050565b600160a060020a0382166000908152600860205260408120600101546200349a908363ffffffff620031fa16565b600160a060020a0384166000908152600860205260409020600181019190915554620034cd908363ffffffff6200307116565b600160a060020a03841660009081526008602052604090205550600192915050565b600160a060020a0382166000908152600860205260408120546200351a908363ffffffff620031fa16565b600160a060020a0384166000908152600860205260409020908155600101546200354b908363ffffffff6200307116565b600160a060020a0384166000908152600860205260409020600190810191909155905092915050565b6000620035848383606462003652565b9392505050565b600160a060020a038216600090815260086020526040812060010154620035b9908363ffffffff620031fa16565b600160a060020a03841660009081526008602052604090819020600101919091557f4051ba94e08bb094159fc38391422b4b8ccfd2b1f8919c0eb37bb042d4b9cd8e908490849051600160a060020a03909216825260208201526040908101905180910390a150600192915050565b600081831062003639578162003584565b5090919050565b60008183101562003639578162003584565b60006200366b62003664858562003673565b83620036a2565b949350505050565b60008083151562003688576000915062003085565b508282028284828115156200369957fe5b04146200308157fe5b6000808284811515620036b157fe5b04949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620036fd57805160ff19168380011785556200372d565b828001600101855582156200372d579182015b828111156200372d57825182559160200191906001019062003710565b506200373b92915062003762565b5090565b604051610c5a806200378383390190565b60206040519081016040526000815290565b6200377f91905b808211156200373b576000815560010162003769565b9056006060604052341561000f57600080fd5b604051610c5a380380610c5a8339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805182019190602001805191906020018051600e8054600160a060020a03191633600160a060020a039081169190911790915590925089161515905061009257600080fd5b6000805460ff1916600190811790915589905560028054600160a060020a0319908116600160a060020a038a81169190911790925560038054821689841617905560048054821688841617905560058054909116918a1691909117905560068490556007838051610107929160200190610141565b5060088054600160a060020a03938416600160a060020a03199182161790915560098054929093169116179055506101dc95505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061018257805160ff19168380011785556101af565b828001600101855582156101af579182015b828111156101af578251825591602001919060010190610194565b506101bb9291506101bf565b5090565b6101d991905b808211156101bb57600081556001016101c5565b90565b610a6f806101eb6000396000f3006060604052600436106101065763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630690e5b8811461010b57806315298c771461013a5780631a514d97146101c45780632d4d671f146101eb5780634e71d92d146101fe5780635f44910c146102135780636946f6921461022657806371a599ca146102395780638628aaff1461024c5780639c4a856114610271578063cc3a2dfa14610284578063d3281fd614610297578063d3a69e01146102aa578063d5fdfdbc146102bd578063da1fea2814610392578063e329c478146103a5578063ecc40f64146103dc578063f3859f57146103ef578063f6a5b13e14610402575b600080fd5b341561011657600080fd5b61011e610415565b604051600160a060020a03909116815260200160405180910390f35b341561014557600080fd5b61014d610424565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610189578082015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101cf57600080fd5b6101d76104c2565b604051901515815260200160405180910390f35b34156101f657600080fd5b6101d761053d565b341561020957600080fd5b6102116105b7565b005b341561021e57600080fd5b61011e610647565b341561023157600080fd5b61011e610656565b341561024457600080fd5b61011e610665565b341561025757600080fd5b61025f610674565b60405190815260200160405180910390f35b341561027c57600080fd5b61014d61067a565b341561028f57600080fd5b61014d6106e5565b34156102a257600080fd5b61025f610750565b34156102b557600080fd5b61011e610756565b34156102c857600080fd5b61021160046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061076595505050505050565b341561039d57600080fd5b61011e610913565b34156103b057600080fd5b6103b8610922565b604051808260048111156103c857fe5b60ff16815260200191505060405180910390f35b34156103e757600080fd5b61025f61092b565b34156103fa57600080fd5b61014d610931565b341561040d57600080fd5b61011e61099c565b600454600160a060020a031681565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b505050505081565b60045460009033600160a060020a039081169116146104e057600080fd5b600260005460ff1660048111156104f357fe5b146104fd57600080fd5b6000805460ff191660011790557f06c42818c4ab74dff6aec55942f601c2e9b7f2aa4321ee71690b125eacfe465460405160405180910390a15060015b90565b60045460009033600160a060020a0390811691161461055b57600080fd5b600160005460ff16600481111561056e57fe5b1461057857600080fd5b6000805460ff191660021790557f2b0cab0be6d82b2661b3b789c540ec9c7223aac635ac8e59a1e71e1137f2dd7760405160405180910390a150600190565b600e5433600160a060020a039081169116146105d257600080fd5b600160005460ff1660048111156105e557fe5b14806106015750600260005460ff1660048111156105ff57fe5b145b151561060c57600080fd5b6000805460ff191660031790557f1938697ee29e363ecda49e464c6d2aae25f0974bd1f2c81a91c21e13ad8dbf7760405160405180910390a1565b600554600160a060020a031681565b600254600160a060020a031681565b600354600160a060020a031681565b60065481565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600a5481565b600e54600160a060020a031681565b600e5433600160a060020a0390811691161461078057600080fd5b600260005460ff16600481111561079357fe5b1461079d57600080fd5b6000805460ff19166004179055600b8380516107bd9291602001906109ab565b50600c8280516107d19291602001906109ab565b50600d8180516107e59291602001906109ab565b508282826040518084805190602001908083835b602083106108185780518252601f1990920191602091820191016107f9565b6001836020036101000a038019825116818451161790925250505091909101905083805190602001908083835b602083106108645780518252601f199092019160209182019101610845565b6001836020036101000a038019825116818451161790925250505091909101905082805190602001908083835b602083106108b05780518252601f199092019160209182019101610891565b6001836020036101000a03801982511681845116179092525050509190910194506040935050505051908190039020600a557f777f59509d985349c80271b657d2649b218bc6f075a4625821b64448cc235b8660405160405180910390a1505050565b600854600160a060020a031681565b60005460ff1681565b60015481565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600954600160a060020a031681565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106109ec57805160ff1916838001178555610a19565b82800160010185558215610a19579182015b82811115610a195782518255916020019190600101906109fe565b50610a25929150610a29565b5090565b61053a91905b80821115610a255760008155600101610a2f5600a165627a7a72305820aab9d309bae837f3417f3dc81c0f650543365c210e440786b5dfc09f1981eba70029a165627a7a7230582046504159ab1dbf3323b50d5d77d2f716286b233fadce62375204e0fc7ad76d490029

Swarm Source

bzzr://46504159ab1dbf3323b50d5d77d2f716286b233fadce62375204e0fc7ad76d49

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.