Source Code
Latest 25 from a total of 779 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 11654058 | 1843 days ago | IN | 0 ETH | 0.00440642 | ||||
| Withdraw | 7748767 | 2456 days ago | IN | 0 ETH | 0.00000907 | ||||
| Withdraw | 7748757 | 2456 days ago | IN | 0 ETH | 0.00000907 | ||||
| Withdraw | 7748600 | 2456 days ago | IN | 0 ETH | 0.00000907 | ||||
| Withdraw | 7748564 | 2456 days ago | IN | 0 ETH | 0.00000905 | ||||
| Withdraw | 7748480 | 2456 days ago | IN | 0 ETH | 0.00000905 | ||||
| Withdraw | 7748441 | 2456 days ago | IN | 0 ETH | 0.00000905 | ||||
| Withdraw | 7748346 | 2456 days ago | IN | 0 ETH | 0.00000905 | ||||
| Withdraw | 7748320 | 2456 days ago | IN | 0 ETH | 0.00000905 | ||||
| Withdraw | 7748290 | 2456 days ago | IN | 0 ETH | 0.00000907 | ||||
| Withdraw | 7748247 | 2456 days ago | IN | 0 ETH | 0.00000905 | ||||
| Withdraw | 7748193 | 2456 days ago | IN | 0 ETH | 0.00000905 | ||||
| Deposit | 7280262 | 2529 days ago | IN | 0 ETH | 0.00015384 | ||||
| Withdraw | 7173014 | 2553 days ago | IN | 0 ETH | 0.00057596 | ||||
| Withdraw | 7173004 | 2553 days ago | IN | 0 ETH | 0.00057475 | ||||
| Deposit | 7073465 | 2573 days ago | IN | 0 ETH | 0.00010256 | ||||
| Withdraw | 6937872 | 2596 days ago | IN | 0 ETH | 0.00009055 | ||||
| Withdraw | 6932967 | 2597 days ago | IN | 0 ETH | 0.00027111 | ||||
| Withdraw | 6926437 | 2598 days ago | IN | 0 ETH | 0.00009055 | ||||
| Withdraw | 6926414 | 2598 days ago | IN | 0 ETH | 0.00018074 | ||||
| Deposit | 6926398 | 2598 days ago | IN | 0 ETH | 0.00010903 | ||||
| Withdraw | 6925707 | 2599 days ago | IN | 0 ETH | 0.00040725 | ||||
| Withdraw | 6921553 | 2599 days ago | IN | 0 ETH | 0.0003025 | ||||
| Claim Failed Con... | 6921268 | 2599 days ago | IN | 0 ETH | 0.00083053 | ||||
| Claim Failed Con... | 6921259 | 2599 days ago | IN | 0 ETH | 0.00071268 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
IexecHub
Compiler Version
v0.4.21+commit.dfe3193c
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
6060604052341561000f57600080fd5b60078054600160a060020a03191633600160a060020a0316179055614408806100396000396000f300606060405260043610620002155763ffffffff60e060020a6000350416630800b89e81146200021a5780630c91f2d0146200023e57806310793b5014620002825780631708d72514620002b05780631f87172614620002d2578063234a0ee714620002fd578063298503d9146200032f5780632e1a7d4d14620003c757806332baa8d914620003e057806332ca558714620003f957806339b73122146200041b5780634f73b8e6146200044c578063536e280014620004625780635f51522614620004ac57806366de5a4f14620004ce57806369e99b5c14620004f95780636b4f6865146200051b5780636e885bd71462000546578063747bcd72146200055c578063817e83321462000572578063835436b414620005885780638981d07714620005aa5780638986916314620005d55780638c0f8e1114620005f75780639fdf96251462000619578063a0efe2551462000649578063abc8c7af146200065f578063ac26109e1462000675578063b017c036146200069a578063b218cf1514620006b0578063b6b55f2514620006d2578063b6b57ebd14620006eb578063b6b8c3cd14620007d1578063b7b6e97814620007e7578063bc04d77b146200080c578063be02ee6e1462000822578063ddaeb6001462000844578063e760a11a1462000866578063eeeb2ba014620008a0578063f3052d2614620009ae578063f69f190c14620009c7578063fc06a8771462000a0b575b600080fd5b34156200022657600080fd5b6200023c600160a060020a036004351662000a3c565b005b34156200024a57600080fd5b6200026e600160a060020a0360043581169060243516604435606435151562000a87565b604051901515815260200160405180910390f35b34156200028e57600080fd5b6200029862000bf4565b60405191825260208201526040908101905180910390f35b3415620002bc57600080fd5b6200026e600160a060020a036004351662000bfd565b3415620002de57600080fd5b620002eb60043562000c66565b60405190815260200160405180910390f35b34156200030957600080fd5b6200031362000c95565b604051600160a060020a03909116815260200160405180910390f35b34156200033b57600080fd5b620002eb60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650509335935062000ca492505050565b3415620003d357600080fd5b6200026e60043562000e52565b3415620003ec57600080fd5b6200026e60043562000f5a565b34156200040557600080fd5b6200026e600160a060020a036004351662000f6d565b34156200042757600080fd5b6200031360246004803582810192908201359181359160443590810191013562000f8b565b34156200045857600080fd5b620002eb620010c9565b34156200046e57600080fd5b620003136004803590600160a060020a03602480358216926044358316926064358116926084359081019201359060a43581169060c43516620010cf565b3415620004b857600080fd5b62000298600160a060020a0360043516620012f9565b3415620004da57600080fd5b620003136024600480358281019291013590356044356064356200131c565b34156200050557600080fd5b620002eb600160a060020a036004351662001449565b34156200052757600080fd5b6200026e600160a060020a03600435811690602435166044356200145b565b34156200055257600080fd5b620003136200151e565b34156200056857600080fd5b620002eb6200152d565b34156200057e57600080fd5b620002eb62001532565b34156200059457600080fd5b6200026e600160a060020a036004351662001537565b3415620005b657600080fd5b6200026e600160a060020a0360043581169060243516604435620015a0565b3415620005e157600080fd5b6200026e600160a060020a03600435166200164c565b34156200060357600080fd5b620002eb600160a060020a036004351662001bbd565b34156200062557600080fd5b6200026e600160a060020a0360043581169060243516604435606435151562001bd8565b34156200065557600080fd5b620002eb62001d6f565b34156200066b57600080fd5b6200031362001d75565b34156200068157600080fd5b6200026e600160a060020a036004351660243562001d84565b3415620006a657600080fd5b6200031362001dc4565b3415620006bc57600080fd5b6200026e600160a060020a036004351662001dd3565b3415620006de57600080fd5b6200026e6004356200207d565b3415620006f757600080fd5b6200026e60048035600160a060020a03169060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506200219b95505050505050565b3415620007dd57600080fd5b62000313620029e9565b3415620007f357600080fd5b6200026e600160a060020a0360043516602435620029f8565b34156200081857600080fd5b6200031362002a23565b34156200082e57600080fd5b62000298600160a060020a036004351662002a32565b34156200085057600080fd5b6200026e600160a060020a036004351662002a4b565b34156200087257600080fd5b6200023c600160a060020a036004358116906024358116906044358116906064358116906084351662002a60565b3415620008ac57600080fd5b620008b960043562002aff565b604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101562000908578082015183820152602001620008ee565b50505050905090810190601f168015620009365780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156200096e57808201518382015260200162000954565b50505050905090810190601f1680156200099c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3415620009ba57600080fd5b620008b960043562002c67565b3415620009d357600080fd5b620009e9600160a060020a036004351662002e0d565b604051600160a060020a03909216825260208201526040908101905180910390f35b341562000a1757600080fd5b6200031360246004803582810192908201359181359160443590810191013562002e9c565b60075433600160a060020a0390811691161462000a5857600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a038416600090815260096020526040812054859060ff16151562000ab157600080fd5b33600160a060020a031686600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000af957600080fd5b5af1151562000b0757600080fd5b50505060405180519050600160a060020a031614151562000b2757600080fd5b62000b33858562002fda565b151562000b3f57600080fd5b821562000be857600b5462000b5c90600163ffffffff6200307116565b600b55600160a060020a0385166000908152600a602052604090205462000b8b90600163ffffffff6200307116565b600160a060020a0386166000818152600a60205260409081902092909255907f98b231d22df4a95e9d99b5d3f4d25fab5a821c22d7f517a522731c2892ed453590889051600160a060020a03909116815260200160405180910390a25b50600195945050505050565b600b54600c5482565b600062000c0b33836200308c565b151562000c1757600080fd5b33600160a060020a03167f9644170e77fec17243f5fdc3519cba6d2162d1dda59af75508fd9a2005aeb78483604051600160a060020a03909116815260200160405180910390a2506001919050565b600062000c738262000f5a565b151562000c7f57600080fd5b5060009081526005602052604090206003015490565b600154600160a060020a031681565b600754600090819033600160a060020a0390811691161462000cc557600080fd5b60065462000cdb90600163ffffffff6200307116565b6006819055600081815260056020526040902090815590506001810185805162000d0a929160200190620036ba565b506002810184805162000d22929160200190620036ba565b50600381018390556006547f62bf08360c9d561749c54eaf4f8bf8cb6c8b6f4f40607bcec39a8172e714d25c90868686604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101562000da157808201518382015260200162000d87565b50505050905090810190601f16801562000dcf5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b8381101562000e0757808201518382015260200162000ded565b50505050905090810190601f16801562000e355780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a150506006549392505050565b600160a060020a03331660009081526008602052604081205462000e7d908363ffffffff620031fa16565b33600160a060020a038181166000908152600860205260408082209490945554169163a9059cbb919085905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000eea57600080fd5b5af1151562000ef857600080fd5b50505060405180519050151562000f0e57600080fd5b7f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243643383604051600160a060020a03909216825260208201526040908101905180910390a1506001919050565b6000908152600560205260408120541190565b600160a060020a031660009081526009602052604090205460ff1690565b6002546000908190600160a060020a03166339b7312288888888886040518663ffffffff1660e060020a0281526004018080602001858152602001806020018381038352888882818152602001925080828437909101848103835285815260200190508585808284378201915050975050505050505050602060405180830381600087803b15156200101c57600080fd5b5af115156200102a57600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f49413c774d3fe9c92f6ada69299963d9b4b1c13a1f2a95a019188e2c161ed1438989898989604051602081018490526060808252810185905280604081016080820188888082843790910184810383528581526020019050858580828437820191505097505050505050505060405180910390a39695505050505050565b6103e881565b600454600090339082908190600160a060020a03166302a63c288d858e60405160e060020a63ffffffff86160281526004810193909352600160a060020a039182166024840152166044820152606401602060405180830381600087803b15156200113957600080fd5b5af115156200114757600080fd5b5050506040518051905015156200115d57600080fd5b6200116b838c8c8c6200320d565b91508b838b8b8e868d8d8d8d620011816200373f565b8a8152600160a060020a03808b16602083015289811660408301528881166060830152878116608083015260a0820187905283811660e0830152821661010082015261012060c08201818152908201859052610140820186868082843782019150509b505050505050505050505050604051809103906000f08015156200120757600080fd5b600160a060020a0380821660009081526009602052604090819020805460ff191660011790559192508c1690637919233f9083908f905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200127f57600080fd5b5af115156200128d57600080fd5b505050604051805190501515620012a357600080fd5b8a600160a060020a03167f359f2105b31d71ee8e2315c3dc3427b3f7297dcc85dd3883d4554e67f1f22d0082604051600160a060020a03909116815260200160405180910390a29b9a5050505050505050505050565b600160a060020a0316600090815260086020526040902080546001909101549091565b6003546004546000918291600160a060020a039182169163215bd303918a918a918a918a918a91166040518763ffffffff1660e060020a028152600401808060200186815260200185815260200184815260200183600160a060020a0316600160a060020a0316815260200182810382528888828181526020019250808284378201915050975050505050505050602060405180830381600087803b1515620013c457600080fd5b5af11515620013d257600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f3c29f4ff1e741e465a1ad9cc4c0b8e51c046c021ca9e77172d812ae667f566f889896040516020808252810182905280604081018484808284378201915050935050505060405180910390a39695505050505050565b600a6020526000908152604090205481565b600160a060020a038316600090815260096020526040812054849060ff1615156200148557600080fd5b33600160a060020a031685600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620014cd57600080fd5b5af11515620014db57600080fd5b50505060405180519050600160a060020a0316141515620014fb57600080fd5b6200150784846200346c565b15156200151357600080fd5b506001949350505050565b600354600160a060020a031681565b603281565b600a81565b60006200154533836200308c565b15156200155157600080fd5b33600160a060020a03167f5580db655b3146ef4d1fdba3305cf74dbc3f29126c7a3832533f84e00d149ee383604051600160a060020a03909116815260200160405180910390a2506001919050565b600160a060020a038316600090815260096020526040812054849060ff161515620015ca57600080fd5b33600160a060020a031685600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200161257600080fd5b5af115156200162057600080fd5b50505060405180519050600160a060020a03161415156200164057600080fd5b620015078484620034ef565b600160a060020a038116600090815260096020526040812054819081908190819081908190889060ff1615156200168257600080fd5b88965033600160a060020a031687600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620016cd57600080fd5b5af11515620016db57600080fd5b50505060405180519050600160a060020a0316141515620016fb57600080fd5b86600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200173957600080fd5b5af115156200174757600080fd5b5050506040518051965050600160a060020a03871663e329c4786040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200179057600080fd5b5af115156200179e57600080fd5b5050506040518051955060019050856004811115620017b957fe5b1480620017d257506002856004811115620017d057fe5b145b1515620017de57600080fd5b85600160a060020a031663898691638a60405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200182d57600080fd5b5af115156200183b57600080fd5b5050506040518051905015156200185157600080fd5b86600160a060020a0316634e71d92d6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156200188f57600080fd5b5af115156200189d57600080fd5b5050600454600160a060020a03908116915063eb3721be90891663ecc40f646040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620018eb57600080fd5b5af11515620018f957600080fd5b5050506040518051905060405160e060020a63ffffffff8416028152600481019190915260240161010060405180830381600087803b15156200193b57600080fd5b5af115156200194957600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051906020018051600454959c509a50620019f6975050600160a060020a039093169450636b14ea369350604092505050518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019d157600080fd5b5af11515620019df57600080fd5b505050604051805186915063ffffffff6200357416565b915062001abf87600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a3a57600080fd5b5af1151562001a4857600080fd5b5050506040518051905062001ab989600160a060020a0316638628aaff6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a9457600080fd5b5af1151562001aa257600080fd5b505050604051805188915063ffffffff6200307116565b6200346c565b151562001acb57600080fd5b62001ad783836200358b565b151562001ae357600080fd5b62001aef308362002fda565b151562001afb57600080fd5b62001b073083620034ef565b151562001b1357600080fd5b7fb3cae8ec1c2754530963fb2e254826aae88dda74178f1a0c5656776941e604b88988600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001b7357600080fd5b5af1151562001b8157600080fd5b50505060405180519050604051600160a060020a039283168152911660208201526040908101905180910390a150600198975050505050505050565b600160a060020a03166000908152600a602052604090205490565b600160a060020a038416600090815260096020526040812054859060ff16151562001c0257600080fd5b33600160a060020a031686600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001c4a57600080fd5b5af1151562001c5857600080fd5b50505060405180519050600160a060020a031614151562001c7857600080fd5b62001c8485856200358b565b151562001c9057600080fd5b821562000be857600c5462001cad90600163ffffffff6200307116565b600c55600160a060020a0385166000908152600a602052604090205462001d079062001ce190603263ffffffff6200362816565b600160a060020a0387166000908152600a60205260409020549063ffffffff620031fa16565b600160a060020a0386166000818152600a60205260409081902092909255907fd21e70eb7104cb6f403402b79fe1c088dc56b69ecb7474ae68a3e861a5a6d49990889051600160a060020a03909116815260200160405180910390a250600195945050505050565b60065481565b600454600160a060020a031681565b60045460009033600160a060020a0390811691161462001da357600080fd5b62001daf8383620034ef565b151562001dbb57600080fd5b50600192915050565b600054600160a060020a031681565b6003546000903390600160a060020a03166368c197dd8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001e2957600080fd5b5af1151562001e3757600080fd5b50505060405180519050151562001e4d57600080fd5b62001eae8382600160a060020a031663e2d36ef56040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001e9057600080fd5b5af1151562001e9e57600080fd5b50505060405180519050620034ef565b151562001eba57600080fd5b80600160a060020a0316636ab6936a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001ef857600080fd5b5af1151562001f0657600080fd5b5050506040518051600160a060020a0385166000908152600860205260409020541015905062001f3557600080fd5b80600160a060020a031663cc6f06a36040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001f7357600080fd5b5af1151562001f8157600080fd5b5050506040518051600160a060020a0385166000908152600a60205260409020541015905062001fb057600080fd5b600354600160a060020a0316631884c517338560405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b15156200200957600080fd5b5af115156200201757600080fd5b5050506040518051905015156200202d57600080fd5b33600160a060020a03167fd3548f8b6a2a11c4a35ef5a16dbf7142c9db5163c7d46e7f66482664277cff0784604051600160a060020a03909116815260200160405180910390a250600192915050565b60008054600160a060020a03166323b872dd33308560405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515620020e257600080fd5b5af11515620020f057600080fd5b5050506040518051905015156200210657600080fd5b600160a060020a03331660009081526008602052604090205462002131908363ffffffff6200307116565b33600160a060020a03811660009081526008602052604090819020929092557fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c91849051600160a060020a03909216825260208201526040908101905180910390a1506001919050565b600160a060020a038416600090815260096020526040812054819081908190819081908190819081908d9060ff161515620021d557600080fd5b8d985033600160a060020a031689600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200222057600080fd5b5af115156200222e57600080fd5b50505060405180519050600160a060020a03161415156200224e57600080fd5b600289600160a060020a031663e329c4786040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200228e57600080fd5b5af115156200229c57600080fd5b505050604051805190506004811115620022b257fe5b14620022bd57600080fd5b88600160a060020a0316636946f6926040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620022fb57600080fd5b5af115156200230957600080fd5b5050506040518051985050600160a060020a0388166326137e6b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200235257600080fd5b5af115156200236057600080fd5b50505060405180519750506000871115620023e257620023d688600160a060020a031663deff41c16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620023b757600080fd5b5af11515620023c557600080fd5b505050604051805190508862002fda565b1515620023e257600080fd5b88600160a060020a03166371a599ca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200242057600080fd5b5af115156200242e57600080fd5b5050506040518051965050600160a060020a03861615620025175785600160a060020a03166362d598eb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200248757600080fd5b5af115156200249557600080fd5b5050506040518051955050600085111562002517576200250b86600160a060020a031663deff41c16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620024ec57600080fd5b5af11515620024fa57600080fd5b505050604051805190508662002fda565b15156200251757600080fd5b600454600160a060020a039081169063eb3721be908b1663ecc40f646040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200256257600080fd5b5af115156200257057600080fd5b5050506040518051905060405160e060020a63ffffffff8416028152600481019190915260240161010060405180830381600087803b1515620025b257600080fd5b5af11515620025c057600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051906020018051600454959c509a5062002648975050600160a060020a039093169450636b14ea369350604092505050518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019d157600080fd5b9150620026ec89600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200268c57600080fd5b5af115156200269a57600080fd5b50505060405180519050620026e68b600160a060020a0316638628aaff6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a9457600080fd5b6200358b565b1515620026f857600080fd5b6200270483836200346c565b15156200271057600080fd5b88600160a060020a031663d5fdfdbc8e8e8e6040518463ffffffff1660e060020a02815260040180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156200277b57808201518382015260200162002761565b50505050905090810190601f168015620027a95780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b83811015620027e1578082015183820152602001620027c7565b50505050905090810190601f1680156200280f5780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015620028475780820151838201526020016200282d565b50505050905090810190601f168015620028755780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b15156200289857600080fd5b5af11515620028a657600080fd5b505050600160a060020a03301660009081526008602052604081206001015494508411156200293a5762002908620028fa6103e8620028ed87600a63ffffffff6200357416565b9063ffffffff6200364016565b859063ffffffff6200362816565b93506200291630856200358b565b15156200292257600080fd5b6200292e838562002fda565b15156200293a57600080fd5b7fed236d0a24cb7a32c76960696e44bac711b80ef76780688405dc96c2495b75f98e8a600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200299a57600080fd5b5af11515620029a857600080fd5b50505060405180519050604051600160a060020a039283168152911660208201526040908101905180910390a15060019d9c50505050505050505050505050565b600754600160a060020a031681565b60045460009033600160a060020a0390811691161462002a1757600080fd5b62001daf83836200346c565b600254600160a060020a031681565b6008602052600090815260409020805460019091015482565b60096020526000908152604090205460ff1681565b60075433600160a060020a0390811691161462002a7c57600080fd5b600054600160a060020a03161562002a9357600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03978816179091556004805482169587169590951790945560038054851693861693909317909255600180548416918516919091179055600280549092169216919091179055565b6005602052806000526040600020600091509050806000015490806001018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002bb55780601f1062002b895761010080835404028352916020019162002bb5565b820191906000526020600020905b81548152906001019060200180831162002b9757829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002c575780601f1062002c2b5761010080835404028352916020019162002c57565b820191906000526020600020905b81548152906001019060200180831162002c3957829003601f168201915b5050505050908060030154905084565b600062002c7362003750565b62002c7d62003750565b600062002c8a8562000f5a565b151562002c9657600080fd5b60008581526005602090815260409182902080546003820154600180840180549396909560029586019593948794938116156101000260001901169290920491601f83018190048102019051908101604052809291908181526020018280546001816001161561010002031660029004801562002d575780601f1062002d2b5761010080835404028352916020019162002d57565b820191906000526020600020905b81548152906001019060200180831162002d3957829003601f168201915b50505050509250818054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002df75780601f1062002dcb5761010080835404028352916020019162002df7565b820191906000526020600020905b81548152906001019060200180831162002dd957829003601f168201915b5050505050915093509350935093509193509193565b6003546000908190600160a060020a031663d440c6f38460405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002e6357600080fd5b5af1151562002e7157600080fd5b5050506040518051600160a060020a03949094166000908152600a6020526040902054939492505050565b6001546000908190600160a060020a031663fc06a87788888888886040518663ffffffff1660e060020a0281526004018080602001858152602001806020018381038352888882818152602001925080828437909101848103835285815260200190508585808284378201915050975050505050505050602060405180830381600087803b151562002f2d57600080fd5b5af1151562002f3b57600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f03d3b6187bbe7d21aa3cf229e292ba41fa8bca6ec2128c0f1625178b8191cdc28989898989604051602081018490526060808252810185905280604081016080820188888082843790910184810383528581526020019050858580828437820191505097505050505050505060405180910390a39695505050505050565b600160a060020a03821660009081526008602052604081205462003005908363ffffffff6200307116565b600160a060020a03841660009081526008602052604090819020919091557f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc9908490849051600160a060020a03909216825260208201526040908101905180910390a150600192915050565b6000828201838110156200308157fe5b8091505b5092915050565b6003546000908390600160a060020a03166368c197dd8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515620030e257600080fd5b5af11515620030f057600080fd5b5050506040518051905015156200310657600080fd5b620031678382600160a060020a031663e2d36ef56040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200314957600080fd5b5af115156200315757600080fd5b505050604051805190506200346c565b15156200317357600080fd5b600354600160a060020a0316630b00de8d858560405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b1515620031cc57600080fd5b5af11515620031da57600080fd5b505050604051805190501515620031f057600080fd5b5060019392505050565b6000828211156200320757fe5b50900390565b600154600090839082908190600160a060020a0316638403be918460405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200326757600080fd5b5af115156200327557600080fd5b5050506040518051905015156200328b57600080fd5b82600160a060020a03166326137e6b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620032c957600080fd5b5af11515620032d757600080fd5b5050506040518051925050600160a060020a03851615620033d457506002548490600160a060020a03166316265b4e8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200334657600080fd5b5af115156200335457600080fd5b5050506040518051905015156200336a57600080fd5b620033d181600160a060020a03166362d598eb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620033ac57600080fd5b5af11515620033ba57600080fd5b505050604051805184915063ffffffff6200307116565b91505b600354600160a060020a03166368c197dd8860405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200342557600080fd5b5af115156200343357600080fd5b5050506040518051905015156200344957600080fd5b620034558883620034ef565b15156200346157600080fd5b509695505050505050565b600160a060020a0382166000908152600860205260408120600101546200349a908363ffffffff620031fa16565b600160a060020a0384166000908152600860205260409020600181019190915554620034cd908363ffffffff6200307116565b600160a060020a03841660009081526008602052604090205550600192915050565b600160a060020a0382166000908152600860205260408120546200351a908363ffffffff620031fa16565b600160a060020a0384166000908152600860205260409020908155600101546200354b908363ffffffff6200307116565b600160a060020a0384166000908152600860205260409020600190810191909155905092915050565b6000620035848383606462003652565b9392505050565b600160a060020a038216600090815260086020526040812060010154620035b9908363ffffffff620031fa16565b600160a060020a03841660009081526008602052604090819020600101919091557f4051ba94e08bb094159fc38391422b4b8ccfd2b1f8919c0eb37bb042d4b9cd8e908490849051600160a060020a03909216825260208201526040908101905180910390a150600192915050565b600081831062003639578162003584565b5090919050565b60008183101562003639578162003584565b60006200366b62003664858562003673565b83620036a2565b949350505050565b60008083151562003688576000915062003085565b508282028284828115156200369957fe5b04146200308157fe5b6000808284811515620036b157fe5b04949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620036fd57805160ff19168380011785556200372d565b828001600101855582156200372d579182015b828111156200372d57825182559160200191906001019062003710565b506200373b92915062003762565b5090565b604051610c5a806200378383390190565b60206040519081016040526000815290565b6200377f91905b808211156200373b576000815560010162003769565b9056006060604052341561000f57600080fd5b604051610c5a380380610c5a8339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805182019190602001805191906020018051600e8054600160a060020a03191633600160a060020a039081169190911790915590925089161515905061009257600080fd5b6000805460ff1916600190811790915589905560028054600160a060020a0319908116600160a060020a038a81169190911790925560038054821689841617905560048054821688841617905560058054909116918a1691909117905560068490556007838051610107929160200190610141565b5060088054600160a060020a03938416600160a060020a03199182161790915560098054929093169116179055506101dc95505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061018257805160ff19168380011785556101af565b828001600101855582156101af579182015b828111156101af578251825591602001919060010190610194565b506101bb9291506101bf565b5090565b6101d991905b808211156101bb57600081556001016101c5565b90565b610a6f806101eb6000396000f3006060604052600436106101065763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630690e5b8811461010b57806315298c771461013a5780631a514d97146101c45780632d4d671f146101eb5780634e71d92d146101fe5780635f44910c146102135780636946f6921461022657806371a599ca146102395780638628aaff1461024c5780639c4a856114610271578063cc3a2dfa14610284578063d3281fd614610297578063d3a69e01146102aa578063d5fdfdbc146102bd578063da1fea2814610392578063e329c478146103a5578063ecc40f64146103dc578063f3859f57146103ef578063f6a5b13e14610402575b600080fd5b341561011657600080fd5b61011e610415565b604051600160a060020a03909116815260200160405180910390f35b341561014557600080fd5b61014d610424565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610189578082015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101cf57600080fd5b6101d76104c2565b604051901515815260200160405180910390f35b34156101f657600080fd5b6101d761053d565b341561020957600080fd5b6102116105b7565b005b341561021e57600080fd5b61011e610647565b341561023157600080fd5b61011e610656565b341561024457600080fd5b61011e610665565b341561025757600080fd5b61025f610674565b60405190815260200160405180910390f35b341561027c57600080fd5b61014d61067a565b341561028f57600080fd5b61014d6106e5565b34156102a257600080fd5b61025f610750565b34156102b557600080fd5b61011e610756565b34156102c857600080fd5b61021160046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061076595505050505050565b341561039d57600080fd5b61011e610913565b34156103b057600080fd5b6103b8610922565b604051808260048111156103c857fe5b60ff16815260200191505060405180910390f35b34156103e757600080fd5b61025f61092b565b34156103fa57600080fd5b61014d610931565b341561040d57600080fd5b61011e61099c565b600454600160a060020a031681565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b505050505081565b60045460009033600160a060020a039081169116146104e057600080fd5b600260005460ff1660048111156104f357fe5b146104fd57600080fd5b6000805460ff191660011790557f06c42818c4ab74dff6aec55942f601c2e9b7f2aa4321ee71690b125eacfe465460405160405180910390a15060015b90565b60045460009033600160a060020a0390811691161461055b57600080fd5b600160005460ff16600481111561056e57fe5b1461057857600080fd5b6000805460ff191660021790557f2b0cab0be6d82b2661b3b789c540ec9c7223aac635ac8e59a1e71e1137f2dd7760405160405180910390a150600190565b600e5433600160a060020a039081169116146105d257600080fd5b600160005460ff1660048111156105e557fe5b14806106015750600260005460ff1660048111156105ff57fe5b145b151561060c57600080fd5b6000805460ff191660031790557f1938697ee29e363ecda49e464c6d2aae25f0974bd1f2c81a91c21e13ad8dbf7760405160405180910390a1565b600554600160a060020a031681565b600254600160a060020a031681565b600354600160a060020a031681565b60065481565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600a5481565b600e54600160a060020a031681565b600e5433600160a060020a0390811691161461078057600080fd5b600260005460ff16600481111561079357fe5b1461079d57600080fd5b6000805460ff19166004179055600b8380516107bd9291602001906109ab565b50600c8280516107d19291602001906109ab565b50600d8180516107e59291602001906109ab565b508282826040518084805190602001908083835b602083106108185780518252601f1990920191602091820191016107f9565b6001836020036101000a038019825116818451161790925250505091909101905083805190602001908083835b602083106108645780518252601f199092019160209182019101610845565b6001836020036101000a038019825116818451161790925250505091909101905082805190602001908083835b602083106108b05780518252601f199092019160209182019101610891565b6001836020036101000a03801982511681845116179092525050509190910194506040935050505051908190039020600a557f777f59509d985349c80271b657d2649b218bc6f075a4625821b64448cc235b8660405160405180910390a1505050565b600854600160a060020a031681565b60005460ff1681565b60015481565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600954600160a060020a031681565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106109ec57805160ff1916838001178555610a19565b82800160010185558215610a19579182015b82811115610a195782518255916020019190600101906109fe565b50610a25929150610a29565b5090565b61053a91905b80821115610a255760008155600101610a2f5600a165627a7a72305820aab9d309bae837f3417f3dc81c0f650543365c210e440786b5dfc09f1981eba70029a165627a7a7230582046504159ab1dbf3323b50d5d77d2f716286b233fadce62375204e0fc7ad76d490029
Deployed Bytecode
0x606060405260043610620002155763ffffffff60e060020a6000350416630800b89e81146200021a5780630c91f2d0146200023e57806310793b5014620002825780631708d72514620002b05780631f87172614620002d2578063234a0ee714620002fd578063298503d9146200032f5780632e1a7d4d14620003c757806332baa8d914620003e057806332ca558714620003f957806339b73122146200041b5780634f73b8e6146200044c578063536e280014620004625780635f51522614620004ac57806366de5a4f14620004ce57806369e99b5c14620004f95780636b4f6865146200051b5780636e885bd71462000546578063747bcd72146200055c578063817e83321462000572578063835436b414620005885780638981d07714620005aa5780638986916314620005d55780638c0f8e1114620005f75780639fdf96251462000619578063a0efe2551462000649578063abc8c7af146200065f578063ac26109e1462000675578063b017c036146200069a578063b218cf1514620006b0578063b6b55f2514620006d2578063b6b57ebd14620006eb578063b6b8c3cd14620007d1578063b7b6e97814620007e7578063bc04d77b146200080c578063be02ee6e1462000822578063ddaeb6001462000844578063e760a11a1462000866578063eeeb2ba014620008a0578063f3052d2614620009ae578063f69f190c14620009c7578063fc06a8771462000a0b575b600080fd5b34156200022657600080fd5b6200023c600160a060020a036004351662000a3c565b005b34156200024a57600080fd5b6200026e600160a060020a0360043581169060243516604435606435151562000a87565b604051901515815260200160405180910390f35b34156200028e57600080fd5b6200029862000bf4565b60405191825260208201526040908101905180910390f35b3415620002bc57600080fd5b6200026e600160a060020a036004351662000bfd565b3415620002de57600080fd5b620002eb60043562000c66565b60405190815260200160405180910390f35b34156200030957600080fd5b6200031362000c95565b604051600160a060020a03909116815260200160405180910390f35b34156200033b57600080fd5b620002eb60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650509335935062000ca492505050565b3415620003d357600080fd5b6200026e60043562000e52565b3415620003ec57600080fd5b6200026e60043562000f5a565b34156200040557600080fd5b6200026e600160a060020a036004351662000f6d565b34156200042757600080fd5b6200031360246004803582810192908201359181359160443590810191013562000f8b565b34156200045857600080fd5b620002eb620010c9565b34156200046e57600080fd5b620003136004803590600160a060020a03602480358216926044358316926064358116926084359081019201359060a43581169060c43516620010cf565b3415620004b857600080fd5b62000298600160a060020a0360043516620012f9565b3415620004da57600080fd5b620003136024600480358281019291013590356044356064356200131c565b34156200050557600080fd5b620002eb600160a060020a036004351662001449565b34156200052757600080fd5b6200026e600160a060020a03600435811690602435166044356200145b565b34156200055257600080fd5b620003136200151e565b34156200056857600080fd5b620002eb6200152d565b34156200057e57600080fd5b620002eb62001532565b34156200059457600080fd5b6200026e600160a060020a036004351662001537565b3415620005b657600080fd5b6200026e600160a060020a0360043581169060243516604435620015a0565b3415620005e157600080fd5b6200026e600160a060020a03600435166200164c565b34156200060357600080fd5b620002eb600160a060020a036004351662001bbd565b34156200062557600080fd5b6200026e600160a060020a0360043581169060243516604435606435151562001bd8565b34156200065557600080fd5b620002eb62001d6f565b34156200066b57600080fd5b6200031362001d75565b34156200068157600080fd5b6200026e600160a060020a036004351660243562001d84565b3415620006a657600080fd5b6200031362001dc4565b3415620006bc57600080fd5b6200026e600160a060020a036004351662001dd3565b3415620006de57600080fd5b6200026e6004356200207d565b3415620006f757600080fd5b6200026e60048035600160a060020a03169060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506200219b95505050505050565b3415620007dd57600080fd5b62000313620029e9565b3415620007f357600080fd5b6200026e600160a060020a0360043516602435620029f8565b34156200081857600080fd5b6200031362002a23565b34156200082e57600080fd5b62000298600160a060020a036004351662002a32565b34156200085057600080fd5b6200026e600160a060020a036004351662002a4b565b34156200087257600080fd5b6200023c600160a060020a036004358116906024358116906044358116906064358116906084351662002a60565b3415620008ac57600080fd5b620008b960043562002aff565b604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101562000908578082015183820152602001620008ee565b50505050905090810190601f168015620009365780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156200096e57808201518382015260200162000954565b50505050905090810190601f1680156200099c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3415620009ba57600080fd5b620008b960043562002c67565b3415620009d357600080fd5b620009e9600160a060020a036004351662002e0d565b604051600160a060020a03909216825260208201526040908101905180910390f35b341562000a1757600080fd5b6200031360246004803582810192908201359181359160443590810191013562002e9c565b60075433600160a060020a0390811691161462000a5857600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a038416600090815260096020526040812054859060ff16151562000ab157600080fd5b33600160a060020a031686600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000af957600080fd5b5af1151562000b0757600080fd5b50505060405180519050600160a060020a031614151562000b2757600080fd5b62000b33858562002fda565b151562000b3f57600080fd5b821562000be857600b5462000b5c90600163ffffffff6200307116565b600b55600160a060020a0385166000908152600a602052604090205462000b8b90600163ffffffff6200307116565b600160a060020a0386166000818152600a60205260409081902092909255907f98b231d22df4a95e9d99b5d3f4d25fab5a821c22d7f517a522731c2892ed453590889051600160a060020a03909116815260200160405180910390a25b50600195945050505050565b600b54600c5482565b600062000c0b33836200308c565b151562000c1757600080fd5b33600160a060020a03167f9644170e77fec17243f5fdc3519cba6d2162d1dda59af75508fd9a2005aeb78483604051600160a060020a03909116815260200160405180910390a2506001919050565b600062000c738262000f5a565b151562000c7f57600080fd5b5060009081526005602052604090206003015490565b600154600160a060020a031681565b600754600090819033600160a060020a0390811691161462000cc557600080fd5b60065462000cdb90600163ffffffff6200307116565b6006819055600081815260056020526040902090815590506001810185805162000d0a929160200190620036ba565b506002810184805162000d22929160200190620036ba565b50600381018390556006547f62bf08360c9d561749c54eaf4f8bf8cb6c8b6f4f40607bcec39a8172e714d25c90868686604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101562000da157808201518382015260200162000d87565b50505050905090810190601f16801562000dcf5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b8381101562000e0757808201518382015260200162000ded565b50505050905090810190601f16801562000e355780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a150506006549392505050565b600160a060020a03331660009081526008602052604081205462000e7d908363ffffffff620031fa16565b33600160a060020a038181166000908152600860205260408082209490945554169163a9059cbb919085905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000eea57600080fd5b5af1151562000ef857600080fd5b50505060405180519050151562000f0e57600080fd5b7f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243643383604051600160a060020a03909216825260208201526040908101905180910390a1506001919050565b6000908152600560205260408120541190565b600160a060020a031660009081526009602052604090205460ff1690565b6002546000908190600160a060020a03166339b7312288888888886040518663ffffffff1660e060020a0281526004018080602001858152602001806020018381038352888882818152602001925080828437909101848103835285815260200190508585808284378201915050975050505050505050602060405180830381600087803b15156200101c57600080fd5b5af115156200102a57600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f49413c774d3fe9c92f6ada69299963d9b4b1c13a1f2a95a019188e2c161ed1438989898989604051602081018490526060808252810185905280604081016080820188888082843790910184810383528581526020019050858580828437820191505097505050505050505060405180910390a39695505050505050565b6103e881565b600454600090339082908190600160a060020a03166302a63c288d858e60405160e060020a63ffffffff86160281526004810193909352600160a060020a039182166024840152166044820152606401602060405180830381600087803b15156200113957600080fd5b5af115156200114757600080fd5b5050506040518051905015156200115d57600080fd5b6200116b838c8c8c6200320d565b91508b838b8b8e868d8d8d8d620011816200373f565b8a8152600160a060020a03808b16602083015289811660408301528881166060830152878116608083015260a0820187905283811660e0830152821661010082015261012060c08201818152908201859052610140820186868082843782019150509b505050505050505050505050604051809103906000f08015156200120757600080fd5b600160a060020a0380821660009081526009602052604090819020805460ff191660011790559192508c1690637919233f9083908f905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200127f57600080fd5b5af115156200128d57600080fd5b505050604051805190501515620012a357600080fd5b8a600160a060020a03167f359f2105b31d71ee8e2315c3dc3427b3f7297dcc85dd3883d4554e67f1f22d0082604051600160a060020a03909116815260200160405180910390a29b9a5050505050505050505050565b600160a060020a0316600090815260086020526040902080546001909101549091565b6003546004546000918291600160a060020a039182169163215bd303918a918a918a918a918a91166040518763ffffffff1660e060020a028152600401808060200186815260200185815260200184815260200183600160a060020a0316600160a060020a0316815260200182810382528888828181526020019250808284378201915050975050505050505050602060405180830381600087803b1515620013c457600080fd5b5af11515620013d257600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f3c29f4ff1e741e465a1ad9cc4c0b8e51c046c021ca9e77172d812ae667f566f889896040516020808252810182905280604081018484808284378201915050935050505060405180910390a39695505050505050565b600a6020526000908152604090205481565b600160a060020a038316600090815260096020526040812054849060ff1615156200148557600080fd5b33600160a060020a031685600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620014cd57600080fd5b5af11515620014db57600080fd5b50505060405180519050600160a060020a0316141515620014fb57600080fd5b6200150784846200346c565b15156200151357600080fd5b506001949350505050565b600354600160a060020a031681565b603281565b600a81565b60006200154533836200308c565b15156200155157600080fd5b33600160a060020a03167f5580db655b3146ef4d1fdba3305cf74dbc3f29126c7a3832533f84e00d149ee383604051600160a060020a03909116815260200160405180910390a2506001919050565b600160a060020a038316600090815260096020526040812054849060ff161515620015ca57600080fd5b33600160a060020a031685600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200161257600080fd5b5af115156200162057600080fd5b50505060405180519050600160a060020a03161415156200164057600080fd5b620015078484620034ef565b600160a060020a038116600090815260096020526040812054819081908190819081908190889060ff1615156200168257600080fd5b88965033600160a060020a031687600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620016cd57600080fd5b5af11515620016db57600080fd5b50505060405180519050600160a060020a0316141515620016fb57600080fd5b86600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200173957600080fd5b5af115156200174757600080fd5b5050506040518051965050600160a060020a03871663e329c4786040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200179057600080fd5b5af115156200179e57600080fd5b5050506040518051955060019050856004811115620017b957fe5b1480620017d257506002856004811115620017d057fe5b145b1515620017de57600080fd5b85600160a060020a031663898691638a60405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200182d57600080fd5b5af115156200183b57600080fd5b5050506040518051905015156200185157600080fd5b86600160a060020a0316634e71d92d6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156200188f57600080fd5b5af115156200189d57600080fd5b5050600454600160a060020a03908116915063eb3721be90891663ecc40f646040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620018eb57600080fd5b5af11515620018f957600080fd5b5050506040518051905060405160e060020a63ffffffff8416028152600481019190915260240161010060405180830381600087803b15156200193b57600080fd5b5af115156200194957600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051906020018051600454959c509a50620019f6975050600160a060020a039093169450636b14ea369350604092505050518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019d157600080fd5b5af11515620019df57600080fd5b505050604051805186915063ffffffff6200357416565b915062001abf87600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a3a57600080fd5b5af1151562001a4857600080fd5b5050506040518051905062001ab989600160a060020a0316638628aaff6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a9457600080fd5b5af1151562001aa257600080fd5b505050604051805188915063ffffffff6200307116565b6200346c565b151562001acb57600080fd5b62001ad783836200358b565b151562001ae357600080fd5b62001aef308362002fda565b151562001afb57600080fd5b62001b073083620034ef565b151562001b1357600080fd5b7fb3cae8ec1c2754530963fb2e254826aae88dda74178f1a0c5656776941e604b88988600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001b7357600080fd5b5af1151562001b8157600080fd5b50505060405180519050604051600160a060020a039283168152911660208201526040908101905180910390a150600198975050505050505050565b600160a060020a03166000908152600a602052604090205490565b600160a060020a038416600090815260096020526040812054859060ff16151562001c0257600080fd5b33600160a060020a031686600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001c4a57600080fd5b5af1151562001c5857600080fd5b50505060405180519050600160a060020a031614151562001c7857600080fd5b62001c8485856200358b565b151562001c9057600080fd5b821562000be857600c5462001cad90600163ffffffff6200307116565b600c55600160a060020a0385166000908152600a602052604090205462001d079062001ce190603263ffffffff6200362816565b600160a060020a0387166000908152600a60205260409020549063ffffffff620031fa16565b600160a060020a0386166000818152600a60205260409081902092909255907fd21e70eb7104cb6f403402b79fe1c088dc56b69ecb7474ae68a3e861a5a6d49990889051600160a060020a03909116815260200160405180910390a250600195945050505050565b60065481565b600454600160a060020a031681565b60045460009033600160a060020a0390811691161462001da357600080fd5b62001daf8383620034ef565b151562001dbb57600080fd5b50600192915050565b600054600160a060020a031681565b6003546000903390600160a060020a03166368c197dd8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001e2957600080fd5b5af1151562001e3757600080fd5b50505060405180519050151562001e4d57600080fd5b62001eae8382600160a060020a031663e2d36ef56040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001e9057600080fd5b5af1151562001e9e57600080fd5b50505060405180519050620034ef565b151562001eba57600080fd5b80600160a060020a0316636ab6936a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001ef857600080fd5b5af1151562001f0657600080fd5b5050506040518051600160a060020a0385166000908152600860205260409020541015905062001f3557600080fd5b80600160a060020a031663cc6f06a36040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001f7357600080fd5b5af1151562001f8157600080fd5b5050506040518051600160a060020a0385166000908152600a60205260409020541015905062001fb057600080fd5b600354600160a060020a0316631884c517338560405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b15156200200957600080fd5b5af115156200201757600080fd5b5050506040518051905015156200202d57600080fd5b33600160a060020a03167fd3548f8b6a2a11c4a35ef5a16dbf7142c9db5163c7d46e7f66482664277cff0784604051600160a060020a03909116815260200160405180910390a250600192915050565b60008054600160a060020a03166323b872dd33308560405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515620020e257600080fd5b5af11515620020f057600080fd5b5050506040518051905015156200210657600080fd5b600160a060020a03331660009081526008602052604090205462002131908363ffffffff6200307116565b33600160a060020a03811660009081526008602052604090819020929092557fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c91849051600160a060020a03909216825260208201526040908101905180910390a1506001919050565b600160a060020a038416600090815260096020526040812054819081908190819081908190819081908d9060ff161515620021d557600080fd5b8d985033600160a060020a031689600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200222057600080fd5b5af115156200222e57600080fd5b50505060405180519050600160a060020a03161415156200224e57600080fd5b600289600160a060020a031663e329c4786040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200228e57600080fd5b5af115156200229c57600080fd5b505050604051805190506004811115620022b257fe5b14620022bd57600080fd5b88600160a060020a0316636946f6926040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620022fb57600080fd5b5af115156200230957600080fd5b5050506040518051985050600160a060020a0388166326137e6b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200235257600080fd5b5af115156200236057600080fd5b50505060405180519750506000871115620023e257620023d688600160a060020a031663deff41c16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620023b757600080fd5b5af11515620023c557600080fd5b505050604051805190508862002fda565b1515620023e257600080fd5b88600160a060020a03166371a599ca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200242057600080fd5b5af115156200242e57600080fd5b5050506040518051965050600160a060020a03861615620025175785600160a060020a03166362d598eb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200248757600080fd5b5af115156200249557600080fd5b5050506040518051955050600085111562002517576200250b86600160a060020a031663deff41c16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620024ec57600080fd5b5af11515620024fa57600080fd5b505050604051805190508662002fda565b15156200251757600080fd5b600454600160a060020a039081169063eb3721be908b1663ecc40f646040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200256257600080fd5b5af115156200257057600080fd5b5050506040518051905060405160e060020a63ffffffff8416028152600481019190915260240161010060405180830381600087803b1515620025b257600080fd5b5af11515620025c057600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051906020018051600454959c509a5062002648975050600160a060020a039093169450636b14ea369350604092505050518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019d157600080fd5b9150620026ec89600160a060020a0316635f44910c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200268c57600080fd5b5af115156200269a57600080fd5b50505060405180519050620026e68b600160a060020a0316638628aaff6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001a9457600080fd5b6200358b565b1515620026f857600080fd5b6200270483836200346c565b15156200271057600080fd5b88600160a060020a031663d5fdfdbc8e8e8e6040518463ffffffff1660e060020a02815260040180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156200277b57808201518382015260200162002761565b50505050905090810190601f168015620027a95780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b83811015620027e1578082015183820152602001620027c7565b50505050905090810190601f1680156200280f5780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015620028475780820151838201526020016200282d565b50505050905090810190601f168015620028755780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b15156200289857600080fd5b5af11515620028a657600080fd5b505050600160a060020a03301660009081526008602052604081206001015494508411156200293a5762002908620028fa6103e8620028ed87600a63ffffffff6200357416565b9063ffffffff6200364016565b859063ffffffff6200362816565b93506200291630856200358b565b15156200292257600080fd5b6200292e838562002fda565b15156200293a57600080fd5b7fed236d0a24cb7a32c76960696e44bac711b80ef76780688405dc96c2495b75f98e8a600160a060020a0316630690e5b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200299a57600080fd5b5af11515620029a857600080fd5b50505060405180519050604051600160a060020a039283168152911660208201526040908101905180910390a15060019d9c50505050505050505050505050565b600754600160a060020a031681565b60045460009033600160a060020a0390811691161462002a1757600080fd5b62001daf83836200346c565b600254600160a060020a031681565b6008602052600090815260409020805460019091015482565b60096020526000908152604090205460ff1681565b60075433600160a060020a0390811691161462002a7c57600080fd5b600054600160a060020a03161562002a9357600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03978816179091556004805482169587169590951790945560038054851693861693909317909255600180548416918516919091179055600280549092169216919091179055565b6005602052806000526040600020600091509050806000015490806001018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002bb55780601f1062002b895761010080835404028352916020019162002bb5565b820191906000526020600020905b81548152906001019060200180831162002b9757829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002c575780601f1062002c2b5761010080835404028352916020019162002c57565b820191906000526020600020905b81548152906001019060200180831162002c3957829003601f168201915b5050505050908060030154905084565b600062002c7362003750565b62002c7d62003750565b600062002c8a8562000f5a565b151562002c9657600080fd5b60008581526005602090815260409182902080546003820154600180840180549396909560029586019593948794938116156101000260001901169290920491601f83018190048102019051908101604052809291908181526020018280546001816001161561010002031660029004801562002d575780601f1062002d2b5761010080835404028352916020019162002d57565b820191906000526020600020905b81548152906001019060200180831162002d3957829003601f168201915b50505050509250818054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562002df75780601f1062002dcb5761010080835404028352916020019162002df7565b820191906000526020600020905b81548152906001019060200180831162002dd957829003601f168201915b5050505050915093509350935093509193509193565b6003546000908190600160a060020a031663d440c6f38460405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002e6357600080fd5b5af1151562002e7157600080fd5b5050506040518051600160a060020a03949094166000908152600a6020526040902054939492505050565b6001546000908190600160a060020a031663fc06a87788888888886040518663ffffffff1660e060020a0281526004018080602001858152602001806020018381038352888882818152602001925080828437909101848103835285815260200190508585808284378201915050975050505050505050602060405180830381600087803b151562002f2d57600080fd5b5af1151562002f3b57600080fd5b50505060405180519050905080600160a060020a031632600160a060020a03167f03d3b6187bbe7d21aa3cf229e292ba41fa8bca6ec2128c0f1625178b8191cdc28989898989604051602081018490526060808252810185905280604081016080820188888082843790910184810383528581526020019050858580828437820191505097505050505050505060405180910390a39695505050505050565b600160a060020a03821660009081526008602052604081205462003005908363ffffffff6200307116565b600160a060020a03841660009081526008602052604090819020919091557f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc9908490849051600160a060020a03909216825260208201526040908101905180910390a150600192915050565b6000828201838110156200308157fe5b8091505b5092915050565b6003546000908390600160a060020a03166368c197dd8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515620030e257600080fd5b5af11515620030f057600080fd5b5050506040518051905015156200310657600080fd5b620031678382600160a060020a031663e2d36ef56040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200314957600080fd5b5af115156200315757600080fd5b505050604051805190506200346c565b15156200317357600080fd5b600354600160a060020a0316630b00de8d858560405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b1515620031cc57600080fd5b5af11515620031da57600080fd5b505050604051805190501515620031f057600080fd5b5060019392505050565b6000828211156200320757fe5b50900390565b600154600090839082908190600160a060020a0316638403be918460405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200326757600080fd5b5af115156200327557600080fd5b5050506040518051905015156200328b57600080fd5b82600160a060020a03166326137e6b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620032c957600080fd5b5af11515620032d757600080fd5b5050506040518051925050600160a060020a03851615620033d457506002548490600160a060020a03166316265b4e8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200334657600080fd5b5af115156200335457600080fd5b5050506040518051905015156200336a57600080fd5b620033d181600160a060020a03166362d598eb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620033ac57600080fd5b5af11515620033ba57600080fd5b505050604051805184915063ffffffff6200307116565b91505b600354600160a060020a03166368c197dd8860405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200342557600080fd5b5af115156200343357600080fd5b5050506040518051905015156200344957600080fd5b620034558883620034ef565b15156200346157600080fd5b509695505050505050565b600160a060020a0382166000908152600860205260408120600101546200349a908363ffffffff620031fa16565b600160a060020a0384166000908152600860205260409020600181019190915554620034cd908363ffffffff6200307116565b600160a060020a03841660009081526008602052604090205550600192915050565b600160a060020a0382166000908152600860205260408120546200351a908363ffffffff620031fa16565b600160a060020a0384166000908152600860205260409020908155600101546200354b908363ffffffff6200307116565b600160a060020a0384166000908152600860205260409020600190810191909155905092915050565b6000620035848383606462003652565b9392505050565b600160a060020a038216600090815260086020526040812060010154620035b9908363ffffffff620031fa16565b600160a060020a03841660009081526008602052604090819020600101919091557f4051ba94e08bb094159fc38391422b4b8ccfd2b1f8919c0eb37bb042d4b9cd8e908490849051600160a060020a03909216825260208201526040908101905180910390a150600192915050565b600081831062003639578162003584565b5090919050565b60008183101562003639578162003584565b60006200366b62003664858562003673565b83620036a2565b949350505050565b60008083151562003688576000915062003085565b508282028284828115156200369957fe5b04146200308157fe5b6000808284811515620036b157fe5b04949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620036fd57805160ff19168380011785556200372d565b828001600101855582156200372d579182015b828111156200372d57825182559160200191906001019062003710565b506200373b92915062003762565b5090565b604051610c5a806200378383390190565b60206040519081016040526000815290565b6200377f91905b808211156200373b576000815560010162003769565b9056006060604052341561000f57600080fd5b604051610c5a380380610c5a8339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805182019190602001805191906020018051600e8054600160a060020a03191633600160a060020a039081169190911790915590925089161515905061009257600080fd5b6000805460ff1916600190811790915589905560028054600160a060020a0319908116600160a060020a038a81169190911790925560038054821689841617905560048054821688841617905560058054909116918a1691909117905560068490556007838051610107929160200190610141565b5060088054600160a060020a03938416600160a060020a03199182161790915560098054929093169116179055506101dc95505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061018257805160ff19168380011785556101af565b828001600101855582156101af579182015b828111156101af578251825591602001919060010190610194565b506101bb9291506101bf565b5090565b6101d991905b808211156101bb57600081556001016101c5565b90565b610a6f806101eb6000396000f3006060604052600436106101065763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630690e5b8811461010b57806315298c771461013a5780631a514d97146101c45780632d4d671f146101eb5780634e71d92d146101fe5780635f44910c146102135780636946f6921461022657806371a599ca146102395780638628aaff1461024c5780639c4a856114610271578063cc3a2dfa14610284578063d3281fd614610297578063d3a69e01146102aa578063d5fdfdbc146102bd578063da1fea2814610392578063e329c478146103a5578063ecc40f64146103dc578063f3859f57146103ef578063f6a5b13e14610402575b600080fd5b341561011657600080fd5b61011e610415565b604051600160a060020a03909116815260200160405180910390f35b341561014557600080fd5b61014d610424565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610189578082015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101cf57600080fd5b6101d76104c2565b604051901515815260200160405180910390f35b34156101f657600080fd5b6101d761053d565b341561020957600080fd5b6102116105b7565b005b341561021e57600080fd5b61011e610647565b341561023157600080fd5b61011e610656565b341561024457600080fd5b61011e610665565b341561025757600080fd5b61025f610674565b60405190815260200160405180910390f35b341561027c57600080fd5b61014d61067a565b341561028f57600080fd5b61014d6106e5565b34156102a257600080fd5b61025f610750565b34156102b557600080fd5b61011e610756565b34156102c857600080fd5b61021160046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061076595505050505050565b341561039d57600080fd5b61011e610913565b34156103b057600080fd5b6103b8610922565b604051808260048111156103c857fe5b60ff16815260200191505060405180910390f35b34156103e757600080fd5b61025f61092b565b34156103fa57600080fd5b61014d610931565b341561040d57600080fd5b61011e61099c565b600454600160a060020a031681565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b505050505081565b60045460009033600160a060020a039081169116146104e057600080fd5b600260005460ff1660048111156104f357fe5b146104fd57600080fd5b6000805460ff191660011790557f06c42818c4ab74dff6aec55942f601c2e9b7f2aa4321ee71690b125eacfe465460405160405180910390a15060015b90565b60045460009033600160a060020a0390811691161461055b57600080fd5b600160005460ff16600481111561056e57fe5b1461057857600080fd5b6000805460ff191660021790557f2b0cab0be6d82b2661b3b789c540ec9c7223aac635ac8e59a1e71e1137f2dd7760405160405180910390a150600190565b600e5433600160a060020a039081169116146105d257600080fd5b600160005460ff1660048111156105e557fe5b14806106015750600260005460ff1660048111156105ff57fe5b145b151561060c57600080fd5b6000805460ff191660031790557f1938697ee29e363ecda49e464c6d2aae25f0974bd1f2c81a91c21e13ad8dbf7760405160405180910390a1565b600554600160a060020a031681565b600254600160a060020a031681565b600354600160a060020a031681565b60065481565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600a5481565b600e54600160a060020a031681565b600e5433600160a060020a0390811691161461078057600080fd5b600260005460ff16600481111561079357fe5b1461079d57600080fd5b6000805460ff19166004179055600b8380516107bd9291602001906109ab565b50600c8280516107d19291602001906109ab565b50600d8180516107e59291602001906109ab565b508282826040518084805190602001908083835b602083106108185780518252601f1990920191602091820191016107f9565b6001836020036101000a038019825116818451161790925250505091909101905083805190602001908083835b602083106108645780518252601f199092019160209182019101610845565b6001836020036101000a038019825116818451161790925250505091909101905082805190602001908083835b602083106108b05780518252601f199092019160209182019101610891565b6001836020036101000a03801982511681845116179092525050509190910194506040935050505051908190039020600a557f777f59509d985349c80271b657d2649b218bc6f075a4625821b64448cc235b8660405160405180910390a1505050565b600854600160a060020a031681565b60005460ff1681565b60015481565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104ba5780601f1061048f576101008083540402835291602001916104ba565b600954600160a060020a031681565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106109ec57805160ff1916838001178555610a19565b82800160010185558215610a19579182015b82811115610a195782518255916020019190600101906109fe565b50610a25929150610a29565b5090565b61053a91905b80821115610a255760008155600101610a2f5600a165627a7a72305820aab9d309bae837f3417f3dc81c0f650543365c210e440786b5dfc09f1981eba70029a165627a7a7230582046504159ab1dbf3323b50d5d77d2f716286b233fadce62375204e0fc7ad76d490029
Swarm Source
bzzr://46504159ab1dbf3323b50d5d77d2f716286b233fadce62375204e0fc7ad76d49
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1,357.14
Net Worth in ETH
0.563183
Token Allocations
RLC
100.00%
Multichain Portfolio | 35 Chains
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.