ETH Price: $3,264.31 (-2.45%)

Contract

0x1f09dDa453941c2536b9dE8c4382807D1FC603A9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Store113027892020-11-21 17:24:081452 days ago1605979448IN
0x1f09dDa4...D1FC603A9
0 ETH0.00250719117
Create Explicit101902072020-06-03 2:31:491623 days ago1591151509IN
0x1f09dDa4...D1FC603A9
0 ETH0.0061525220
Create Explicit100919232020-05-18 19:46:261639 days ago1589831186IN
0x1f09dDa4...D1FC603A9
0 ETH0.0046328415
Create Explicit100914602020-05-18 17:56:231639 days ago1589824583IN
0x1f09dDa4...D1FC603A9
0 ETH0.0055372618
Create Explicit100523632020-05-12 16:10:491645 days ago1589299849IN
0x1f09dDa4...D1FC603A9
0 ETH0.0086135228
Create Explicit100412462020-05-10 22:53:211647 days ago1589151201IN
0x1f09dDa4...D1FC603A9
0 ETH0.002161997
Create Explicit100412192020-05-10 22:45:401647 days ago1589150740IN
0x1f09dDa4...D1FC603A9
0 ETH0.001845756
Create Explicit99959232020-05-03 22:29:531654 days ago1588544993IN
0x1f09dDa4...D1FC603A9
0 ETH0.000725332.35794769
Create Explicit99793052020-05-01 8:35:171656 days ago1588322117IN
0x1f09dDa4...D1FC603A9
0 ETH0.001845756
Create Explicit99402202020-04-25 7:11:101662 days ago1587798670IN
0x1f09dDa4...D1FC603A9
0 ETH0.0030762610
Create Explicit99330862020-04-24 4:34:531663 days ago1587702893IN
0x1f09dDa4...D1FC603A9
0 ETH0.001845756
Create Explicit99120832020-04-20 22:46:001667 days ago1587422760IN
0x1f09dDa4...D1FC603A9
0 ETH0.001107453.6
Create Explicit98725402020-04-14 19:44:231673 days ago1586893463IN
0x1f09dDa4...D1FC603A9
0 ETH0.000615252
Create Explicit98488432020-04-11 4:34:171676 days ago1586579657IN
0x1f09dDa4...D1FC603A9
0 ETH0.000744452.42000025
Create Explicit98459592020-04-10 17:51:591677 days ago1586541119IN
0x1f09dDa4...D1FC603A9
0 ETH0.001845756
Create Explicit98438482020-04-10 9:59:571677 days ago1586512797IN
0x1f09dDa4...D1FC603A9
0 ETH0.001630415.3
Create Explicit98271662020-04-07 20:21:091680 days ago1586290869IN
0x1f09dDa4...D1FC603A9
0 ETH0.001538135
Create Explicit98268662020-04-07 19:13:291680 days ago1586286809IN
0x1f09dDa4...D1FC603A9
0 ETH0.000369151.2
Create Explicit97889922020-04-01 23:21:221686 days ago1585783282IN
0x1f09dDa4...D1FC603A9
0 ETH0.000307621
Create Explicit97816382020-03-31 20:32:101687 days ago1585686730IN
0x1f09dDa4...D1FC603A9
0 ETH0.000307621
Create Explicit97371152020-03-24 23:39:451694 days ago1585093185IN
0x1f09dDa4...D1FC603A9
0 ETH0.00049221.6
Create Explicit96505462020-03-11 13:45:341707 days ago1583934334IN
0x1f09dDa4...D1FC603A9
0 ETH0.001538135
Create Explicit96468602020-03-11 0:00:371708 days ago1583884837IN
0x1f09dDa4...D1FC603A9
0 ETH0.000615252
Create Explicit96467152020-03-10 23:28:171708 days ago1583882897IN
0x1f09dDa4...D1FC603A9
0 ETH0.000307621
Create Explicit95821162020-03-01 1:08:571717 days ago1583024937IN
0x1f09dDa4...D1FC603A9
0 ETH0.000922873
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
101902072020-06-03 2:31:491623 days ago1591151509
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
100919232020-05-18 19:46:261639 days ago1589831186
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
100914602020-05-18 17:56:231639 days ago1589824583
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
100523632020-05-12 16:10:491645 days ago1589299849
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
100412462020-05-10 22:53:211647 days ago1589151201
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
100412192020-05-10 22:45:401647 days ago1589150740
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
99959232020-05-03 22:29:531654 days ago1588544993
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
99793052020-05-01 8:35:171656 days ago1588322117
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
99402202020-04-25 7:11:101662 days ago1587798670
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
99330862020-04-24 4:34:531663 days ago1587702893
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
99120832020-04-20 22:46:001667 days ago1587422760
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
98725402020-04-14 19:44:231673 days ago1586893463
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
98488432020-04-11 4:34:171676 days ago1586579657
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
98459592020-04-10 17:51:591677 days ago1586541119
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
98438482020-04-10 9:59:571677 days ago1586512797
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
98271662020-04-07 20:21:091680 days ago1586290869
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
98268662020-04-07 19:13:291680 days ago1586286809
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
97889922020-04-01 23:21:221686 days ago1585783282
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
97816382020-03-31 20:32:101687 days ago1585686730
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
97371152020-03-24 23:39:451694 days ago1585093185
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
96505462020-03-11 13:45:341707 days ago1583934334
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
96468602020-03-11 0:00:371708 days ago1583884837
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
96467152020-03-10 23:28:171708 days ago1583882897
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
95821162020-03-01 1:08:571717 days ago1583024937
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
95567262020-02-26 3:37:481721 days ago1582688268
0x1f09dDa4...D1FC603A9
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Feed_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);
}



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

}


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



/**
 * @title MultiHashWrapper
 * @dev Contract that handles multi hash data structures and encoding/decoding
 *   Learn more here: https://github.com/multiformats/multihash
 */
contract MultiHashWrapper {

    // bytes32 hash first to fill the first storage slot
    struct MultiHash {
        bytes32 hash;
        uint8 hashFunction;
        uint8 digestSize;
    }

    /**
    * @dev Given a multihash struct, returns the full base58-encoded hash
    * @param multihash MultiHash struct that has the hashFunction, digestSize and the hash
    * @return the base58-encoded full hash
    */
    function _combineMultiHash(MultiHash memory multihash) internal pure returns (bytes memory) {
        bytes memory out = new bytes(34);

        out[0] = byte(multihash.hashFunction);
        out[1] = byte(multihash.digestSize);

        uint8 i;
        for (i = 0; i < 32; i++) {
          out[i+2] = multihash.hash[i];
        }

        return out;
    }

    /**
    * @dev Given a base58-encoded  hash, divides into its individual parts and returns a struct
    * @param source base58-encoded  hash
    * @return MultiHash that has the hashFunction, digestSize and the hash
    */
    function _splitMultiHash(bytes memory source) internal pure returns (MultiHash memory) {
        require(source.length == 34, "length of source must be 34");

        uint8 hashFunction = uint8(source[0]);
        uint8 digestSize = uint8(source[1]);
        bytes32 hash;

        assembly {
          hash := mload(add(source, 34))
        }

        return (MultiHash({
          hashFunction: hashFunction,
          digestSize: digestSize,
          hash: hash
        }));
    }
}




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

}



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

}



contract ProofHash is MultiHashWrapper {

    MultiHash private _proofHash;

    event ProofHashSet(address caller, bytes proofHash);

    // state functions

    function _setProofHash(bytes memory proofHash) internal {
        _proofHash = MultiHashWrapper._splitMultiHash(proofHash);
        emit ProofHashSet(msg.sender, proofHash);
    }

    // view functions

    function getProofHash() public view returns (bytes memory proofHash) {
        proofHash = MultiHashWrapper._combineMultiHash(_proofHash);
    }

}






contract Post is ProofHash, Operated, Metadata, Template {

    event Created(address operator, bytes proofHash, bytes staticMetadata, bytes variableMetadata);

    function initialize(
        address operator,
        bytes memory proofHash,
        bytes memory staticMetadata,
        bytes memory variableMetadata
    ) public initializeTemplate() {
        // set storage variables
        ProofHash._setProofHash(proofHash);

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

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

        // set variable metadata
        Metadata._setVariableMetadata(variableMetadata);

        // emit event
        emit Created(operator, proofHash, staticMetadata, variableMetadata);
    }

    // state functions

    function setVariableMetadata(bytes memory variableMetadata) public {
        // only active operator or creator
        require(Template.isCreator(msg.sender) || Operated.isActiveOperator(msg.sender), "only active operator or creator");

        // set metadata in storage
        Metadata._setVariableMetadata(variableMetadata);
    }

}




contract Post_Factory is Factory {

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

    event ExplicitInitData(address operator, bytes proofHash, bytes staticMetadata, bytes variableMetadata);

    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 operator,
            bytes memory proofHash,
            bytes memory staticMetadata,
            bytes memory variableMetadata
        ) = abi.decode(initdata, (address,bytes,bytes,bytes));

        // call explicit create
        instance = createExplicit(operator, proofHash, staticMetadata, variableMetadata);
    }

    function createExplicit(
        address operator,
        bytes memory proofHash,
        bytes memory staticMetadata,
        bytes memory variableMetadata
    ) public returns (address instance) {
        // declare template in memory
        Post template;

        // construct the data payload used when initializing the new contract.
        bytes memory callData = abi.encodeWithSelector(
            template.initialize.selector, // selector
            operator,
            proofHash,
            staticMetadata,
            variableMetadata
        );

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

        // emit event
        emit ExplicitInitData(operator, proofHash, staticMetadata, variableMetadata);
    }

}







contract Feed is Operated, Metadata, Template {

    address[] private _posts;
    address private _postRegistry;

    event PostCreated(address post, address postFactory, bytes initData);

    function initialize(
        address operator,
        address postRegistry,
        bytes memory feedStaticMetadata
    ) public initializeTemplate() {
        // set operator
        if (operator != address(0)) {
            Operated._setOperator(operator);
            Operated._activateOperator();
        }

        // set post registry
        _postRegistry = postRegistry;

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

    // state functions

    function createPost(address postFactory, bytes memory initData) public returns (address post) {
        // only active operator or creator
        require(Template.isCreator(msg.sender) || Operated.isActiveOperator(msg.sender), "only active operator or creator");

        // validate factory is registered
        require(
            iRegistry(_postRegistry).getFactoryStatus(postFactory) == iRegistry.FactoryStatus.Registered,
            "factory is not actively registered"
        );

        // spawn new post contract
        post = Post_Factory(postFactory).createEncoded(initData);

        // add to array of posts
        _posts.push(post);

        // emit event
        emit PostCreated(post, postFactory, initData);
    }

    function setFeedVariableMetadata(bytes memory feedVariableMetadata) public {
        // only active operator or creator
        require(Template.isCreator(msg.sender) || Operated.isActiveOperator(msg.sender), "only active operator or creator");

        Metadata._setVariableMetadata(feedVariableMetadata);
    }

    function setPostVariableMetadata(address post, bytes memory postVariableMetadata) public {
        // only active operator or creator
        require(Template.isCreator(msg.sender) || Operated.isActiveOperator(msg.sender), "only active operator or creator");

        Post(post).setVariableMetadata(postVariableMetadata);
    }

    // view functions

    function getPosts() public view returns (address[] memory posts) {
        posts = _posts;
    }

    function getPostRegistry() public view returns (address postRegistry) {
        postRegistry = _postRegistry;
    }

}




contract Feed_Factory is Factory {

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

    event ExplicitInitData(address operator, address postRegistry, bytes feedStaticMetadata);

    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 operator,
            address postRegistry,
            bytes memory feedStaticMetadata
        ) = abi.decode(initdata, (address,address,bytes));

        // call explicit create
        instance = createExplicit(operator, postRegistry, feedStaticMetadata);
    }

    function createExplicit(
        address operator,
        address postRegistry,
        bytes memory feedStaticMetadata
    ) public returns (address instance) {
        // declare template in memory
        Feed template;

        // construct the data payload used when initializing the new contract.
        bytes memory callData = abi.encodeWithSelector(
            template.initialize.selector, // selector
            operator,
            postRegistry,
            feedStaticMetadata
        );

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

        // emit event
        emit ExplicitInitData(operator, postRegistry, feedStaticMetadata);
    }

}

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":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":false,"inputs":[{"name":"operator","type":"address"},{"name":"postRegistry","type":"address"},{"name":"feedStaticMetadata","type":"bytes"}],"name":"createExplicit","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":false,"name":"operator","type":"address"},{"indexed":false,"name":"postRegistry","type":"address"},{"indexed":false,"name":"feedStaticMetadata","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"}]

60806040523480156200001157600080fd5b50604051602080620036d5833981018060405260208110156200003357600080fd5b81019080805190602001909291905050506000604051620000549062000308565b604051809103906000f08015801562000071573d6000803e3d6000fd5b50905060006040518060400160405280600481526020017f506f73740000000000000000000000000000000000000000000000000000000081525080519060200120905060606040518060400160405280601781526020017f28616464726573732c616464726573732c627974657329000000000000000000815250905062000108848484846200011260201b620015091760201c565b50505050620003c5565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060039080519060200190620001ac92919062000316565b508373ffffffffffffffffffffffffffffffffffffffff166318c2f4cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015620001f457600080fd5b505afa15801562000209573d6000803e3d6000fd5b505050506040513d60208110156200022057600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614620002e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f696e636f727265637420696e7374616e6365207479706500000000000000000081525060200191505060405180910390fd5b81600460146101000a81548163ffffffff021916908360e01c021790555050505050565b6118e48062001df183390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200035957805160ff19168380011785556200038a565b828001600101855582156200038a579182015b82811115620003895782518255916020019190600101906200036c565b5b5090506200039991906200039d565b5090565b620003c291905b80821115620003be576000816000905550600101620003a4565b5090565b90565b611a1c80620003d56000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063a61352e111610071578063a61352e114610463578063ae34325c146104e6578063b71f2e7214610504578063cf5ba53f14610591578063d35fdd791461068c578063ebd348de146106eb576100b4565b806318c2f4cf146100b9578063321c48f2146101155780636bf719821461015f5780636f8d11e6146101e357806382804816146102de578063a5e1390414610419575b600080fd5b6100c1610759565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61011d610770565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101a16004803603602081101561017557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061079a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61029c600480360360208110156101f957600080fd5b810190808035906020019064010000000081111561021657600080fd5b82018360208201111561022857600080fd5b8035906020019184600183028401116401000000008311171561024a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610803565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d7600480360360608110156102f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561035157600080fd5b82018360208201111561036357600080fd5b8035906020019184600183028401116401000000008311171561038557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506108a1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610421610b1c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61046b610b46565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ab578082015181840152602081019050610490565b50505050905090810190601f1680156104d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104ee610be8565b6040518082815260200191505060405180910390f35b61053a6004803603604081101561051a57600080fd5b810190808035906020019092919080359060200190929190505050610bf4565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561057d578082015181840152602081019050610562565b505050509050019250505060405180910390f35b61064a600480360360208110156105a757600080fd5b81019080803590602001906401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610da5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610694610db7565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106d75780820151818401526020810190506106bc565b505050509050019250505060405180910390f35b6107176004803603602081101561070157600080fd5b8101908080359060200190929190505050610e45565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600460149054906101000a900460e01b905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806000606084806020019051606081101561081f57600080fd5b810190808051906020019092919080519060200190929190805164010000000081111561084b57600080fd5b8281019050602081018481111561086157600080fd5b815185600182028301116401000000008211171561087e57600080fd5b50509291905050509250925092506108978383836108a1565b9350505050919050565b60008060608173ffffffffffffffffffffffffffffffffffffffff1663cf7a1d77905060e01b868686604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610971578082015181840152602081019050610956565b50505050905090810190601f16801561099e5780820380516001836020036101000a031916815260200191505b50945050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050610a0d81610eff565b92507f159a9c35b291eea9d980b68e73d441cf24710856bf07f73814c8e1e49f5c8768868686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ad7578082015181840152602081019050610abc565b50505050905090810190601f168015610b045780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bde5780601f10610bb357610100808354040283529160200191610bde565b820191906000526020600020905b815481529060010190602001808311610bc157829003601f168201915b5050505050905090565b60008080549050905090565b6060818310610c4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806119cc6025913960400191505060405180910390fd5b600080549050821115610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f656e6420696e646578206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b6060838303604051908082528060200260200182016040528015610cfc5781602001602082028038833980820191505090505b50905060008490505b83811015610d9a5760008181548110610d1a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286830381518110610d5357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610d05565b508091505092915050565b6000610db082610eff565b9050919050565b60606000805480602002602001604051908101604052809291908181526020018280548015610e3b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610df1575b5050505050905090565b600080805490508210610ec0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e646578206f7574206f662072616e6765000000000000000000000000000081525060200191505060405180910390fd5b60008281548110610ecd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f12610f0c610770565b836111b8565b905060008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505033600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611000610b1c565b73ffffffffffffffffffffffffffffffffffffffff1663bba83f64823360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1669ffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156110d157600080fd5b505af11580156110e5573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fab60131c1462939275d0fd3738e07ab853e22af6296cf75e71bbdf3a497791a2846040518080602001828103825283818151815260200191508051906020019080838360005b8381101561117957808201518184015260208101905061115e565b50505050905090810190601f1680156111a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a3919050565b60006060604051806020016111cc906114fc565b6020820181038252601f19601f820116604052508484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561125757808201518184015260208101905061123c565b50505050905090810190601f1680156112845780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040526040516020018083805190602001908083835b602083106112cf57805182526020820191506020810190506020830392506112ac565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061132057805182526020820191506020810190506020830392506112fd565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905061136081611369565b91505092915050565b6000806113758361139c565b50905082602001835182818334f5935083611394573d6000803e3d6000fd5b505050919050565b600080600083805190602001209050600080905060005b6001156114f4573382604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018281526020019250505060405160208183030381529060405280519060200120945060ff60f81b30868560405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c9350833b905060008114156114e7576114f4565b81806001019250506113b3565b505050915091565b61022d8061179f83390190565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600390805190602001906115a19291906116f9565b508373ffffffffffffffffffffffffffffffffffffffff166318c2f4cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e857600080fd5b505afa1580156115fc573d6000803e3d6000fd5b505050506040513d602081101561161257600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f696e636f727265637420696e7374616e6365207479706500000000000000000081525060200191505060405180910390fd5b81600460146101000a81548163ffffffff021916908360e01c021790555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061173a57805160ff1916838001178555611768565b82800160010185558215611768579182015b8281111561176757825182559160200191906001019061174c565b5b5090506117759190611779565b5090565b61179b91905b8082111561179757600081600090555060010161177f565b5090565b9056fe608060405260405161022d38038061022d8339810180604052604081101561002657600080fd5b8101908080519060200190929190805164010000000081111561004857600080fd5b8281019050602081018481111561005e57600080fd5b815185600182028301116401000000008211171561007b57600080fd5b505092919050505060008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b602083106100d057805182526020820191506020810190506020830392506100ad565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610130576040519150601f19603f3d011682016040523d82523d6000602084013e610135565b606091505b5050905080610148573d6000803e3d6000fd5b606069363d3d373d3d3d363d7360b01b846e5af43d82803e903d91602b57fd5bf360881b604051602001808475ffffffffffffffffffffffffffffffffffffffffffff191675ffffffffffffffffffffffffffffffffffffffffffff19168152600a018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018270ffffffffffffffffffffffffffffffffff191670ffffffffffffffffffffffffffffffffff19168152600f0193505050506040516020818303038152906040529050602d81602001f3fe7374617274496e646578206d757374206265206c657373207468616e20656e64496e646578a165627a7a7230582096427aef8f91cb389d251bcd8a402dce378340f8b90666121707429484af05f00029608060405234801561001057600080fd5b506118c4806100206000396000f3fe608060405234801561001057600080fd5b50600436106100ce5760003560e01c80638077f0ae1161008c578063e424f5e611610066578063e424f5e6146105d6578063e7f43c6814610620578063ed02dcea1461066a578063efd4606514610785576100ce565b80638077f0ae146103fe578063923b1762146104b9578063cf7a1d77146104db576100ce565b806212a907146100d35780630ee2cb10146101ae5780633367cca5146101f857806341f3004a146102545780636d70f7ae146102b35780637a5b4f591461030f575b600080fd5b6101ac600480360360408110156100e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561012657600080fd5b82018360208201111561013857600080fd5b8035906020019184600183028401116401000000008311171561015a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506107e1565b005b6101b6610940565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61023a6004803603602081101561020e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a21565b604051808215151515815260200191505060405180910390f35b61025c610a43565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561029f578082015181840152602081019050610284565b505050509050019250505060405180910390f35b6102f5600480360360208110156102c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ad1565b604051808215151515815260200191505060405180910390f35b610317610b10565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561035b578082015181840152602081019050610340565b50505050905090810190601f1680156103885780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156103c15780820151818401526020810190506103a6565b50505050905090810190601f1680156103ee5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b6104b76004803603602081101561041457600080fd5b810190808035906020019064010000000081111561043157600080fd5b82018360208201111561044357600080fd5b8035906020019184600183028401116401000000008311171561046557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610c51565b005b6104c1610ce8565b604051808215151515815260200191505060405180910390f35b6105d4600480360360608110156104f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561054e57600080fd5b82018360208201111561056057600080fd5b8035906020019184600183028401116401000000008311171561058257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610cfe565b005b6105de610e3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610628610e64565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107436004803603604081101561068057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156106bd57600080fd5b8201836020820111156106cf57600080fd5b803590602001918460018302840111640100000000831117156106f157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610e8d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107c76004803603602081101561079b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112c7565b604051808215151515815260200191505060405180910390f35b6107ea336112c7565b806107fa57506107f933610a21565b5b61086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c7920616374697665206f70657261746f72206f722063726561746f720081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166327305e83826040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156108d85780820151818401526020810190506108bd565b50505050905090810190601f1680156109055780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561092457600080fd5b505af1158015610938573d6000803e3d6000fd5b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636bf71982306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156109e157600080fd5b505afa1580156109f5573d6000803e3d6000fd5b505050506040513d6020811015610a0b57600080fd5b8101908080519060200190929190505050905090565b6000610a2c82610ad1565b8015610a3c5750610a3b610ce8565b5b9050919050565b60606004805480602002602001604051908101604052809291908181526020018280548015610ac757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610a7d575b5050505050905090565b6000610adb610e64565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b60608060018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b5050505050915060028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c465780601f10610c1b57610100808354040283529160200191610c46565b820191906000526020600020905b815481529060010190602001808311610c2957829003601f168201915b505050505090509091565b610c5a336112c7565b80610c6a5750610c6933610a21565b5b610cdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c7920616374697665206f70657261746f72206f722063726561746f720081525060200191505060405180910390fd5b610ce581611306565b50565b60008060149054906101000a900460ff16905090565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000303b905060008163ffffffff1614610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061186f602a913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610dea57610de1846113bc565b610de9611538565b5b82600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e3482611661565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610e98336112c7565b80610ea85750610ea733610a21565b5b610f1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c7920616374697665206f70657261746f72206f722063726561746f720081525060200191505060405180910390fd5b60016002811115610f2757fe5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f795ab75856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fc657600080fd5b505afa158015610fda573d6000803e3d6000fd5b505050506040513d6020811015610ff057600080fd5b8101908080519060200190929190505050600281111561100c57fe5b14611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061184d6022913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16636f8d11e6836040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156110ce5780820151818401526020810190506110b3565b50505050905090810190601f1680156110fb5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561111a57600080fd5b505af115801561112e573d6000803e3d6000fd5b505050506040513d602081101561114457600080fd5b8101908080519060200190929190505050905060048190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f6e586eddfc77482083ba3396cb6e340089605d21249a6bc9725e6d751cd4796a818484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561128557808201518184015260208101905061126a565b50505050905090810190601f1680156112b25780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a192915050565b60006112d1610940565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b806002908051906020019061131c929190611786565b507fec391f097a91107044327f7588bc67ac8b9daf871413fc181f768c437c66cda9816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561137f578082015181840152602081019050611364565b50505050905090810190601f1680156113ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561147f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f63616e6e6f74207365742073616d65206f70657261746f72000000000000000081525060200191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d816114e9610ce8565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a150565b611540610ce8565b156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6f6e6c79207768656e206f70657261746f72206e6f742061637469766500000081525060200191505060405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1565b60006001805460018160011615610100020316600290049050146116d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061182c6021913960400191505060405180910390fd5b80600190805190602001906116e6929190611786565b507fd2bb68a4c0cbd7fabc3f8e787a6e54384db17d54dedeede61c35819f5f49edca816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561174957808201518184015260208101905061172e565b50505050905090810190601f1680156117765780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117c757805160ff19168380011785556117f5565b828001600101855582156117f5579182015b828111156117f45782518255916020019190600101906117d9565b5b5090506118029190611806565b5090565b61182891905b8082111561182457600081600090555060010161180c565b5090565b9056fe737461746963206d657461646174612063616e6e6f74206265206368616e676564666163746f7279206973206e6f74206163746976656c7920726567697374657265646d7573742062652063616c6c65642077697468696e20636f6e747261637420636f6e7374727563746f72a165627a7a723058206b8c4bb2a71aa47fe021706bb95e15d639f77f92425e35135a38cf7f6151ea9f0029000000000000000000000000348fa9dcff507b81c7a1d7981244ea92e8c6af29

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063a61352e111610071578063a61352e114610463578063ae34325c146104e6578063b71f2e7214610504578063cf5ba53f14610591578063d35fdd791461068c578063ebd348de146106eb576100b4565b806318c2f4cf146100b9578063321c48f2146101155780636bf719821461015f5780636f8d11e6146101e357806382804816146102de578063a5e1390414610419575b600080fd5b6100c1610759565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61011d610770565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101a16004803603602081101561017557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061079a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61029c600480360360208110156101f957600080fd5b810190808035906020019064010000000081111561021657600080fd5b82018360208201111561022857600080fd5b8035906020019184600183028401116401000000008311171561024a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610803565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d7600480360360608110156102f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561035157600080fd5b82018360208201111561036357600080fd5b8035906020019184600183028401116401000000008311171561038557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506108a1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610421610b1c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61046b610b46565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ab578082015181840152602081019050610490565b50505050905090810190601f1680156104d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104ee610be8565b6040518082815260200191505060405180910390f35b61053a6004803603604081101561051a57600080fd5b810190808035906020019092919080359060200190929190505050610bf4565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561057d578082015181840152602081019050610562565b505050509050019250505060405180910390f35b61064a600480360360208110156105a757600080fd5b81019080803590602001906401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610da5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610694610db7565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106d75780820151818401526020810190506106bc565b505050509050019250505060405180910390f35b6107176004803603602081101561070157600080fd5b8101908080359060200190929190505050610e45565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600460149054906101000a900460e01b905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806000606084806020019051606081101561081f57600080fd5b810190808051906020019092919080519060200190929190805164010000000081111561084b57600080fd5b8281019050602081018481111561086157600080fd5b815185600182028301116401000000008211171561087e57600080fd5b50509291905050509250925092506108978383836108a1565b9350505050919050565b60008060608173ffffffffffffffffffffffffffffffffffffffff1663cf7a1d77905060e01b868686604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610971578082015181840152602081019050610956565b50505050905090810190601f16801561099e5780820380516001836020036101000a031916815260200191505b50945050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050610a0d81610eff565b92507f159a9c35b291eea9d980b68e73d441cf24710856bf07f73814c8e1e49f5c8768868686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ad7578082015181840152602081019050610abc565b50505050905090810190601f168015610b045780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bde5780601f10610bb357610100808354040283529160200191610bde565b820191906000526020600020905b815481529060010190602001808311610bc157829003601f168201915b5050505050905090565b60008080549050905090565b6060818310610c4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806119cc6025913960400191505060405180910390fd5b600080549050821115610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f656e6420696e646578206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b6060838303604051908082528060200260200182016040528015610cfc5781602001602082028038833980820191505090505b50905060008490505b83811015610d9a5760008181548110610d1a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286830381518110610d5357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610d05565b508091505092915050565b6000610db082610eff565b9050919050565b60606000805480602002602001604051908101604052809291908181526020018280548015610e3b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610df1575b5050505050905090565b600080805490508210610ec0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e646578206f7574206f662072616e6765000000000000000000000000000081525060200191505060405180910390fd5b60008281548110610ecd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f12610f0c610770565b836111b8565b905060008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505033600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611000610b1c565b73ffffffffffffffffffffffffffffffffffffffff1663bba83f64823360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1669ffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156110d157600080fd5b505af11580156110e5573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fab60131c1462939275d0fd3738e07ab853e22af6296cf75e71bbdf3a497791a2846040518080602001828103825283818151815260200191508051906020019080838360005b8381101561117957808201518184015260208101905061115e565b50505050905090810190601f1680156111a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a3919050565b60006060604051806020016111cc906114fc565b6020820181038252601f19601f820116604052508484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561125757808201518184015260208101905061123c565b50505050905090810190601f1680156112845780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040526040516020018083805190602001908083835b602083106112cf57805182526020820191506020810190506020830392506112ac565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061132057805182526020820191506020810190506020830392506112fd565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905061136081611369565b91505092915050565b6000806113758361139c565b50905082602001835182818334f5935083611394573d6000803e3d6000fd5b505050919050565b600080600083805190602001209050600080905060005b6001156114f4573382604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018281526020019250505060405160208183030381529060405280519060200120945060ff60f81b30868560405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c9350833b905060008114156114e7576114f4565b81806001019250506113b3565b505050915091565b61022d8061179f83390190565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600390805190602001906115a19291906116f9565b508373ffffffffffffffffffffffffffffffffffffffff166318c2f4cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e857600080fd5b505afa1580156115fc573d6000803e3d6000fd5b505050506040513d602081101561161257600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f696e636f727265637420696e7374616e6365207479706500000000000000000081525060200191505060405180910390fd5b81600460146101000a81548163ffffffff021916908360e01c021790555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061173a57805160ff1916838001178555611768565b82800160010185558215611768579182015b8281111561176757825182559160200191906001019061174c565b5b5090506117759190611779565b5090565b61179b91905b8082111561179757600081600090555060010161177f565b5090565b9056fe608060405260405161022d38038061022d8339810180604052604081101561002657600080fd5b8101908080519060200190929190805164010000000081111561004857600080fd5b8281019050602081018481111561005e57600080fd5b815185600182028301116401000000008211171561007b57600080fd5b505092919050505060008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b602083106100d057805182526020820191506020810190506020830392506100ad565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610130576040519150601f19603f3d011682016040523d82523d6000602084013e610135565b606091505b5050905080610148573d6000803e3d6000fd5b606069363d3d373d3d3d363d7360b01b846e5af43d82803e903d91602b57fd5bf360881b604051602001808475ffffffffffffffffffffffffffffffffffffffffffff191675ffffffffffffffffffffffffffffffffffffffffffff19168152600a018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018270ffffffffffffffffffffffffffffffffff191670ffffffffffffffffffffffffffffffffff19168152600f0193505050506040516020818303038152906040529050602d81602001f3fe7374617274496e646578206d757374206265206c657373207468616e20656e64496e646578a165627a7a7230582096427aef8f91cb389d251bcd8a402dce378340f8b90666121707429484af05f00029

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

000000000000000000000000348fa9dcff507b81c7a1d7981244ea92e8c6af29

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

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000348fa9dcff507b81c7a1d7981244ea92e8c6af29


Swarm Source

bzzr://6b8c4bb2a71aa47fe021706bb95e15d639f77f92425e35135a38cf7f6151ea9f

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.