ETH Price: $3,108.28 (-5.56%)

Contract

0xF06eA7e3D791D88C7F7A88CE1280F36a823A7A62
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Explicit100128262020-05-06 12:59:181653 days ago1588769958IN
0xF06eA7e3...a823A7A62
0 ETH0.0080304620
Create Explicit99931852020-05-03 12:26:141656 days ago1588508774IN
0xF06eA7e3...a823A7A62
0 ETH0.002409136
Create Explicit99796912020-05-01 10:01:381658 days ago1588327298IN
0xF06eA7e3...a823A7A62
0 ETH0.002666326.60000023
Create Explicit99796702020-05-01 9:58:471658 days ago1588327127IN
0xF06eA7e3...a823A7A62
0 ETH0.002416526
Create Explicit99796382020-05-01 9:51:581658 days ago1588326718IN
0xF06eA7e3...a823A7A62
0 ETH0.002409136
Create Explicit99403582020-04-25 7:41:371664 days ago1587800497IN
0xF06eA7e3...a823A7A62
0 ETH0.002650056.6
Create Explicit98753782020-04-15 6:21:071674 days ago1586931667IN
0xF06eA7e3...a823A7A62
0 ETH0.002007615
Create Explicit98442632020-04-10 11:35:011679 days ago1586518501IN
0xF06eA7e3...a823A7A62
0 ETH0.001204563
Create Explicit98271782020-04-07 20:23:071681 days ago1586290987IN
0xF06eA7e3...a823A7A62
0 ETH0.000843192.1
Create Explicit96846782020-03-16 20:13:191703 days ago1584389599IN
0xF06eA7e3...a823A7A62
0 ETH0.001606094
Create Explicit95827542020-03-01 3:30:511719 days ago1583033451IN
0xF06eA7e3...a823A7A62
0 ETH0.000401521
Create Explicit95060592020-02-18 8:37:571731 days ago1582015077IN
0xF06eA7e3...a823A7A62
0 ETH0.000401521
Create Explicit94574512020-02-10 20:55:071738 days ago1581368107IN
0xF06eA7e3...a823A7A62
0 ETH0.000481821.2
Create Explicit93013042020-01-17 21:54:441762 days ago1579298084IN
0xF06eA7e3...a823A7A62
0 ETH0.000401521
Create Explicit92973872020-01-17 7:31:321763 days ago1579246292IN
0xF06eA7e3...a823A7A62
0 ETH0.001195872.97833935
Create Explicit92963132020-01-17 3:35:131763 days ago1579232113IN
0xF06eA7e3...a823A7A62
0 ETH0.001204563
Create Explicit92820532020-01-14 23:05:241765 days ago1579043124IN
0xF06eA7e3...a823A7A62
0 ETH0.000803042
Create Explicit91521242019-12-23 19:16:491787 days ago1577128609IN
0xF06eA7e3...a823A7A62
0 ETH0.001606174.0002
Create Explicit91170562019-12-16 19:32:091794 days ago1576524729IN
0xF06eA7e3...a823A7A62
0 ETH0.001204563
Create Explicit90792012019-12-09 20:01:241801 days ago1575921684IN
0xF06eA7e3...a823A7A62
0 ETH0.000401521
Create Explicit90625992019-12-06 21:27:101804 days ago1575667630IN
0xF06eA7e3...a823A7A62
0 ETH0.0040786710
Create Explicit90532492019-12-05 5:25:311806 days ago1575523531IN
0xF06eA7e3...a823A7A62
0 ETH0.000448651.1
Create Explicit90496062019-12-04 13:51:571807 days ago1575467517IN
0xF06eA7e3...a823A7A62
0 ETH0.00061181.5
Create Explicit90436432019-12-03 12:21:131808 days ago1575375673IN
0xF06eA7e3...a823A7A62
0 ETH0.000409091
Create Explicit90436112019-12-03 12:13:351808 days ago1575375215IN
0xF06eA7e3...a823A7A62
0 ETH0.000407861
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
100128262020-05-06 12:59:181653 days ago1588769958
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
99931852020-05-03 12:26:141656 days ago1588508774
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
99796912020-05-01 10:01:381658 days ago1588327298
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
99796702020-05-01 9:58:471658 days ago1588327127
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
99796382020-05-01 9:51:581658 days ago1588326718
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
99403582020-04-25 7:41:371664 days ago1587800497
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
98753782020-04-15 6:21:071674 days ago1586931667
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
98442632020-04-10 11:35:011679 days ago1586518501
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
98271782020-04-07 20:23:071681 days ago1586290987
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
96846782020-03-16 20:13:191703 days ago1584389599
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
95827542020-03-01 3:30:511719 days ago1583033451
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
95060592020-02-18 8:37:571731 days ago1582015077
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
94574512020-02-10 20:55:071738 days ago1581368107
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
93013042020-01-17 21:54:441762 days ago1579298084
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
92973872020-01-17 7:31:321763 days ago1579246292
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
92963132020-01-17 3:35:131763 days ago1579232113
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
92820532020-01-14 23:05:241765 days ago1579043124
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
91521242019-12-23 19:16:491787 days ago1577128609
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
91170562019-12-16 19:32:091794 days ago1576524729
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
90792012019-12-09 20:01:241801 days ago1575921684
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
90625992019-12-06 21:27:101804 days ago1575667630
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
90532492019-12-05 5:25:311806 days ago1575523531
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
90496062019-12-04 13:51:571807 days ago1575467517
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
90436432019-12-03 12:21:131808 days ago1575375673
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
90436112019-12-03 12:13:351808 days ago1575375215
0xF06eA7e3...a823A7A62
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OneWayGriefing_Factory

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-08-24
*/

pragma solidity ^0.5.0;


/**
 * @title Spawn
 * @author 0age
 * @notice This contract provides creation code that is used by Spawner in order
 * to initialize and deploy eip-1167 minimal proxies for a given logic contract.
 */
contract Spawn {
  constructor(
    address logicContract,
    bytes memory initializationCalldata
  ) public payable {
    // delegatecall into the logic contract to perform initialization.
    (bool ok, ) = logicContract.delegatecall(initializationCalldata);
    if (!ok) {
      // pass along failure message from delegatecall and revert.
      assembly {
        returndatacopy(0, 0, returndatasize)
        revert(0, returndatasize)
      }
    }

    // place eip-1167 runtime code in memory.
    bytes memory runtimeCode = abi.encodePacked(
      bytes10(0x363d3d373d3d3d363d73),
      logicContract,
      bytes15(0x5af43d82803e903d91602b57fd5bf3)
    );

    // return eip-1167 code to write it to spawned contract runtime.
    assembly {
      return(add(0x20, runtimeCode), 45) // eip-1167 runtime code, length
    }
  }
}

/**
 * @title Spawner
 * @author 0age
 * @notice This contract spawns and initializes eip-1167 minimal proxies that
 * point to existing logic contracts. The logic contracts need to have an
 * intitializer function that should only callable when no contract exists at
 * their current address (i.e. it is being `DELEGATECALL`ed from a constructor).
 */
contract Spawner {
  /**
   * @notice Internal function for spawning an eip-1167 minimal proxy using
   * `CREATE2`.
   * @param logicContract address The address of the logic contract.
   * @param initializationCalldata bytes The calldata that will be supplied to
   * the `DELEGATECALL` from the spawned contract to the logic contract during
   * contract creation.
   * @return The address of the newly-spawned contract.
   */
  function _spawn(
    address logicContract,
    bytes memory initializationCalldata
  ) internal returns (address spawnedContract) {
    // place creation code and constructor args of contract to spawn in memory.
    bytes memory initCode = abi.encodePacked(
      type(Spawn).creationCode,
      abi.encode(logicContract, initializationCalldata)
    );

    // spawn the contract using `CREATE2`.
    spawnedContract = _spawnCreate2(initCode);
  }

  /**
   * @notice Internal view function for finding the address of the next standard
   * eip-1167 minimal proxy created using `CREATE2` with a given logic contract
   * and initialization calldata payload.
   * @param logicContract address The address of the logic contract.
   * @param initializationCalldata bytes The calldata that will be supplied to
   * the `DELEGATECALL` from the spawned contract to the logic contract during
   * contract creation.
   * @return The address of the next spawned minimal proxy contract with the
   * given parameters.
   */
  function _computeNextAddress(
    address logicContract,
    bytes memory initializationCalldata
  ) internal view returns (address target) {
    // place creation code and constructor args of contract to spawn in memory.
    bytes memory initCode = abi.encodePacked(
      type(Spawn).creationCode,
      abi.encode(logicContract, initializationCalldata)
    );

    // get target address using the constructed initialization code.
    (, target) = _getSaltAndTarget(initCode);
  }


  /**
   * @notice Private function for spawning a compact eip-1167 minimal proxy
   * using `CREATE2`. Provides logic that is reused by internal functions. A
   * salt will also be chosen based on the calling address and a computed nonce
   * that prevents deployments to existing addresses.
   * @param initCode bytes The contract creation code.
   * @return The address of the newly-spawned contract.
   */
  function _spawnCreate2(
    bytes memory initCode
  ) private returns (address spawnedContract) {
    // get salt to use during deployment using the supplied initialization code.
    (bytes32 salt, ) = _getSaltAndTarget(initCode);

    assembly {
      let encoded_data := add(0x20, initCode) // load initialization code.
      let encoded_size := mload(initCode)     // load the init code's length.
      spawnedContract := create2(             // call `CREATE2` w/ 4 arguments.
        callvalue,                            // forward any supplied endowment.
        encoded_data,                         // pass in initialization code.
        encoded_size,                         // pass in init code's length.
        salt                                  // pass in the salt value.
      )

      // pass along failure message from failed contract deployment and revert.
      if iszero(spawnedContract) {
        returndatacopy(0, 0, returndatasize)
        revert(0, returndatasize)
      }
    }
  }

  /**
   * @notice Private function for determining the salt and the target deployment
   * address for the next spawned contract (using create2) based on the contract
   * creation code.
   */
  function _getSaltAndTarget(
    bytes memory initCode
  ) private view returns (bytes32 salt, address target) {
    // get the keccak256 hash of the init code for address derivation.
    bytes32 initCodeHash = keccak256(initCode);

    // set the initial nonce to be provided when constructing the salt.
    uint256 nonce = 0;

    // declare variable for code size of derived address.
    uint256 codeSize;

    while (true) {
      // derive `CREATE2` salt using `msg.sender` and nonce.
      salt = keccak256(abi.encodePacked(msg.sender, nonce));

      target = address(    // derive the target deployment address.
        uint160(                   // downcast to match the address type.
          uint256(                 // cast to uint to truncate upper digits.
            keccak256(             // compute CREATE2 hash using 4 inputs.
              abi.encodePacked(    // pack all inputs to the hash together.
                bytes1(0xff),      // pass in the control character.
                address(this),     // pass in the address of this contract.
                salt,              // pass in the salt from above.
                initCodeHash       // pass in hash of contract creation code.
              )
            )
          )
        )
      );

      // determine if a contract is already deployed to the target address.
      assembly { codeSize := extcodesize(target) }

      // exit the loop if no contract is deployed to the target address.
      if (codeSize == 0) {
        break;
      }

      // otherwise, increment the nonce and derive a new salt.
      nonce++;
    }
  }
}


interface iRegistry {

    enum FactoryStatus { Unregistered, Registered, Retired }

    event FactoryAdded(address owner, address factory, uint256 factoryID, bytes extraData);
    event FactoryRetired(address owner, address factory, uint256 factoryID);
    event InstanceRegistered(address instance, uint256 instanceIndex, address indexed creator, address indexed factory, uint256 indexed factoryID);

    // factory state functions

    function addFactory(address factory, bytes calldata extraData ) external;
    function retireFactory(address factory) external;

    // factory view functions

    function getFactoryCount() external view returns (uint256 count);
    function getFactoryStatus(address factory) external view returns (FactoryStatus status);
    function getFactoryID(address factory) external view returns (uint16 factoryID);
    function getFactoryData(address factory) external view returns (bytes memory extraData);
    function getFactoryAddress(uint16 factoryID) external view returns (address factory);
    function getFactory(address factory) external view returns (FactoryStatus state, uint16 factoryID, bytes memory extraData);
    function getFactories() external view returns (address[] memory factories);
    function getPaginatedFactories(uint256 startIndex, uint256 endIndex) external view returns (address[] memory factories);

    // instance state functions

    function register(address instance, address creator, uint80 extraData) external;

    // instance view functions

    function getInstanceType() external view returns (bytes4 instanceType);
    function getInstanceCount() external view returns (uint256 count);
    function getInstance(uint256 index) external view returns (address instance);
    function getInstances() external view returns (address[] memory instances);
    function getPaginatedInstances(uint256 startIndex, uint256 endIndex) external view returns (address[] memory instances);
}


/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error.
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}


/**
 * @title ERC20 interface
 * @dev see https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}



contract Metadata {

    bytes private _staticMetadata;
    bytes private _variableMetadata;

    event StaticMetadataSet(bytes staticMetadata);
    event VariableMetadataSet(bytes variableMetadata);

    // state functions

    function _setStaticMetadata(bytes memory staticMetadata) internal {
        require(_staticMetadata.length == 0, "static metadata cannot be changed");
        _staticMetadata = staticMetadata;
        emit StaticMetadataSet(staticMetadata);
    }

    function _setVariableMetadata(bytes memory variableMetadata) internal {
        _variableMetadata = variableMetadata;
        emit VariableMetadataSet(variableMetadata);
    }

    // view functions

    function getMetadata() public view returns (bytes memory staticMetadata, bytes memory variableMetadata) {
        staticMetadata = _staticMetadata;
        variableMetadata = _variableMetadata;
    }
}



contract Operated {

    address private _operator;
    bool private _status;

    event OperatorUpdated(address operator, bool status);

    // state functions

    function _setOperator(address operator) internal {
        require(_operator != operator, "cannot set same operator");
        _operator = operator;
        emit OperatorUpdated(operator, hasActiveOperator());
    }

    function _transferOperator(address operator) internal {
        // transferring operator-ship implies there was an operator set before this
        require(_operator != address(0), "operator not set");
        _setOperator(operator);
    }

    function _renounceOperator() internal {
        require(hasActiveOperator(), "only when operator active");
        _operator = address(0);
        _status = false;
        emit OperatorUpdated(address(0), false);
    }

    function _activateOperator() internal {
        require(!hasActiveOperator(), "only when operator not active");
        _status = true;
        emit OperatorUpdated(_operator, true);
    }

    function _deactivateOperator() internal {
        require(hasActiveOperator(), "only when operator active");
        _status = false;
        emit OperatorUpdated(_operator, false);
    }

    // view functions

    function getOperator() public view returns (address operator) {
        operator = _operator;
    }

    function isOperator(address caller) public view returns (bool ok) {
        return (caller == getOperator());
    }

    function hasActiveOperator() public view returns (bool ok) {
        return _status;
    }

    function isActiveOperator(address caller) public view returns (bool ok) {
        return (isOperator(caller) && hasActiveOperator());
    }

}



/* Deadline
 *
 */
contract Deadline {

    uint256 private _deadline;

    event DeadlineSet(uint256 deadline);

    // state functions

    function _setDeadline(uint256 deadline) internal {
        _deadline = deadline;
        emit DeadlineSet(deadline);
    }

    // view functions

    function getDeadline() public view returns (uint256 deadline) {
        deadline = _deadline;
    }

    // if the _deadline is not set yet, isAfterDeadline will return true
    // due to now - 0 = now
    function isAfterDeadline() public view returns (bool status) {
        if (_deadline == 0) {
            status = false;
        } else {
            status = (now >= _deadline);
        }
    }

}


/* @title DecimalMath
 * @dev taken from https://github.com/PolymathNetwork/polymath-core
 * @dev Apache v2 License
 */
library DecimalMath {
    using SafeMath for uint256;

    uint256 internal constant e18 = uint256(10) ** uint256(18);

    /**
     * @notice This function multiplies two decimals represented as (decimal * 10**DECIMALS)
     * @return uint256 Result of multiplication represented as (decimal * 10**DECIMALS)
     */
    function mul(uint256 x, uint256 y) internal pure returns(uint256 z) {
        z = SafeMath.add(SafeMath.mul(x, y), (e18) / 2) / (e18);
    }

    /**
     * @notice This function divides two decimals represented as (decimal * 10**DECIMALS)
     * @return uint256 Result of division represented as (decimal * 10**DECIMALS)
     */
    function div(uint256 x, uint256 y) internal pure returns(uint256 z) {
        z = SafeMath.add(SafeMath.mul(x, (e18)), y / 2) / y;
    }

}


/* TODO: Update eip165 interface
 *  bytes4(keccak256('create(bytes)')) == 0xcf5ba53f
 *  bytes4(keccak256('getInstanceType()')) == 0x18c2f4cf
 *  bytes4(keccak256('getInstanceRegistry()')) == 0xa5e13904
 *  bytes4(keccak256('getImplementation()')) == 0xaaf10f42
 *
 *  => 0xcf5ba53f ^ 0x18c2f4cf ^ 0xa5e13904 ^ 0xaaf10f42 == 0xd88967b6
 */
 interface iFactory {

     event InstanceCreated(address indexed instance, address indexed creator, string initABI, bytes initData);

     function create(bytes calldata initData) external returns (address instance);
     function getInitdataABI() external view returns (string memory initABI);
     function getInstanceRegistry() external view returns (address instanceRegistry);
     function getTemplate() external view returns (address template);

     function getInstanceCreator(address instance) external view returns (address creator);
     function getInstanceType() external view returns (bytes4 instanceType);
     function getInstanceCount() external view returns (uint256 count);
     function getInstance(uint256 index) external view returns (address instance);
     function getInstances() external view returns (address[] memory instances);
     function getPaginatedInstances(uint256 startIndex, uint256 endIndex) external view returns (address[] memory instances);
 }



contract iNMR {

    // ERC20
    function totalSupply() external returns (uint256);
    function balanceOf(address _owner) external returns (uint256);
    function allowance(address _owner, address _spender) external returns (uint256);

    function transfer(address _to, uint256 _value) external returns (bool ok);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool ok);
    function approve(address _spender, uint256 _value) external returns (bool ok);
    function changeApproval(address _spender, uint256 _oldValue, uint256 _newValue) external returns (bool ok);

    // burn
    function mint(uint256 _value) external returns (bool ok);
    // burnFrom
    function numeraiTransfer(address _to, uint256 _value) external returns (bool ok);
}




contract Factory is Spawner {

    address[] private _instances;
    mapping (address => address) private _instanceCreator;

    /* NOTE: The following items can be hardcoded as constant to save ~200 gas/create */
    address private _templateContract;
    string private _initdataABI;
    address private _instanceRegistry;
    bytes4 private _instanceType;

    event InstanceCreated(address indexed instance, address indexed creator, bytes callData);

    function _initialize(address instanceRegistry, address templateContract, bytes4 instanceType, string memory initdataABI) internal {
        // set instance registry
        _instanceRegistry = instanceRegistry;
        // set logic contract
        _templateContract = templateContract;
        // set initdataABI
        _initdataABI = initdataABI;
        // validate correct instance registry
        require(instanceType == iRegistry(instanceRegistry).getInstanceType(), 'incorrect instance type');
        // set instanceType
        _instanceType = instanceType;
    }

    // IFactory methods

    function _create(bytes memory callData) internal returns (address instance) {
        // deploy new contract: initialize it & write minimal proxy to runtime.
        instance = Spawner._spawn(getTemplate(), callData);
        // add the instance to the array
        _instances.push(instance);
        // set instance creator
        _instanceCreator[instance] = msg.sender;
        // add the instance to the instance registry
        iRegistry(getInstanceRegistry()).register(instance, msg.sender, uint64(0));
        // emit event
        emit InstanceCreated(instance, msg.sender, callData);
    }

    function getInstanceCreator(address instance) public view returns (address creator) {
        creator = _instanceCreator[instance];
    }

    function getInstanceType() public view returns (bytes4 instanceType) {
        instanceType = _instanceType;
    }

    function getInitdataABI() public view returns (string memory initdataABI) {
        initdataABI = _initdataABI;
    }

    function getInstanceRegistry() public view returns (address instanceRegistry) {
        instanceRegistry = _instanceRegistry;
    }

    function getTemplate() public view returns (address template) {
        template = _templateContract;
    }

    function getInstanceCount() public view returns (uint256 count) {
        count = _instances.length;
    }

    function getInstance(uint256 index) public view returns (address instance) {
        require(index < _instances.length, "index out of range");
        instance = _instances[index];
    }

    function getInstances() public view returns (address[] memory instances) {
        instances = _instances;
    }

    // Note: startIndex is inclusive, endIndex exclusive
    function getPaginatedInstances(uint256 startIndex, uint256 endIndex) public view returns (address[] memory instances) {
        require(startIndex < endIndex, "startIndex must be less than endIndex");
        require(endIndex <= _instances.length, "end index out of range");

        // initialize fixed size memory array
        address[] memory range = new address[](endIndex - startIndex);

        // Populate array with addresses in range
        for (uint256 i = startIndex; i < endIndex; i++) {
            range[i - startIndex] = _instances[i];
        }

        // return array of addresses
        instances = range;
    }

}




/* Countdown timer
 */
contract Countdown is Deadline {

    using SafeMath for uint256;

    uint256 private _length;

    event LengthSet(uint256 length);

    // state functions

    function _setLength(uint256 length) internal {
        _length = length;
        emit LengthSet(length);
    }

    function _start() internal returns (uint256 deadline) {
        require(_length != 0, "length not set");
        deadline = _length.add(now);
        Deadline._setDeadline(deadline);
    }

    // view functions

    function getLength() public view returns (uint256 length) {
        length = _length;
    }

    // if Deadline._setDeadline or Countdown._setLength is not called,
    // isOver will yield false
    function isOver() public view returns (bool status) {
        // when length or deadline not set,
        // countdown has not started, hence not isOver
        if (_length == 0 || Deadline.getDeadline() == 0) {
            status = false;
        } else {
            status = Deadline.isAfterDeadline();
        }
    }

    // timeRemaining will default to 0 if _setDeadline is not called
    // if the now exceeds deadline, just return 0 as the timeRemaining
    function timeRemaining() public view returns (uint256 time) {
        if (now >= Deadline.getDeadline()) {
            time = 0;
        } else {
            time = Deadline.getDeadline().sub(now);
        }
    }

}



contract Template {

    address private _factory;

    // modifiers

    modifier initializeTemplate() {
        // set factory
        _factory = msg.sender;

        // only allow function to be delegatecalled from within a constructor.
        uint32 codeSize;
        assembly { codeSize := extcodesize(address) }
        require(codeSize == 0, "must be called within contract constructor");
        _;
    }

    // view functions

    function getCreator() public view returns (address creator) {
        // iFactory(...) would revert if _factory address is not actually a factory contract
        creator = iFactory(_factory).getInstanceCreator(address(this));
    }

    function isCreator(address caller) public view returns (bool ok) {
        ok = (caller == getCreator());
    }

}


/**
 * @title NMR token burning helper
 * @dev Allows for calling NMR burn functions using regular openzeppelin ERC20Burnable interface and revert on failure.
 */
contract BurnNMR {

    // address of the token
    address private _Token; // can be hardcoded on mainnet deployment to reduce cost

    function _setToken(address token) internal {
        // set storage
        _Token = token;
    }

    /**
     * @dev Burns a specific amount of tokens.
     * @param value The amount of token to be burned.
     */
    function _burn(uint256 value) internal {
        require(iNMR(_Token).mint(value), "nmr burn failed");
    }

    /**
     * @dev Burns a specific amount of tokens from the target address and decrements allowance.
     * @param from address The account whose tokens will be burned.
     * @param value uint256 The amount of token to be burned.
     */
    function _burnFrom(address from, uint256 value) internal {
        require(iNMR(_Token).numeraiTransfer(from, value), "nmr burnFrom failed");
    }

    function getToken() public view returns (address token) {
        token = _Token;
    }

}





contract Staking is BurnNMR {

    using SafeMath for uint256;

    mapping (address => uint256) private _stake;

    event TokenSet(address token);
    event StakeAdded(address staker, address funder, uint256 amount, uint256 newStake);
    event StakeTaken(address staker, address recipient, uint256 amount, uint256 newStake);
    event StakeBurned(address staker, uint256 amount, uint256 newStake);

    modifier tokenMustBeSet() {
        require(BurnNMR.getToken() != address(0), "token not set yet");
        _;
    }

    // state functions

    function _setToken(address token) internal {
        // set storage
        BurnNMR._setToken(token);

        // emit event
        emit TokenSet(token);
    }

    function _addStake(address staker, address funder, uint256 currentStake, uint256 amountToAdd) internal tokenMustBeSet {
        // require current stake amount matches expected amount
        require(currentStake == _stake[staker], "current stake incorrect");

        // require non-zero stake to add
        require(amountToAdd > 0, "no stake to add");

        // calculate new stake amount
        uint256 newStake = currentStake.add(amountToAdd);

        // set new stake to storage
        _stake[staker] = newStake;

        // transfer the stake amount
        require(IERC20(BurnNMR.getToken()).transferFrom(funder, address(this), amountToAdd), "token transfer failed");

        // emit event
        emit StakeAdded(staker, funder, amountToAdd, newStake);
    }

    function _takeStake(address staker, address recipient, uint256 currentStake, uint256 amountToTake) internal tokenMustBeSet {
        // require current stake amount matches expected amount
        require(currentStake == _stake[staker], "current stake incorrect");

        // require non-zero stake to take
        require(amountToTake > 0, "no stake to take");

        // amountToTake has to be less than equal currentStake
        require(amountToTake <= currentStake, "cannot take more than currentStake");

        // calculate new stake amount
        uint256 newStake = currentStake.sub(amountToTake);

        // set new stake to storage
        _stake[staker] = newStake;

        // transfer the stake amount
        require(IERC20(BurnNMR.getToken()).transfer(recipient, amountToTake), "token transfer failed");

        // emit event
        emit StakeTaken(staker, recipient, amountToTake, newStake);
    }

    function _takeFullStake(address staker, address recipient) internal tokenMustBeSet returns (uint256 stake) {
        // get stake from storage
        stake = _stake[staker];

        // take full stake
        _takeStake(staker, recipient, stake, stake);
    }

    function _burnStake(address staker, uint256 currentStake, uint256 amountToBurn) tokenMustBeSet internal {
        // require current stake amount matches expected amount
        require(currentStake == _stake[staker], "current stake incorrect");

        // require non-zero stake to burn
        require(amountToBurn > 0, "no stake to burn");

        // amountToTake has to be less than equal currentStake
        require(amountToBurn <= currentStake, "cannot burn more than currentStake");

        // calculate new stake amount
        uint256 newStake = currentStake.sub(amountToBurn);

        // set new stake to storage
        _stake[staker] = newStake;

        // burn the stake amount
        BurnNMR._burn(amountToBurn);

        // emit event
        emit StakeBurned(staker, amountToBurn, newStake);
    }

    function _burnFullStake(address staker) internal tokenMustBeSet returns (uint256 stake) {
        // get stake from storage
        stake = _stake[staker];

        // burn full stake
        _burnStake(staker, stake, stake);
    }

    // view functions

    function getStake(address staker) public view returns (uint256 stake) {
        stake = _stake[staker];
    }

}




contract Griefing is Staking {

    enum RatioType { NaN, Inf, Dec }

    mapping (address => GriefRatio) private _griefRatio;
    struct GriefRatio {
        uint256 ratio;
        RatioType ratioType;
   }

    event RatioSet(address staker, uint256 ratio, RatioType ratioType);
    event Griefed(address punisher, address staker, uint256 punishment, uint256 cost, bytes message);

    uint256 internal constant e18 = uint256(10) ** uint256(18);

    // state functions

    function _setRatio(address staker, uint256 ratio, RatioType ratioType) internal {
        if (ratioType == RatioType.NaN || ratioType == RatioType.Inf) {
            require(ratio == 0, "ratio must be 0 when ratioType is NaN or Inf");
        }

        // set data in storage
        _griefRatio[staker].ratio = ratio;
        _griefRatio[staker].ratioType = ratioType;

        // emit event
        emit RatioSet(staker, ratio, ratioType);
    }

    function _grief(address punisher, address staker, uint256 punishment, bytes memory message) internal returns (uint256 cost) {
        require(BurnNMR.getToken() != address(0), "token not set");

        // get grief data from storage
        uint256 ratio = _griefRatio[staker].ratio;
        RatioType ratioType = _griefRatio[staker].ratioType;

        require(ratioType != RatioType.NaN, "no punishment allowed");

        // calculate cost
        // getCost also acts as a guard when _setRatio is not called before
        cost = getCost(ratio, punishment, ratioType);

        // burn the cost from the punisher's balance
        BurnNMR._burnFrom(punisher, cost);

        // get stake from storage
        uint256 currentStake = Staking.getStake(staker);

        // burn the punishment from the target's stake
        Staking._burnStake(staker, currentStake, punishment);

        // emit event
        emit Griefed(punisher, staker, punishment, cost, message);
    }

    // view functions

    function getRatio(address staker) public view returns (uint256 ratio, RatioType ratioType) {
        // get stake data from storage
        ratio = _griefRatio[staker].ratio;
        ratioType = _griefRatio[staker].ratioType;
    }

    // pure functions

    function getCost(uint256 ratio, uint256 punishment, RatioType ratioType) public pure returns(uint256 cost) {
        /*  Dec:  Cost multiplied by ratio interpreted as a decimal number with 18 decimals, e.g. 1 -> 1e18
         *  Inf:  Punishment at no cost
         *  NaN:  No Punishment */
        if (ratioType == RatioType.Dec) {
            return DecimalMath.mul(SafeMath.mul(punishment, e18), ratio) / e18;
        }
        if (ratioType == RatioType.Inf)
            return 0;
        if (ratioType == RatioType.NaN)
            revert("ratioType cannot be RatioType.NaN");
    }

    function getPunishment(uint256 ratio, uint256 cost, RatioType ratioType) public pure returns(uint256 punishment) {
        /*  Dec: Ratio is a decimal number with 18 decimals
         *  Inf:  Punishment at no cost
         *  NaN:  No Punishment */
        if (ratioType == RatioType.Dec) {
            return DecimalMath.div(SafeMath.mul(cost, e18), ratio) / e18;
        }
        if (ratioType == RatioType.Inf)
            revert("ratioType cannot be RatioType.Inf");
        if (ratioType == RatioType.NaN)
            revert("ratioType cannot be RatioType.NaN");
    }

}








/* Immediately engage with specific buyer
 * - Stake can be increased at any time.
 * - Request to end agreement and recover stake requires cooldown period to complete.
 * - Counterparty can greif the staker at predefined ratio.
 *
 * NOTE:
 * - This top level contract should only perform access control and state transitions
 *
 */
contract OneWayGriefing is Countdown, Griefing, Metadata, Operated, Template {

    using SafeMath for uint256;

    Data private _data;
    struct Data {
        address staker;
        address counterparty;
    }

    function initialize(
        address token,
        address operator,
        address staker,
        address counterparty,
        uint256 ratio,
        Griefing.RatioType ratioType,
        uint256 countdownLength,
        bytes memory staticMetadata
    ) public initializeTemplate() {
        // set storage values
        _data.staker = staker;
        _data.counterparty = counterparty;

        // set operator
        if (operator != address(0)) {
            Operated._setOperator(operator);
            Operated._activateOperator();
        }

        // set token used for staking
        Staking._setToken(token);

        // set griefing ratio
        Griefing._setRatio(staker, ratio, ratioType);

        // set countdown length
        Countdown._setLength(countdownLength);

        // set static metadata
        Metadata._setStaticMetadata(staticMetadata);
    }

    // state functions

    function setVariableMetadata(bytes memory variableMetadata) public {
        // restrict access
        require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator");

        // update metadata
        Metadata._setVariableMetadata(variableMetadata);
    }

    function increaseStake(uint256 currentStake, uint256 amountToAdd) public {
        // restrict access
        require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator");

        // require agreement is not ended
        require(!Countdown.isOver(), "agreement ended");

        // add stake
        Staking._addStake(_data.staker, msg.sender, currentStake, amountToAdd);
    }

    function reward(uint256 currentStake, uint256 amountToAdd) public {
        // restrict access
        require(isCounterparty(msg.sender) || Operated.isActiveOperator(msg.sender), "only counterparty or active operator");

        // require agreement is not ended
        require(!Countdown.isOver(), "agreement ended");

        // add stake
        Staking._addStake(_data.staker, msg.sender, currentStake, amountToAdd);
    }

    function punish(address from, uint256 punishment, bytes memory message) public returns (uint256 cost) {
        // restrict access
        require(isCounterparty(msg.sender) || Operated.isActiveOperator(msg.sender), "only counterparty or active operator");

        // require agreement is not ended
        require(!Countdown.isOver(), "agreement ended");

        // execute griefing
        cost = Griefing._grief(from, _data.staker, punishment, message);
    }

    function startCountdown() public returns (uint256 deadline) {
        // restrict access
        require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator");

        // require countdown is not started
        require(Deadline.getDeadline() == 0, "deadline already set");

        // start countdown
        deadline = Countdown._start();
    }

    function retrieveStake(address recipient) public returns (uint256 amount) {
        // restrict access
        require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator");

        // require deadline is passed
        require(Deadline.isAfterDeadline(),"deadline not passed");

        // retrieve stake
        amount = Staking._takeFullStake(_data.staker, recipient);
    }

    function transferOperator(address operator) public {
        // restrict access
        require(Operated.isActiveOperator(msg.sender), "only active operator");

        // transfer operator
        Operated._transferOperator(operator);
    }

    function renounceOperator() public {
        // restrict access
        require(Operated.isActiveOperator(msg.sender), "only active operator");

        // transfer operator
        Operated._renounceOperator();
    }

    // view functions

    function isStaker(address caller) public view returns (bool validity) {
        validity = (caller == _data.staker);
    }

    function isCounterparty(address caller) public view returns (bool validity) {
        validity = (caller == _data.counterparty);
    }
}




contract OneWayGriefing_Factory is Factory {

    constructor(address instanceRegistry) public {
        // deploy template contract
        address templateContract = address(new OneWayGriefing());
        // set instance type
        bytes4 instanceType = bytes4(keccak256(bytes('Agreement')));
        // set initdataABI
        string memory initdataABI = '(address,address,address,address,uint256,uint8,uint256,bytes)';
        // initialize factory params
        Factory._initialize(instanceRegistry, templateContract, instanceType, initdataABI);
    }

    event ExplicitInitData(address indexed staker, address indexed counterparty, address indexed operator, uint256 ratio, Griefing.RatioType ratioType, uint256 countdownLength, bytes staticMetadata);

    function create(bytes memory callData) public returns (address instance) {
        // deploy instance
        instance = Factory._create(callData);
    }

    function createEncoded(bytes memory initdata) public returns (address instance) {
        // decode initdata
        (
            address token,
            address operator,
            address staker,
            address counterparty,
            uint256 ratio,
            Griefing.RatioType ratioType, // uint8
            uint256 countdownLength,
            bytes memory staticMetadata
        ) = abi.decode(initdata, (address,address,address,address,uint256,Griefing.RatioType,uint256,bytes));

        // call explicit create
        instance = createExplicit(token, operator, staker, counterparty, ratio, ratioType, countdownLength, staticMetadata);
    }

    function createExplicit(
        address token,
        address operator,
        address staker,
        address counterparty,
        uint256 ratio,
        Griefing.RatioType ratioType, // uint8
        uint256 countdownLength,
        bytes memory staticMetadata
    ) public returns (address instance) {
        // declare template in memory
        OneWayGriefing template;

        // construct the data payload used when initializing the new contract.
        bytes memory callData = abi.encodeWithSelector(
            template.initialize.selector, // selector
            token,           // token
            operator,        // operator
            staker,          // staker
            counterparty,    // counterparty
            ratio,           // ratio
            ratioType,       // ratioType
            countdownLength, // countdownLength
            staticMetadata   // staticMetadata
        );

        // deploy instance
        instance = Factory._create(callData);

        // emit event
        emit ExplicitInitData(staker, counterparty, operator, ratio, ratioType, countdownLength, staticMetadata);
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"getInstanceType","outputs":[{"name":"instanceType","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTemplate","outputs":[{"name":"template","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"operator","type":"address"},{"name":"staker","type":"address"},{"name":"counterparty","type":"address"},{"name":"ratio","type":"uint256"},{"name":"ratioType","type":"uint8"},{"name":"countdownLength","type":"uint256"},{"name":"staticMetadata","type":"bytes"}],"name":"createExplicit","outputs":[{"name":"instance","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"instance","type":"address"}],"name":"getInstanceCreator","outputs":[{"name":"creator","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"initdata","type":"bytes"}],"name":"createEncoded","outputs":[{"name":"instance","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInstanceRegistry","outputs":[{"name":"instanceRegistry","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitdataABI","outputs":[{"name":"initdataABI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInstanceCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"startIndex","type":"uint256"},{"name":"endIndex","type":"uint256"}],"name":"getPaginatedInstances","outputs":[{"name":"instances","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"callData","type":"bytes"}],"name":"create","outputs":[{"name":"instance","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInstances","outputs":[{"name":"instances","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getInstance","outputs":[{"name":"instance","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"instanceRegistry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"staker","type":"address"},{"indexed":true,"name":"counterparty","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"ratio","type":"uint256"},{"indexed":false,"name":"ratioType","type":"uint8"},{"indexed":false,"name":"countdownLength","type":"uint256"},{"indexed":false,"name":"staticMetadata","type":"bytes"}],"name":"ExplicitInitData","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"instance","type":"address"},{"indexed":true,"name":"creator","type":"address"},{"indexed":false,"name":"callData","type":"bytes"}],"name":"InstanceCreated","type":"event"}]

60806040523480156200001157600080fd5b5060405160208062005cb4833981018060405260208110156200003357600080fd5b810190808051906020019092919050505060006040516200005490620002ec565b604051809103906000f08015801562000071573d6000803e3d6000fd5b50905060006040518060400160405280600981526020017f41677265656d656e74000000000000000000000000000000000000000000000081525080519060200120905060606040518060600160405280603d815260200162005c77603d91399050620000ec84848484620000f660201b6200164f1760201c565b50505050620003a9565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806003908051906020019062000190929190620002fa565b508373ffffffffffffffffffffffffffffffffffffffff166318c2f4cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015620001d857600080fd5b505afa158015620001ed573d6000803e3d6000fd5b505050506040513d60208110156200020457600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614620002c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f696e636f727265637420696e7374616e6365207479706500000000000000000081525060200191505060405180910390fd5b81600460146101000a81548163ffffffff021916908360e01c021790555050505050565b613d5c8062001f1b83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200033d57805160ff19168380011785556200036e565b828001600101855582156200036e579182015b828111156200036d57825182559160200191906001019062000350565b5b5090506200037d919062000381565b5090565b620003a691905b80821115620003a257600081600090555060010162000388565b5090565b90565b611b6280620003b96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063a61352e111610071578063a61352e1146104c5578063ae34325c14610548578063b71f2e7214610566578063cf5ba53f146105f3578063d35fdd79146106ee578063ebd348de1461074d576100b4565b806318c2f4cf146100b9578063321c48f214610115578063461ffcbe1461015f5780636bf71982146102fc5780636f8d11e614610380578063a5e139041461047b575b600080fd5b6100c16107bb565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61011d6107d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102ba600480360361010081101561017657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019064010000000081111561023457600080fd5b82018360208201111561024657600080fd5b8035906020019184600183028401116401000000008311171561026857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506107fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61033e6004803603602081101561031257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b0d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104396004803603602081101561039657600080fd5b81019080803590602001906401000000008111156103b357600080fd5b8201836020820111156103c557600080fd5b803590602001918460018302840111640100000000831117156103e757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610b76565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610483610c62565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104cd610c8c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050d5780820151818401526020810190506104f2565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610550610d2e565b6040518082815260200191505060405180910390f35b61059c6004803603604081101561057c57600080fd5b810190808035906020019092919080359060200190929190505050610d3a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105df5780820151818401526020810190506105c4565b505050509050019250505060405180910390f35b6106ac6004803603602081101561060957600080fd5b810190808035906020019064010000000081111561062657600080fd5b82018360208201111561063857600080fd5b8035906020019184600183028401116401000000008311171561065a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610eeb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f6610efd565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561073957808201518184015260208101905061071e565b505050509050019250505060405180910390f35b6107796004803603602081101561076357600080fd5b8101908080359060200190929190505050610f8b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600460149054906101000a900460e01b905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060608173ffffffffffffffffffffffffffffffffffffffff16633121d2e7905060e01b8b8b8b8b8b8b8b8b604051602401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184600281111561090b57fe5b60ff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561095557808201518184015260208101905061093a565b50505050905090810190601f1680156109825780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506109f681611045565b92508973ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fa75a9e87c1a935b115363faab238af03d2784cfa15088fd8b63ca8d8422d824d8a8a8a8a60405180858152602001846002811115610a7857fe5b60ff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ac2578082015181840152602081019050610aa7565b50505050905090810190601f168015610aef5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a4505098975050505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600080600080600080606089806020019051610100811015610b9a57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051640100000000811115610bf857600080fd5b82810190506020810184811115610c0e57600080fd5b8151856001820283011164010000000082111715610c2b57600080fd5b505092919050505097509750975097509750975097509750610c5388888888888888886107fc565b98505050505050505050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b60008080549050905090565b6060818310610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611b126025913960400191505060405180910390fd5b600080549050821115610e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f656e6420696e646578206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b6060838303604051908082528060200260200182016040528015610e425781602001602082028038833980820191505090505b50905060008490505b83811015610ee05760008181548110610e6057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286830381518110610e9957fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610e4b565b508091505092915050565b6000610ef682611045565b9050919050565b60606000805480602002602001604051908101604052809291908181526020018280548015610f8157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f37575b5050505050905090565b600080805490508210611006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e646578206f7574206f662072616e6765000000000000000000000000000081525060200191505060405180910390fd5b6000828154811061101357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110586110526107d2565b836112fe565b905060008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505033600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611146610c62565b73ffffffffffffffffffffffffffffffffffffffff1663bba83f64823360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1669ffffffffffffffffffff1681526020019350505050600060405180830381600087803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fab60131c1462939275d0fd3738e07ab853e22af6296cf75e71bbdf3a497791a2846040518080602001828103825283818151815260200191508051906020019080838360005b838110156112bf5780820151818401526020810190506112a4565b50505050905090810190601f1680156112ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3919050565b600060606040518060200161131290611642565b6020820181038252601f19601f820116604052508484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561139d578082015181840152602081019050611382565b50505050905090810190601f1680156113ca5780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040526040516020018083805190602001908083835b6020831061141557805182526020820191506020810190506020830392506113f2565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b602083106114665780518252602082019150602081019050602083039250611443565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290506114a6816114af565b91505092915050565b6000806114bb836114e2565b50905082602001835182818334f59350836114da573d6000803e3d6000fd5b505050919050565b600080600083805190602001209050600080905060005b60011561163a573382604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018281526020019250505060405160208183030381529060405280519060200120945060ff60f81b30868560405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c9350833b9050600081141561162d5761163a565b81806001019250506114f9565b505050915091565b61022d806118e583390190565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600390805190602001906116e792919061183f565b508373ffffffffffffffffffffffffffffffffffffffff166318c2f4cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561172e57600080fd5b505afa158015611742573d6000803e3d6000fd5b505050506040513d602081101561175857600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f696e636f727265637420696e7374616e6365207479706500000000000000000081525060200191505060405180910390fd5b81600460146101000a81548163ffffffff021916908360e01c021790555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061188057805160ff19168380011785556118ae565b828001600101855582156118ae579182015b828111156118ad578251825591602001919060010190611892565b5b5090506118bb91906118bf565b5090565b6118e191905b808211156118dd5760008160009055506001016118c5565b5090565b9056fe608060405260405161022d38038061022d8339810180604052604081101561002657600080fd5b8101908080519060200190929190805164010000000081111561004857600080fd5b8281019050602081018481111561005e57600080fd5b815185600182028301116401000000008211171561007b57600080fd5b505092919050505060008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b602083106100d057805182526020820191506020810190506020830392506100ad565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610130576040519150601f19603f3d011682016040523d82523d6000602084013e610135565b606091505b5050905080610148573d6000803e3d6000fd5b606069363d3d373d3d3d363d7360b01b846e5af43d82803e903d91602b57fd5bf360881b604051602001808475ffffffffffffffffffffffffffffffffffffffffffff191675ffffffffffffffffffffffffffffffffffffffffffff19168152600a018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018270ffffffffffffffffffffffffffffffffff191670ffffffffffffffffffffffffffffffffff19168152600f0193505050506040516020818303038152906040529050602d81602001f3fe7374617274496e646578206d757374206265206c657373207468616e20656e64496e646578a165627a7a72305820c300684635d15217d8b29a1e33b25fa6fa4dce6cdb4d59265eb7bff40c12ac4a0029608060405234801561001057600080fd5b50613d3c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636f1e8533116100f9578063a4fa8d5711610097578063bec10cde11610071578063bec10cde14610ae2578063e3cfef6014610b1a578063e7f43c6814610b38578063efd4606514610b82576101c4565b8063a4fa8d5714610a6a578063b4bd9e2714610aa2578063be1c766b14610ac4576101c4565b80637878f257116100d35780637878f257146108df5780637a5b4f59146109015780637a766460146109f0578063923b176214610a48576101c4565b80636f1e8533146107ba57806373f500af14610816578063754b270714610872576101c4565b80633367cca5116101665780635baeb806116101405780635baeb806146106c95780635e5365c1146107225780635f8d96de146107405780636d70f7ae1461075e576101c4565b80633367cca5146105bc57806341ce287814610618578063465b414e14610670576101c4565b806327305e83116101a257806327305e831461035657806329605e77146104115780632ab6f8db146104555780633121d2e71461045f576101c4565b8063060e468f146101c95780630ee2cb10146102c257806321df0da71461030c575b600080fd5b6102ac600480360360608110156101df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561022657600080fd5b82018360208201111561023857600080fd5b8035906020019184600183028401116401000000008311171561025a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610bde565b6040518082815260200191505060405180910390f35b6102ca610d03565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610314610de4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040f6004803603602081101561036c57600080fd5b810190808035906020019064010000000081111561038957600080fd5b82018360208201111561039b57600080fd5b803590602001918460018302840111640100000000831117156103bd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610e0e565b005b6104536004803603602081101561042757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ea5565b005b61045d610f2c565b005b6105ba600480360361010081101561047657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019064010000000081111561053457600080fd5b82018360208201111561054657600080fd5b8035906020019184600183028401116401000000008311171561056857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610fb1565b005b6105fe600480360360208110156105d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611156565b604051808215151515815260200191505060405180910390f35b61065a6004803603602081101561062e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611178565b6040518082815260200191505060405180910390f35b6106b36004803603606081101561068657600080fd5b810190808035906020019092919080359060200190929190803560ff1690602001909291905050506112b5565b6040518082815260200191505060405180910390f35b61070c600480360360608110156106df57600080fd5b810190808035906020019092919080359060200190929190803560ff1690602001909291905050506113a0565b6040518082815260200191505060405180910390f35b61072a6114d3565b6040518082815260200191505060405180910390f35b6107486115ea565b6040518082815260200191505060405180910390f35b6107a06004803603602081101561077457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115f3565b604051808215151515815260200191505060405180910390f35b6107fc600480360360208110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611632565b604051808215151515815260200191505060405180910390f35b6108586004803603602081101561082c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061168f565b604051808215151515815260200191505060405180910390f35b6108b46004803603602081101561088857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116ec565b604051808381526020018260028111156108ca57fe5b60ff1681526020019250505060405180910390f35b6108e761178b565b604051808215151515815260200191505060405180910390f35b6109096117ac565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561094d578082015181840152602081019050610932565b50505050905090810190601f16801561097a5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156109b3578082015181840152602081019050610998565b50505050905090810190601f1680156109e05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b610a3260048036036020811015610a0657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118ed565b6040518082815260200191505060405180910390f35b610a50611936565b604051808215151515815260200191505060405180910390f35b610aa060048036036040811015610a8057600080fd5b81019080803590602001909291908035906020019092919050505061194d565b005b610aaa611a6b565b604051808215151515815260200191505060405180910390f35b610acc611aa0565b6040518082815260200191505060405180910390f35b610b1860048036036040811015610af857600080fd5b810190808035906020019092919080359060200190929190505050611aaa565b005b610b22611be5565b6040518082815260200191505060405180910390f35b610b40611c1e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610bc460048036036020811015610b9857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c48565b604051808215151515815260200191505060405180910390f35b6000610be93361168f565b80610bf95750610bf833611156565b5b610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613c336024913960400191505060405180910390fd5b610c56611a6b565b15610cc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f61677265656d656e7420656e646564000000000000000000000000000000000081525060200191505060405180910390fd5b610cfa84600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585611c87565b90509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636bf71982306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610da457600080fd5b505afa158015610db8573d6000803e3d6000fd5b505050506040513d6020811015610dce57600080fd5b8101908080519060200190929190505050905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e1733611632565b80610e275750610e2633611156565b5b610e99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6f6e6c79207374616b6572206f7220616374697665206f70657261746f72000081525060200191505060405180910390fd5b610ea281611fa8565b50565b610eae33611156565b610f20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6f6e6c7920616374697665206f70657261746f7200000000000000000000000081525060200191505060405180910390fd5b610f298161205e565b50565b610f3533611156565b610fa7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6f6e6c7920616374697665206f70657261746f7200000000000000000000000081525060200191505060405180910390fd5b610faf61212f565b565b33600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000303b905060008163ffffffff1614611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613c9a602a913960400191505060405180910390fd5b86600960000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600960010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146111255761111c88612278565b6111246123f6565b5b61112e89612520565b61113987868661258f565b61114283612759565b61114b8261279a565b505050505050505050565b6000611161826115f3565b80156111715750611170611936565b5b9050919050565b600061118333611632565b80611193575061119233611156565b5b611205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6f6e6c79207374616b6572206f7220616374697665206f70657261746f72000081525060200191505060405180910390fd5b61120d61178b565b61127f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f646561646c696e65206e6f74207061737365640000000000000000000000000081525060200191505060405180910390fd5b6112ae600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836128bf565b9050919050565b60006002808111156112c357fe5b8260028111156112cf57fe5b1415611300576012600a0a6112f16112eb856012600a0a6129be565b86612a44565b816112f857fe5b049050611399565b6001600281111561130d57fe5b82600281111561131957fe5b14156113285760009050611399565b6000600281111561133557fe5b82600281111561134157fe5b1415611398576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cc46021913960400191505060405180910390fd5b5b9392505050565b60006002808111156113ae57fe5b8260028111156113ba57fe5b14156113eb576012600a0a6113dc6113d6856012600a0a6129be565b86612a7c565b816113e357fe5b0490506114cc565b600160028111156113f857fe5b82600281111561140457fe5b141561145b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613bcf6021913960400191505060405180910390fd5b6000600281111561146857fe5b82600281111561147457fe5b14156114cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cc46021913960400191505060405180910390fd5b5b9392505050565b60006114de33611632565b806114ee57506114ed33611156565b5b611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6f6e6c79207374616b6572206f7220616374697665206f70657261746f72000081525060200191505060405180910390fd5b600061156a6115ea565b146115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f646561646c696e6520616c72656164792073657400000000000000000000000081525060200191505060405180910390fd5b6115e5612ab0565b905090565b60008054905090565b60006115fd611c1e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600960010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549150600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff169050915091565b60008060005414156117a057600090506117a9565b60005442101590505b90565b60608060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118455780601f1061181a57610100808354040283529160200191611845565b820191906000526020600020905b81548152906001019060200180831161182857829003601f168201915b5050505050915060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118e25780601f106118b7576101008083540402835291602001916118e2565b820191906000526020600020905b8154815290600101906020018083116118c557829003601f168201915b505050505090509091565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600760149054906101000a900460ff16905090565b6119563361168f565b80611966575061196533611156565b5b6119bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613c336024913960400191505060405180910390fd5b6119c3611a6b565b15611a36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f61677265656d656e7420656e646564000000000000000000000000000000000081525060200191505060405180910390fd5b611a67600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338484612b4d565b5050565b6000806001541480611a8457506000611a826115ea565b145b15611a925760009050611a9d565b611a9a61178b565b90505b90565b6000600154905090565b611ab333611632565b80611ac35750611ac233611156565b5b611b35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6f6e6c79207374616b6572206f7220616374697665206f70657261746f72000081525060200191505060405180910390fd5b611b3d611a6b565b15611bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f61677265656d656e7420656e646564000000000000000000000000000000000081525060200191505060405180910390fd5b611be1600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338484612b4d565b5050565b6000611bef6115ea565b4210611bfe5760009050611c1b565b611c1842611c0a6115ea565b612f9990919063ffffffff16565b90505b90565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611c52610d03565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611ca8610de4565b73ffffffffffffffffffffffffffffffffffffffff161415611d32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f746f6b656e206e6f74207365740000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16905060006002811115611dda57fe5b816002811115611de657fe5b1415611e5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6e6f2070756e6973686d656e7420616c6c6f776564000000000000000000000081525060200191505060405180910390fd5b611e658286836112b5565b9250611e718784613022565b6000611e7c876118ed565b9050611e8987828861317c565b7fca93c648a4546f2ae486b9140f0082ced75a2664a663c8882b8b3545cddfeeb18888888789604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f5f578082015181840152602081019050611f44565b50505050905090810190601f168015611f8c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505050949350505050565b8060069080519060200190611fbe929190613b29565b507fec391f097a91107044327f7588bc67ac8b9daf871413fc181f768c437c66cda9816040518080602001828103825283818151815260200191508051906020019080838360005b83811015612021578082015181840152602081019050612006565b50505050905090810190601f16801561204e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612123576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6f70657261746f72206e6f74207365740000000000000000000000000000000081525060200191505060405180910390fd5b61212c81612278565b50565b612137611936565b6121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6f6e6c79207768656e206f70657261746f72206163746976650000000000000081525060200191505060405180910390fd5b6000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760146101000a81548160ff0219169083151502179055507f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d600080604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1565b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561233c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f63616e6e6f74207365742073616d65206f70657261746f72000000000000000081525060200191505060405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d816123a7611936565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a150565b6123fe611936565b15612471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6f6e6c79207768656e206f70657261746f72206e6f742061637469766500000081525060200191505060405180910390fd5b6001600760146101000a81548160ff0219169083151502179055507f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1565b61252981613486565b7fa07c91c183e42229e705a9795a1c06d76528b673788b849597364528c96eefb781604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000600281111561259c57fe5b8160028111156125a857fe5b14806125ca5750600160028111156125bc57fe5b8160028111156125c857fe5b145b156126295760008214612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613ce5602c913960400191505060405180910390fd5b5b81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555080600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908360028111156126ce57fe5b02179055507fc964ed8af672f908dc7ba57f61d45a87a7e179cecf5198e7b7d53c920d898f06838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182600281111561273f57fe5b60ff168152602001935050505060405180910390a1505050565b806001819055507f7caceb1091bbaa84d09ab116a1fd72387eaab8a33d70fc39168b9b75686ee32c816040518082815260200191505060405180910390a150565b6000600580546001816001161561010002031660029004905014612809576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613bf06021913960400191505060405180910390fd5b806005908051906020019061281f929190613b29565b507fd2bb68a4c0cbd7fabc3f8e787a6e54384db17d54dedeede61c35819f5f49edca816040518080602001828103825283818151815260200191508051906020019080838360005b83811015612882578082015181840152602081019050612867565b50505050905090810190601f1680156128af5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff166128e0610de4565b73ffffffffffffffffffffffffffffffffffffffff16141561296a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6b656e206e6f74207365742079657400000000000000000000000000000081525060200191505060405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506129b8838383846134ca565b92915050565b6000808314156129d15760009050612a3e565b60008284029050828482816129e257fe5b0414612a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c576021913960400191505060405180910390fd5b809150505b92915050565b60006012600a0a612a6c612a5885856129be565b60026012600a0a81612a6657fe5b0461393b565b81612a7357fe5b04905092915050565b600081612aa0612a90856012600a0a6129be565b60028581612a9a57fe5b0461393b565b81612aa757fe5b04905092915050565b6000806001541415612b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f6c656e677468206e6f742073657400000000000000000000000000000000000081525060200191505060405180910390fd5b612b3f4260015461393b90919063ffffffff16565b9050612b4a816139c3565b90565b600073ffffffffffffffffffffffffffffffffffffffff16612b6d610de4565b73ffffffffffffffffffffffffffffffffffffffff161415612bf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6b656e206e6f74207365742079657400000000000000000000000000000081525060200191505060405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548214612cab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f63757272656e74207374616b6520696e636f727265637400000000000000000081525060200191505060405180910390fd5b60008111612d21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6e6f207374616b6520746f20616464000000000000000000000000000000000081525060200191505060405180910390fd5b6000612d36828461393b90919063ffffffff16565b905080600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612d84610de4565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8530856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612e3e57600080fd5b505af1158015612e52573d6000803e3d6000fd5b505050506040513d6020811015612e6857600080fd5b8101908080519060200190929190505050612eeb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b7fef7c8dfef14cbefdf829b8f066b068b677992411137321d64b3ed4538c2b363785858484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a15050505050565b600082821115613011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637c8d56b883836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130cb57600080fd5b505af11580156130df573d6000803e3d6000fd5b505050506040513d60208110156130f557600080fd5b8101908080519060200190929190505050613178576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6e6d72206275726e46726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b5050565b600073ffffffffffffffffffffffffffffffffffffffff1661319c610de4565b73ffffffffffffffffffffffffffffffffffffffff161415613226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6b656e206e6f74207365742079657400000000000000000000000000000081525060200191505060405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482146132da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f63757272656e74207374616b6520696e636f727265637400000000000000000081525060200191505060405180910390fd5b60008111613350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f207374616b6520746f206275726e0000000000000000000000000000000081525060200191505060405180910390fd5b818111156133a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613c786022913960400191505060405180910390fd5b60006133be8284612f9990919063ffffffff16565b905080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061340d82613a04565b7ff470d7f6c239014b63db190652ebe51433a828b65e06d9972143c34c2e2ca3bc848383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a150505050565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff166134ea610de4565b73ffffffffffffffffffffffffffffffffffffffff161415613574576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6b656e206e6f74207365742079657400000000000000000000000000000081525060200191505060405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548214613628576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f63757272656e74207374616b6520696e636f727265637400000000000000000081525060200191505060405180910390fd5b6000811161369e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f207374616b6520746f2074616b650000000000000000000000000000000081525060200191505060405180910390fd5b818111156136f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613c116022913960400191505060405180910390fd5b600061370c8284612f9990919063ffffffff16565b905080600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061375a610de4565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156137e057600080fd5b505af11580156137f4573d6000803e3d6000fd5b505050506040513d602081101561380a57600080fd5b810190808051906020019092919050505061388d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f79cb01d8e263c1d344176f9a596b5a6aa14a7df350a227e2e7df836a087b566185858484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a15050505050565b6000808284019050838110156139b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b806000819055507f337b880688eb06df8adb77036a6c8def1da2b520bc901c04b3a5a23f9ae13039816040518082815260200191505060405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015613a7957600080fd5b505af1158015613a8d573d6000803e3d6000fd5b505050506040513d6020811015613aa357600080fd5b8101908080519060200190929190505050613b26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6e6d72206275726e206661696c6564000000000000000000000000000000000081525060200191505060405180910390fd5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b6a57805160ff1916838001178555613b98565b82800160010185558215613b98579182015b82811115613b97578251825591602001919060010190613b7c565b5b509050613ba59190613ba9565b5090565b613bcb91905b80821115613bc7576000816000905550600101613baf565b5090565b9056fe726174696f547970652063616e6e6f7420626520526174696f547970652e496e66737461746963206d657461646174612063616e6e6f74206265206368616e67656463616e6e6f742074616b65206d6f7265207468616e2063757272656e745374616b656f6e6c7920636f756e7465727061727479206f7220616374697665206f70657261746f72536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616e6e6f74206275726e206d6f7265207468616e2063757272656e745374616b656d7573742062652063616c6c65642077697468696e20636f6e747261637420636f6e7374727563746f72726174696f547970652063616e6e6f7420626520526174696f547970652e4e614e726174696f206d7573742062652030207768656e20726174696f54797065206973204e614e206f7220496e66a165627a7a72305820ba4e5a2270ef014a646ddbad947413becbdd7419c61b56679cdcb02a557e86de002928616464726573732c616464726573732c616464726573732c616464726573732c75696e743235362c75696e74382c75696e743235362c627974657329000000000000000000000000a6cf4bf00fef8866e9f3f61c972ba7c687c6edbf

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063a61352e111610071578063a61352e1146104c5578063ae34325c14610548578063b71f2e7214610566578063cf5ba53f146105f3578063d35fdd79146106ee578063ebd348de1461074d576100b4565b806318c2f4cf146100b9578063321c48f214610115578063461ffcbe1461015f5780636bf71982146102fc5780636f8d11e614610380578063a5e139041461047b575b600080fd5b6100c16107bb565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61011d6107d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102ba600480360361010081101561017657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019064010000000081111561023457600080fd5b82018360208201111561024657600080fd5b8035906020019184600183028401116401000000008311171561026857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506107fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61033e6004803603602081101561031257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b0d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104396004803603602081101561039657600080fd5b81019080803590602001906401000000008111156103b357600080fd5b8201836020820111156103c557600080fd5b803590602001918460018302840111640100000000831117156103e757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610b76565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610483610c62565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104cd610c8c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050d5780820151818401526020810190506104f2565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610550610d2e565b6040518082815260200191505060405180910390f35b61059c6004803603604081101561057c57600080fd5b810190808035906020019092919080359060200190929190505050610d3a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105df5780820151818401526020810190506105c4565b505050509050019250505060405180910390f35b6106ac6004803603602081101561060957600080fd5b810190808035906020019064010000000081111561062657600080fd5b82018360208201111561063857600080fd5b8035906020019184600183028401116401000000008311171561065a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610eeb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f6610efd565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561073957808201518184015260208101905061071e565b505050509050019250505060405180910390f35b6107796004803603602081101561076357600080fd5b8101908080359060200190929190505050610f8b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600460149054906101000a900460e01b905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060608173ffffffffffffffffffffffffffffffffffffffff16633121d2e7905060e01b8b8b8b8b8b8b8b8b604051602401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184600281111561090b57fe5b60ff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561095557808201518184015260208101905061093a565b50505050905090810190601f1680156109825780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506109f681611045565b92508973ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fa75a9e87c1a935b115363faab238af03d2784cfa15088fd8b63ca8d8422d824d8a8a8a8a60405180858152602001846002811115610a7857fe5b60ff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ac2578082015181840152602081019050610aa7565b50505050905090810190601f168015610aef5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a4505098975050505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600080600080600080606089806020019051610100811015610b9a57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051640100000000811115610bf857600080fd5b82810190506020810184811115610c0e57600080fd5b8151856001820283011164010000000082111715610c2b57600080fd5b505092919050505097509750975097509750975097509750610c5388888888888888886107fc565b98505050505050505050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b60008080549050905090565b6060818310610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611b126025913960400191505060405180910390fd5b600080549050821115610e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f656e6420696e646578206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b6060838303604051908082528060200260200182016040528015610e425781602001602082028038833980820191505090505b50905060008490505b83811015610ee05760008181548110610e6057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286830381518110610e9957fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610e4b565b508091505092915050565b6000610ef682611045565b9050919050565b60606000805480602002602001604051908101604052809291908181526020018280548015610f8157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f37575b5050505050905090565b600080805490508210611006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e646578206f7574206f662072616e6765000000000000000000000000000081525060200191505060405180910390fd5b6000828154811061101357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110586110526107d2565b836112fe565b905060008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505033600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611146610c62565b73ffffffffffffffffffffffffffffffffffffffff1663bba83f64823360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1669ffffffffffffffffffff1681526020019350505050600060405180830381600087803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fab60131c1462939275d0fd3738e07ab853e22af6296cf75e71bbdf3a497791a2846040518080602001828103825283818151815260200191508051906020019080838360005b838110156112bf5780820151818401526020810190506112a4565b50505050905090810190601f1680156112ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3919050565b600060606040518060200161131290611642565b6020820181038252601f19601f820116604052508484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561139d578082015181840152602081019050611382565b50505050905090810190601f1680156113ca5780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040526040516020018083805190602001908083835b6020831061141557805182526020820191506020810190506020830392506113f2565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b602083106114665780518252602082019150602081019050602083039250611443565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290506114a6816114af565b91505092915050565b6000806114bb836114e2565b50905082602001835182818334f59350836114da573d6000803e3d6000fd5b505050919050565b600080600083805190602001209050600080905060005b60011561163a573382604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018281526020019250505060405160208183030381529060405280519060200120945060ff60f81b30868560405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c9350833b9050600081141561162d5761163a565b81806001019250506114f9565b505050915091565b61022d806118e583390190565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600390805190602001906116e792919061183f565b508373ffffffffffffffffffffffffffffffffffffffff166318c2f4cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561172e57600080fd5b505afa158015611742573d6000803e3d6000fd5b505050506040513d602081101561175857600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f696e636f727265637420696e7374616e6365207479706500000000000000000081525060200191505060405180910390fd5b81600460146101000a81548163ffffffff021916908360e01c021790555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061188057805160ff19168380011785556118ae565b828001600101855582156118ae579182015b828111156118ad578251825591602001919060010190611892565b5b5090506118bb91906118bf565b5090565b6118e191905b808211156118dd5760008160009055506001016118c5565b5090565b9056fe608060405260405161022d38038061022d8339810180604052604081101561002657600080fd5b8101908080519060200190929190805164010000000081111561004857600080fd5b8281019050602081018481111561005e57600080fd5b815185600182028301116401000000008211171561007b57600080fd5b505092919050505060008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b602083106100d057805182526020820191506020810190506020830392506100ad565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610130576040519150601f19603f3d011682016040523d82523d6000602084013e610135565b606091505b5050905080610148573d6000803e3d6000fd5b606069363d3d373d3d3d363d7360b01b846e5af43d82803e903d91602b57fd5bf360881b604051602001808475ffffffffffffffffffffffffffffffffffffffffffff191675ffffffffffffffffffffffffffffffffffffffffffff19168152600a018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018270ffffffffffffffffffffffffffffffffff191670ffffffffffffffffffffffffffffffffff19168152600f0193505050506040516020818303038152906040529050602d81602001f3fe7374617274496e646578206d757374206265206c657373207468616e20656e64496e646578a165627a7a72305820c300684635d15217d8b29a1e33b25fa6fa4dce6cdb4d59265eb7bff40c12ac4a0029

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

000000000000000000000000a6cf4bf00fef8866e9f3f61c972ba7c687c6edbf

-----Decoded View---------------
Arg [0] : instanceRegistry (address): 0xa6cf4Bf00feF8866e9F3f61C972bA7C687C6eDbF

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


Swarm Source

bzzr://ba4e5a2270ef014a646ddbad947413becbdd7419c61b56679cdcb02a557e86de

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.