Contract 0x53fe993e998c5116029209f6151f7e4169e2d67c

Contract Overview

Balance:
0 Ether
TxHash Block Age From To Value [TxFee]
0x7a97cf8b3b486d26a20845ec2871e915831670b3d5bb17302268faa8ef3cc46f491197151 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000055364
0x967cefaad4025c1effad49edcc294281eb4c3c0ae88ca444ab2d7b899c5adc07491194851 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000024334
0xebdc924a05375cc6a0b23c316e2f592debc8a710f30382e638fd091541ff259e491191351 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000054387
0x10661c664dc54686b3aae7198ea66bc96b7a0103812c8f650685f45278a3b2a1491186151 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000024484
0xb0740be011454e249ca194916f21f2eb6095e9fed50c41240aa5cc335be13803491184951 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000054603
0x2bbc0b9dc08ab0cb9ad927c8ad2d9209ea17cbdfb274d51aa561049da22cbb16491184851 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000040131
0x7e39fe775cb8c00c7ff8c7a9a692142d707bc5bb85ba7cea878fff496da021c6491183751 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000052058
0x918a8128ed961c2fc4668d4b64a5efe44107ba393fe10e71c77d2b31bf937c66491183651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000057892
0x4c31ceb89e47c8d94ddc18f25c22b68e07851c714ded3cd2c722a6c1d1f64d65491183351 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000041506
0xb7048b8bbbb9fb1bf886ec6ab6be1f1c0429426449cf28673ed5df51159cb670491182651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000024349
0xc91e8730d3930e4cd657c9c799e707caeed1c2aa1eb6082b88ee4a0182aec53f491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000369494
0xfee8a1c3ff7680cec969b10ba4fe8958e2d57c85387e0337cd7545f5edefd510491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.00016419
0x0d162eee9b1ecd33b89d1de8cd34952a5ba5d84c478615a1156fbba4ff0f94ca491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.00016419
0x6adce75fef0784e30d50d819be725955a993962a9854c139f3a0c4fb5c813892491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.00016419
0x9e0f478385b744346629f1b47f450322c6e5e42ce54f2abd947227d944f6aa71491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000164126
0x41b7abf5d4e3170c257d9663bb6ba81965ad2553f5393d9f50f921f31815e6fb491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000369494
0x5fc0b8f45b314689da24c0f44f6c7ef565fdc74161381f8a3467fb287bdaa8f7491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.00016419
0xa2844ee1a4733738c09445007f1e71464cb7f1277d8490802025cdd6d043d83b491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000164126
0xcead06f270c237b4731cf2b7623d0e4b12507893ecf751aa50e900fc5b87dc8b491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.00016419
0x390910bbaadec267bd21277e7325baaee74d201262ccfee0b806c4e5c2436d6e491181651 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000369494
0x35b82adc58c0550db956621bcfb27fe8f13fdbac06d278302a34b161b29d14b2491181551 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.00038443
0x872339cff9327e6fbaeec3527c42bc1d58087647adf4c397cbc77f0412110bc2491181351 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000054633
0xb1059d775d1f8718e7d14a4eea2f046e44aff19c5892fc5280511bbbfd2e5661491180351 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000039903
0x631ea80349168a400e48d8ed579fa2f53a66197d3af3abc032af96e5bde602cb491179751 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.00005533
0x3eb1a794b27d402370735ceafafafd5f6af83e2fb38f08182c790716c1061fb7491178951 days 16 hrs ago0xf51ee496342b485e6006aeaf85fa9d9e24785c05 IN  0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether0.000025113
[ Download CSV Export 

Latest 25 internal transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0xd813e557fe6f604dff119344ab0f141917ce2c8b0c3fb33501a4eea34d351085491198251 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x6790c3254ddfd2c4cb64a4775b986e40d208383b0 Ether
0xd813e557fe6f604dff119344ab0f141917ce2c8b0c3fb33501a4eea34d351085491198251 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0x7a97cf8b3b486d26a20845ec2871e915831670b3d5bb17302268faa8ef3cc46f491197151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x6790c3254ddfd2c4cb64a4775b986e40d208383b0 Ether
0x967cefaad4025c1effad49edcc294281eb4c3c0ae88ca444ab2d7b899c5adc07491194851 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0xebdc924a05375cc6a0b23c316e2f592debc8a710f30382e638fd091541ff259e491191351 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0x10661c664dc54686b3aae7198ea66bc96b7a0103812c8f650685f45278a3b2a1491186151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0x7cc9a6dc15aeba78fc0bd870b331dd2426aeba7cd2ac02877ef6c5a00650c898491185851 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0x7cc9a6dc15aeba78fc0bd870b331dd2426aeba7cd2ac02877ef6c5a00650c898491185851 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0x667d551b4575200e50c8002f575834712e7e407fac66c6ff86e6163ba3b96a26491185851 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0x667d551b4575200e50c8002f575834712e7e407fac66c6ff86e6163ba3b96a26491185851 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0x821a699857a00f4515e2fdc1cfdd7cdee6d91b43b338ac06fc83b67f914e43dd491185151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0x821a699857a00f4515e2fdc1cfdd7cdee6d91b43b338ac06fc83b67f914e43dd491185151 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0xb0def64d16f96e5521c3b583e532aca551007867c526c2ebea3d3d640cf271b6491185151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0xb0def64d16f96e5521c3b583e532aca551007867c526c2ebea3d3d640cf271b6491185151 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0xbb18480e7c0a6a7758105351449b459a3f84eab5592a04ea73f81112dca173c1491185151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0xbb18480e7c0a6a7758105351449b459a3f84eab5592a04ea73f81112dca173c1491185151 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0x819edefc91ee58be3c1f4dac5a00978475f53085efff57e03f1f735cc286a00c491185151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0x819edefc91ee58be3c1f4dac5a00978475f53085efff57e03f1f735cc286a00c491185151 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0x7bb5549c6ba6d9b6f8b6a141cbca5d264e60c3e5a5d7f54ef29ec34f1ea370f6491185151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0x7bb5549c6ba6d9b6f8b6a141cbca5d264e60c3e5a5d7f54ef29ec34f1ea370f6491185151 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0x4c411c976655929c09a29b522d4e1cff6b863daa6b6304ff51903abc3ee65f2c491185151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0x4c411c976655929c09a29b522d4e1cff6b863daa6b6304ff51903abc3ee65f2c491185151 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0xb11b9bb242e2c5d8aba49956adf42ef5b9360a869d7b00846157984f2573ab46491185151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
0xb11b9bb242e2c5d8aba49956adf42ef5b9360a869d7b00846157984f2573ab46491185151 days 16 hrs ago0x479955ee1b96bc0b6fff39317e567c373910e39f0x53fe993e998c5116029209f6151f7e4169e2d67c0 Ether
0x0e6d31495c87aa18d7ea2300aeaf531f670cdba3f645c843bae77ea93f884c25491185151 days 16 hrs ago0x53fe993e998c5116029209f6151f7e4169e2d67c0x880fc7d7b1b00d8ef5c313bf8e3aeba6530c7ff00 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)

Contract Name:
AuctionHouse

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No

Runs (Optimizer):
200

Contract Source Code

pragma solidity ^0.4.23;

// imported contracts/access/roles/AuctionManagerRole.sol
// imported node_modules/openzeppelin-solidity/contracts/access/Roles.sol
/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
  struct Role {
    mapping (address => bool) bearer;
  }
  /**
   * @dev give an account access to this role
   */
  function add(Role storage role, address account) internal {
    require(account != address(0));
    require(!has(role, account));
    role.bearer[account] = true;
  }
  /**
   * @dev remove an account's access to this role
   */
  function remove(Role storage role, address account) internal {
    require(account != address(0));
    require(has(role, account));
    role.bearer[account] = false;
  }
  /**
   * @dev check if an account has this role
   * @return bool
   */
  function has(Role storage role, address account)
    internal
    view
    returns (bool)
  {
    require(account != address(0));
    return role.bearer[account];
  }
}

contract AuctionManagerRole {
  using Roles for Roles.Role;
  event AuctionManagerAdded(address indexed account);
  event AuctionManagerRemoved(address indexed account);
  Roles.Role private proxyManagers;
  constructor() public {
    proxyManagers.add(msg.sender);
  }
  modifier onlyAuctionManager() {
    require(isAuctionManager(msg.sender));
    _;
  }
  function isAuctionManager(address account) public view returns (bool) {
    return proxyManagers.has(account);
  }
  function addAuctionManager(address account) public onlyAuctionManager {
    proxyManagers.add(account);
    emit AuctionManagerAdded(account);
  }
  function renounceAuctionManager() public {
    proxyManagers.remove(msg.sender);
  }
  function _removeAuctionManager(address account) internal {
    proxyManagers.remove(account);
    emit AuctionManagerRemoved(account);
  }
}

// imported contracts/proposals/OCP-IP-5/AuctionHouseBidRegistry.sol
// imported contracts/proposals/OCP-IP-1/BlindBidRegistryProxiable.sol
// imported contracts/proposals/OCP-IP-1/BlindBidRegistry.sol
// imported contracts/proposals/OCP-IP-1/BidRegistry.sol
// imported node_modules/openzeppelin-solidity/contracts/ownership/Secondary.sol
/**
 * @title Secondary
 * @dev A Secondary contract can only be used by its primary account (the one that created it)
 */
contract Secondary {
  address private _primary;
  event PrimaryTransferred(
    address recipient
  );
  /**
   * @dev Sets the primary account to the one that is creating the Secondary contract.
   */
  constructor() internal {
    _primary = msg.sender;
    emit PrimaryTransferred(_primary);
  }
  /**
   * @dev Reverts if called from any account other than the primary.
   */
  modifier onlyPrimary() {
    require(msg.sender == _primary);
    _;
  }
  /**
   * @return the address of the primary.
   */
  function primary() public view returns (address) {
    return _primary;
  }
  /**
   * @dev Transfers contract to a new primary.
   * @param recipient The address of new primary. 
   */
  function transferPrimary(address recipient) public onlyPrimary {
    require(recipient != address(0));
    _primary = recipient;
    emit PrimaryTransferred(_primary);
  }
}

// imported contracts/proposals/OCP-IP-1/IBidRegistry.sol
// implementation from https://github.com/open-city-protocol/OCP-IPs/blob/jeichel/ocp-ip-1/OCP-IPs/ocp-ip-1.md
contract IBidRegistry {
  enum AuctionStatus {
    Undetermined,
    Lost,
    Won
  }
  enum BidState {
    Created,
    Submitted,
    Lost,
    Won,
    Refunded,
    Allocated,
    Redeemed
  }
  event BidCreated(
    bytes32 indexed hash,
    address creator,
    uint256 indexed auction,
    address indexed bidder,
    bytes32 schema,
    bytes32 licenseTerms,
    uint256 durationSec,
    uint256 bidPrice,
    uint256 updatedAtUtcSec
  );
  event BidAuctionStatusChange(bytes32 indexed hash, uint8 indexed auctionStatus, uint256 updatedAtUtcSec);
  event BidStateChange(bytes32 indexed hash, uint8 indexed bidState, uint256 updatedAtUtcSec);
  event BidClearingPriceChange(bytes32 indexed hash, uint256 clearingPrice, uint256 updatedAtUtcSec);
  function hashBid(
    address _creator,
    uint256 _auction,
    address _bidder,
    bytes32 _schema,
    bytes32 _licenseTerms,
    uint256 _durationSec,
    uint256 _bidPrice
  ) public constant returns(bytes32);
  function verifyStoredData(bytes32 hash) public view returns(bool);
  function creator(bytes32 hash) public view returns(address);
  function auction(bytes32 hash) public view returns(uint256);
  function bidder(bytes32 hash) public view returns(address);
  function schema(bytes32 hash) public view returns(bytes32);
  function licenseTerms(bytes32 hash) public view returns(bytes32);
  function durationSec(bytes32 hash) public view returns(uint256);
  function bidPrice(bytes32 hash) public view returns(uint256);
  function clearingPrice(bytes32 hash) public view returns(uint256);
  function auctionStatus(bytes32 hash) public view returns(uint8);
  function bidState(bytes32 hash) public view returns(uint8);
  function allocationFee(bytes32 hash) public view returns(uint256);
  function createBid(
    uint256 _auction,
    address _bidder,
    bytes32 _schema,
    bytes32 _licenseTerms,
    uint256 _durationSec,
    uint256 _bidPrice
  ) public;
  function setAllocationFee(bytes32 hash, uint256 fee) public;
  function setAuctionStatus(bytes32 hash, uint8 _auctionStatus) public;
  function setBidState(bytes32 hash, uint8 _bidState) public;
  function setClearingPrice(bytes32 hash, uint256 _clearingPrice) public;
}

contract BidRegistry is Secondary, IBidRegistry {
  uint256 public constant INIT_CLEARING_PRICE = 0;
  AuctionStatus public constant INIT_AUCTION_STATUS = AuctionStatus.Undetermined;
  BidState public constant INIT_BID_STATE = BidState.Created;
  uint256 public constant INIT_ALLOCATION_FEE = 0;
  struct Bid {
    // read-only after init
    address creator;
    uint256 auction;
    address bidder;
    bytes32 schema;
    bytes32 licenseTerms;
    uint256 durationSec;
    uint256 bidPrice;
    // changes through state transitions
    uint256 clearingPrice;
    uint8 auctionStatus;
    uint8 bidState;
    uint256 allocationFee;
  }
  mapping(bytes32 => Bid) public registry;
  function hashBid(
    address _creator,
    uint256 _auction,
    address _bidder,
    bytes32 _schema,
    bytes32 _licenseTerms,
    uint256 _durationSec,
    uint256 _bidPrice
  ) public constant returns(bytes32) {
    return keccak256(abi.encodePacked(
      _creator,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice
    ));
  }
  function verifyStoredData(bytes32 hash) public view returns(bool) {
    Bid memory bid = registry[hash];
    bytes32 storedBidHash = hashBid(
      bid.creator,
      bid.auction,
      bid.bidder,
      bid.schema,
      bid.licenseTerms,
      bid.durationSec,
      bid.bidPrice
    );
    return storedBidHash == hash;
  }
  function creator(bytes32 hash) public view returns(address) {
    return registry[hash].creator;
  }
  function auction(bytes32 hash) public view returns(uint256) {
    return registry[hash].auction;
  }
  function bidder(bytes32 hash) public view returns(address) {
    return registry[hash].bidder;
  }
  function schema(bytes32 hash) public view returns(bytes32) {
    return registry[hash].schema;
  }
  function licenseTerms(bytes32 hash) public view returns(bytes32) {
    return registry[hash].licenseTerms;
  }
  function durationSec(bytes32 hash) public view returns(uint256) {
    return registry[hash].durationSec;
  }
  function bidPrice(bytes32 hash) public view returns(uint256) {
    return registry[hash].bidPrice;
  }
  function clearingPrice(bytes32 hash) public view returns(uint) {
    return registry[hash].clearingPrice;
  }
  function auctionStatus(bytes32 hash) public view returns(uint8) {
    return registry[hash].auctionStatus;
  }
  function bidState(bytes32 hash) public view returns(uint8) {
    return registry[hash].bidState;
  }
  function allocationFee(bytes32 hash) public view returns(uint256) {
    return registry[hash].allocationFee;
  }
  function createBid(
    uint256 _auction,
    address _bidder,
    bytes32 _schema,
    bytes32 _licenseTerms,
    uint _durationSec,
    uint _bidPrice
  ) public {
    _createBid(
      msg.sender,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice
    );
  }
  function setAllocationFee(bytes32 hash, uint256 fee) public onlyPrimary {
    _setAllocationFee(hash, fee);
  }
  function setAuctionStatus(bytes32 hash, uint8 _auctionStatus) public onlyPrimary {
    _setAuctionStatus(hash, _auctionStatus);
  }
  function setBidState(bytes32 hash, uint8 _bidState) public onlyPrimary {
    _setBidState(hash, _bidState);
  }
  function setClearingPrice(bytes32 hash, uint256 _clearingPrice) public onlyPrimary {
    _setClearingPrice(hash, _clearingPrice);
  }
  function _createBid(
    address _creator,
    uint256 _auction,
    address _bidder,
    bytes32 _schema,
    bytes32 _licenseTerms,
    uint _durationSec,
    uint _bidPrice
  ) internal {
    bytes32 hash = hashBid(
      _creator,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice
    );
    registry[hash] = Bid(
      _creator,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice,
      INIT_CLEARING_PRICE,
      uint8(INIT_AUCTION_STATUS),
      uint8(INIT_BID_STATE),
      INIT_ALLOCATION_FEE
    );
    emit BidCreated(
      hash,
      _creator,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice,
      now // solhint-disable-line not-rely-on-time
    );
  }
  function _setAllocationFee(bytes32 hash, uint256 fee) internal {
    registry[hash].allocationFee = fee;
  }
  function _setAuctionStatus(bytes32 hash, uint8 _auctionStatus) internal {
    registry[hash].auctionStatus = _auctionStatus;
    emit BidAuctionStatusChange(hash, _auctionStatus, now); // solhint-disable-line
  }
  function _setBidState(bytes32 hash, uint8 _bidState) internal {
    registry[hash].bidState = _bidState;
    emit BidStateChange(hash, _bidState, now); // solhint-disable-line
  }
  function _setClearingPrice(bytes32 hash, uint256 _clearingPrice) internal {
    registry[hash].clearingPrice = _clearingPrice;
    emit BidClearingPriceChange(hash, _clearingPrice, now); // solhint-disable-line
  }
}

// imported contracts/proposals/OCP-IP-1/IBlindBidRegistry.sol
// implementation from https://github.com/open-city-protocol/OCP-IPs/blob/jeichel/ocp-ip-1/OCP-IPs/ocp-ip-1.md
contract IBlindBidRegistry is IBidRegistry {
  event BlindBidCreated(
    bytes32 indexed hash,
    address creator,
    uint256 indexed auction,
    uint256 updatedAtUtcSec
  );
  event BlindBidRevealed(
    bytes32 indexed hash,
    address creator,
    uint256 indexed auction,
    address indexed bidder,
    bytes32 schema,
    bytes32 licenseTerms,
    uint256 durationSec,
    uint256 bidPrice,
    uint256 updatedAtUtcSec
  );
  enum BlindBidState {
    // must match IBidRegistry.BidState
    Created,
    Submitted,
    Lost,
    Won,
    Refunded,
    Allocated,
    Redeemed,
    // new states
    Revealed
  }
  function createBid(bytes32 hash, uint256 _auction) public;
  function revealBid(
    bytes32 hash,
    uint256 _auction,
    address _bidder,
    bytes32 _schema,
    bytes32 _licenseTerms,
    uint256 _durationSec,
    uint256 _bidPrice
  ) public;
}

contract BlindBidRegistry is BidRegistry, IBlindBidRegistry {
  address public constant BLIND_BIDDER = 0;
  bytes32 public constant BLIND_SCHEMA = 0x0;
  bytes32 public constant BLIND_LICENSE = 0x0;
  uint256 public constant BLIND_DURATION = 0;
  uint256 public constant BLIND_PRICE = 0;
  function createBid(bytes32 hash, uint256 _auction) public {
    _createBid(hash, msg.sender, _auction);
  }
  function revealBid(
    bytes32 hash,
    uint256 _auction,
    address _bidder,
    bytes32 _schema,
    bytes32 _licenseTerms,
    uint256 _durationSec,
    uint256 _bidPrice
  ) public {
    _revealBid(
      hash,
      msg.sender,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice
    );
  }
  function _createBid(bytes32 hash, address _creator, uint256 _auction) internal {
    registry[hash] = Bid(
      _creator,
      _auction,
      BLIND_BIDDER,
      BLIND_SCHEMA,
      BLIND_LICENSE,
      BLIND_DURATION,
      BLIND_PRICE,
      INIT_CLEARING_PRICE,
      uint8(INIT_AUCTION_STATUS),
      uint8(INIT_BID_STATE),
      INIT_ALLOCATION_FEE
    );
    emit BlindBidCreated(
      hash,
      _creator,
      _auction,
      now // solhint-disable-line not-rely-on-time
    );
  }
  function _revealBid(
    bytes32 hash,
    address _creator,
    uint256 _auction,
    address _bidder,
    bytes32 _schema,
    bytes32 _licenseTerms,
    uint256 _durationSec,
    uint256 _bidPrice
  ) internal {
    require(!verifyStoredData(hash));
    require(registry[hash].creator == _creator);
    require(registry[hash].auction == _auction);
    bytes32 revealedHash = hashBid(
      _creator,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice
    );
    require(revealedHash == hash);
    registry[hash] = Bid(
      _creator,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice,
      INIT_CLEARING_PRICE,
      uint8(INIT_AUCTION_STATUS),
      bidState(hash),
      INIT_ALLOCATION_FEE
    );
    emit BlindBidRevealed(
      hash,
      _creator,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice,
      now // solhint-disable-line not-rely-on-time
    );
  }
}

// imported contracts/proposals/OCP-IP-4/Proxiable.sol
// imported contracts/access/roles/ProxyManagerRole.sol
contract ProxyManagerRole {
  using Roles for Roles.Role;
  event ProxyManagerAdded(address indexed account);
  event ProxyManagerRemoved(address indexed account);
  Roles.Role private proxyManagers;
  constructor() public {
    proxyManagers.add(msg.sender);
  }
  modifier onlyProxyManager() {
    require(isProxyManager(msg.sender));
    _;
  }
  function isProxyManager(address account) public view returns (bool) {
    return proxyManagers.has(account);
  }
  function addProxyManager(address account) public onlyProxyManager {
    proxyManagers.add(account);
    emit ProxyManagerAdded(account);
  }
  function renounceProxyManager() public {
    proxyManagers.remove(msg.sender);
  }
  function _removeProxyManager(address account) internal {
    proxyManagers.remove(account);
    emit ProxyManagerRemoved(account);
  }
}

// implementation from https://github.com/open-city-protocol/OCP-IPs/blob/master/OCP-IPs/ocp-ip-4.md
contract Proxiable is ProxyManagerRole {
  mapping(address => bool) private _globalProxies; // proxy -> valid
  mapping(address => mapping(address => bool)) private _senderProxies; // sender -> proxy -> valid
  event ProxyAdded(address indexed proxy, uint256 updatedAtUtcSec);
  event ProxyRemoved(address indexed proxy, uint256 updatedAtUtcSec);
  event ProxyForSenderAdded(address indexed proxy, address indexed sender, uint256 updatedAtUtcSec);
  event ProxyForSenderRemoved(address indexed proxy, address indexed sender, uint256 updatedAtUtcSec);
  modifier proxyOrSender(address claimedSender) {
    require(isProxyOrSender(claimedSender));
    _;
  }
  function isProxyOrSender(address claimedSender) public view returns (bool) {
    return msg.sender == claimedSender ||
    _globalProxies[msg.sender] ||
    _senderProxies[claimedSender][msg.sender];
  }
  function isProxy(address proxy) public view returns (bool) {
    return _globalProxies[proxy];
  }
  function isProxyForSender(address proxy, address sender) public view returns (bool) {
    return _senderProxies[sender][proxy];
  }
  function addProxy(address proxy) public onlyProxyManager {
    require(!_globalProxies[proxy]);
    _globalProxies[proxy] = true;
    emit ProxyAdded(proxy, now); // solhint-disable-line
  }
  function removeProxy(address proxy) public onlyProxyManager {
    require(_globalProxies[proxy]);
    delete _globalProxies[proxy];
    emit ProxyRemoved(proxy, now); // solhint-disable-line
  }
  function addProxyForSender(address proxy, address sender) public proxyOrSender(sender) {
    require(!_senderProxies[sender][proxy]);
    _senderProxies[sender][proxy] = true;
    emit ProxyForSenderAdded(proxy, sender, now); // solhint-disable-line
  }
  function removeProxyForSender(address proxy, address sender) public proxyOrSender(sender) {
    require(_senderProxies[sender][proxy]);
    delete _senderProxies[sender][proxy];
    emit ProxyForSenderRemoved(proxy, sender, now); // solhint-disable-line
  }
}

contract BlindBidRegistryProxiable is BlindBidRegistry, Proxiable {
  function createBid(bytes32 hash, address _creator, uint256 _auction) public proxyOrSender(_creator) {
    super._createBid(hash, _creator, _auction);
  }
  function revealBid(
    bytes32 hash,
    address _creator,
    uint256 _auction,
    address _bidder,
    bytes32 _schema,
    bytes32 _licenseTerms,
    uint256 _durationSec,
    uint256 _bidPrice
  ) public proxyOrSender(_creator) {
    super._revealBid(
      hash,
      _creator,
      _auction,
      _bidder,
      _schema,
      _licenseTerms,
      _durationSec,
      _bidPrice
    );
  }
}

contract AuctionHouseBidRegistry is BlindBidRegistryProxiable {
  constructor(address auctionBiddingComponent) public {
    transferPrimary(auctionBiddingComponent);
  }
}

// imported contracts/proposals/OCP-IP-5/IAuctionHouse.sol
// imported contracts/proposals/OCP-IP-6/IOCPTokenReceiver.sol
// imported node_modules/@open-city-protocol/erc223/contracts/Receiver_Interface.sol
 /*
 * Contract that is working with ERC223 tokens
 */
contract ContractReceiver {
  function tokenFallback(address _from, uint256 _value, bytes _data) public;
}

contract IOCPTokenReceiver is ContractReceiver {
  modifier onlyOcpToken() {
    require(msg.sender == ocpTokenContract());
    _;
  }
  function ocpTokenContract() public view returns(address);
  function setOCPTokenContract(address ocpToken) public;
  // solhint-disable-next-line
  function tokenFallback(address, uint256, bytes) public onlyOcpToken {}
}

contract IAuctionHouse is IOCPTokenReceiver {
  event AuctionHouseCreated(uint256 updatedAtUtcSec);
  function currentAuctionId() public view returns(uint256);
  function biddingComponent() public view returns(address);
  function clearingPriceComponent() public view returns(address);
  function licenseTermsRegistry() public view returns(address);
  function schemaRegistry() public view returns(address);
  function setCurrentAuctionId(uint256 auctionId) public;
  function setBiddingComponent(address component) public;
  function setClearingPriceComponent(address component) public;
  function setLicenseTermsRegistry(address component) public;
  function setSchemaRegistry(address component) public;
  function setOCPTokenContract(address ocpTokenContract) public;
  function setBidRegistry(address bidRegistry) public;
  function setLicenseNFT(address licenseNFTContract) public;
  function setClearingPriceSubmissionDeposit(uint256 deposit) public;
  function setPercentAllocationFee(uint256 numerator, uint256 denominator) public;
  function payBid(address from, uint256 value, bytes data) public;
  function payDeposit(address submitter, uint256 value, bytes data) public;
  function allocateBid(address anyValidPriceClearingSubmitter, bytes32 bidHash) public;
  function claimReward(uint256 auctionId, address clearingPriceSubmitter) public;
  // solhint-disable-next-line
  function tokenFallback(address, uint256, bytes) public onlyOcpToken {
    revert();
  }
}

// imported contracts/proposals/OCP-IP-5/IAuctionHouseBiddingComponent.sol
contract IAuctionHouseBiddingComponent {
  event BidRegistered(address registeree, bytes32 bidHash, uint256 updatedAtUtcSec);
  function transferPrimary(address recipient) public;
  function bidRegistry() public view returns(address);
  function licenseNFT() public view returns(address);
  function bidDeposit(bytes32 bidHash) public view returns(uint256);
  function submissionOpen(uint256 auctionId) public view returns(bool);
  function revealOpen(uint256 auctionId) public view returns(bool);
  function allocationOpen(uint256 auctionId) public view returns(bool);
  function setBidRegistry(address registry) public;
  function setLicenseNFT(address licenseNFTContract) public;
  function setSubmissionOpen(uint256 auctionId) public;
  function setSubmissionClosed(uint256 auctionId) public;
  function payBid(bytes32 bidHash, uint256 value) public;
  function submitBid(address registeree, bytes32 bidHash) public;
  function setRevealOpen(uint256 auctionId) public;
  function setRevealClosed(uint256 auctionId) public;
  function revealBid(bytes32 bidHash) public;
  function setAllocationOpen(uint256 auctionId) public;
  function setAllocationClosed(uint256 auctionId) public;
  function allocateBid(bytes32 bidHash, uint clearingPrice) public;
  function doNotAllocateBid(bytes32 bidHash) public;
  function payBidAllocationFee(bytes32 bidHash, uint256 fee) public;
  function calcRefund(bytes32 bidHash) public view returns(uint256);
  function payRefund(bytes32 bidHash, uint256 refund) public;
  function issueLicenseNFT(bytes32 bidHash) public;
}

// imported contracts/proposals/OCP-IP-5/IAuctionHouseClearingPriceComponent.sol
contract IAuctionHouseClearingPriceComponent {
  event ClearingPriceSubmitted(
    address indexed submitter,
    uint256 indexed auctionId,
    bytes32 indexed bidHash,
    uint256 clearingPrice
  );
  event ClearingPriceRejected(
    address indexed rejector,
    address indexed submitter,
    uint256 indexed auctionId,
    bytes32 bidHash,
    uint256 correctedClearingPrice
  );
  event ClearingPriceSubmitterRejected(
    address indexed rejector,
    address indexed submitter,
    uint256 indexed auctionId,
    bytes32 bidHash,
    uint256 correctedClearingPrice
  );
  event ClearingPriceRewarded(
    address indexed submitter,
    uint256 indexed auctionId,
    uint256 reward
  );
  function transferPrimary(address recipient) public;
  function bidRegistry() public view returns(address);
  function clearingPriceCode() public view returns(bytes);
  function submissionDeposit() public view returns(uint256);
  function percentAllocationFeeNumerator() public view returns(uint256);
  function percentAllocationFeeDenominator() public view returns(uint256);
  function setBidRegistry(address registry) public;
  function setClearingPriceCode(bytes reference) public;
  function setSubmissionDeposit(uint256 deposit) public;
  function setPercentAllocationFee(uint256 numerator, uint256 denominator) public;
  function setSubmissionOpen(uint256 auctionId) public;
  function setSubmissionClosed(uint256 auctionId) public;
  function payDeposit(uint256 auctionId, address submitter, uint256 value) public;
  function submitClearingPrice(address submitter, bytes32 bidHash, uint256 clearingPrice) public;
  function setValidationOpen(uint256 auctionId) public;
  function setValidationClosed(uint256 auctionId) public;
  function rejectClearingPriceSubmission(
    address validator,
    address submitter,
    bytes32 bidHash,
    uint256 correctedClearingPrice
  ) public;
  function isSubmitterAccepted(uint256 auctionId, address submitter) public view returns(bool);
  function isValidSubmitter(address submitter, bytes32 bidHash) public view returns(bool);
  function hasClearingPrice(address anyValidSubmitter, bytes32 bidHash) public view returns(bool);
  function clearingPrice(address anyValidSubmitter, bytes32 bidHash) public view returns(uint256);
  function paidBidAllocationFee(bytes32 bidHash) public view returns(bool);
  function calcBidAllocationFee(bytes32 bidHash) public view returns(uint256);
  function payBidAllocationFee(bytes32 bidHash, uint256 fee) public;
  function setRewardOpen(uint256 auctionId) public;
  function setRewardClosed(uint256 auctionId) public;
  function rewarded(uint256 auctionId, address clearingPriceSubmitter) public view returns(bool);
  function calcReward(uint256 auctionId, address clearingPriceSubmitter) public view returns(uint256);
  function payReward(uint256 auctionId, address clearingPriceSubmitter, uint256 reward) public;
}

// imported contracts/proposals/OCP-IP-5/IAuctionHouseStateTransition.sol
contract IAuctionHouseStateTransition {
  enum AuctionState {
    Undetermined,
    AuctionCreated,
    BiddingSubmissionOpen,
    BiddingSubmissionClosed,
    BiddingRevealOpen,
    BiddingRevealClosed,
    ClearingPriceSubmissionOpen,
    ClearingPriceSubmissionClosed,
    ClearingPriceValidationOpen,
    ClearingPriceValidationClosed,
    BidAllocationOpen,
    BidAllocationClosed,
    RewardAllocationOpen,
    RewardAllocationClosed
  }
  event AuctionStateChange(
    uint256 indexed auctionId,
    AuctionState indexed state,
    uint256 updatedAtUtcSec
  );
  function auctionState(uint256 auctionId) public view returns(AuctionState);
  function transition(uint256 auctionId, AuctionState state) public;
}

// imported contracts/proposals/OCP-IP-6/OCPToken.sol
// imported node_modules/@open-city-protocol/erc223/contracts/ERC223_Token.sol
// imported node_modules/@open-city-protocol/erc223/contracts/ERC223_Interface.sol
 /* New ERC223 contract interface */
contract ERC223 {
  uint public totalSupply;
  function balanceOf(address who) public view returns (uint);
  function name() public view returns (string _name);
  function symbol() public view returns (string _symbol);
  function decimals() public view returns (uint8 _decimals);
  function totalSupply() public view returns (uint256 _supply);
  function transfer(address to, uint value) public returns (bool ok);
  function transfer(address to, uint value, bytes data) public returns (bool ok);
  function transfer(address to, uint value, bytes data, string custom_fallback) public returns (bool ok);
  // solhint-disable-next-line
  event Transfer(address indexed from, address indexed to, uint value, bytes indexed data);
}

 /**
 * ERC223 token by Dexaran
 *
 * https://github.com/Dexaran/ERC223-token-standard
 */
 /* https://github.com/LykkeCity/EthereumApiDotNetCore/blob/master/src/ContractBuilder/contracts/token/SafeMath.sol */
contract SafeMathERC223 {
  uint256 constant public MAX_UINT256 =
  0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
  function safeAdd(uint256 x, uint256 y) internal pure returns (uint256 z) {
    if (x > MAX_UINT256 - y) revert();
    return x + y;
  }
  function safeSub(uint256 x, uint256 y) internal pure returns (uint256 z) {
    if (x < y) revert();
    return x - y;
  }
  function safeMul(uint256 x, uint256 y) internal pure returns (uint256 z) {
    if (y == 0) return 0;
    if (x > MAX_UINT256 / y) revert();
    return x * y;
  }
}
contract ERC223Token is ERC223, SafeMathERC223 {
  mapping(address => uint) public balances;
  string public name;
  string public symbol;
  uint8 public decimals;
  uint256 public totalSupply;
  // Function to access name of token .
  function name() public view returns (string _name) {
    return name;
  }
  // Function to access symbol of token .
  function symbol() public view returns (string _symbol) {
    return symbol;
  }
  // Function to access decimals of token .
  function decimals() public view returns (uint8 _decimals) {
    return decimals;
  }
  // Function to access total supply of tokens .
  function totalSupply() public view returns (uint256 _totalSupply) {
    return totalSupply;
  }
  // Function that is called when a user or another contract wants to transfer funds .
  function transfer(address _to, uint _value, bytes _data, string _custom_fallback) public returns (bool success) {
    if (isContract(_to)) {
      return transferToContractCustom(msg.sender, _to, _value, _data, _custom_fallback);
    } else {
      return transferToAddress(msg.sender, _to, _value, _data);
    }
  }
  // Function that is called when a user or another contract wants to transfer funds .
  function transfer(address _to, uint _value, bytes _data) public returns (bool success) {
    if (isContract(_to)) {
      return transferToContract(msg.sender, _to, _value, _data);
    } else {
      return transferToAddress(msg.sender, _to, _value, _data);
    }
  }
  // Standard function transfer similar to ERC20 transfer with no _data .
  // Added due to backwards compatibility reasons .
  function transfer(address _to, uint _value) public returns (bool success) {
    //standard function transfer similar to ERC20 transfer with no _data
    //added due to backwards compatibility reasons
    bytes memory empty;
    if (isContract(_to)) {
      return transferToContract(msg.sender, _to, _value, empty);
    } else {
      return transferToAddress(msg.sender, _to, _value, empty);
    }
  }
  function balanceOf(address _owner) public view returns (uint balance) {
    return balances[_owner];
  }
  //assemble the given address bytecode. If bytecode exists then the _addr is a contract.
  function isContract(address _addr) internal view returns (bool is_contract) {
    uint length;
    assembly { // solhint-disable-line
          //retrieve the size of the code on target address, this needs assembly
          length := extcodesize(_addr)
    }
    return (length > 0);
  }
  //function that is called when transaction target is an address
  function transferToAddress(address _from, address _to, uint _value, bytes _data) internal returns (bool success) {
    if (balanceOf(_from) < _value) revert();
    balances[_from] = safeSub(balanceOf(_from), _value);
    balances[_to] = safeAdd(balanceOf(_to), _value);
    emit Transfer(_from, _to, _value, _data);
    return true;
  }
  //function that is called when transaction target is a contract
  function transferToContract(address _from, address _to, uint _value, bytes _data) internal returns (bool success) {
    if (balanceOf(_from) < _value) revert();
    balances[_from] = safeSub(balanceOf(_from), _value);
    balances[_to] = safeAdd(balanceOf(_to), _value);
    ContractReceiver receiver = ContractReceiver(_to);
    receiver.tokenFallback(_from, _value, _data);
    emit Transfer(_from, _to, _value, _data);
    return true;
  }
  //function that is called when transaction target is a contract
  function transferToContractCustom(address _from, address _to, uint _value, bytes _data, string _custom_fallback) internal returns (bool success) {
    if (balanceOf(_from) < _value) revert();
    balances[_from] = safeSub(balanceOf(_from), _value);
    balances[_to] = safeAdd(balanceOf(_to), _value);
    // solhint-disable-next-line
    assert(_to.call.value(0)(abi.encodeWithSignature(_custom_fallback, _from, _value, _data)));
    emit Transfer(_from, _to, _value, _data);
    return true;
  }
}

contract OCPToken is ERC223Token {
  constructor() public {
    name = "Open City Token";
    symbol = "OCT"; // todo: ensure unique symbol
    decimals = 18;
    totalSupply = 0xc9f2c9cd04674edea40000000; // 1 trillion coins
    balances[msg.sender] = totalSupply;
  }
}

// imported contracts/proposals/OCP-IP-6/OCPTokenReceiver.sol
contract OCPTokenReceiver is Secondary, IOCPTokenReceiver {
  address private _ocpTokenContract;
  function ocpTokenContract() public view returns(address) {
    return _ocpTokenContract;
  }
  function setOCPTokenContract(address ocpToken) public onlyPrimary {
    _setOCPTokenContract(ocpToken);
  }
  function _setOCPTokenContract(address ocpToken) internal {
    _ocpTokenContract = ocpToken;
  }
}

// imported contracts/proposals/OCP-IP-8/ILicenseTermsRegistry.sol
contract ILicenseTermsRegistry {
  event LicenseTermsAdded(bytes32 hash, uint256 updatedAtUtcSec);
  function hashTerms(string name, string definition) public pure returns(bytes32);
  function addTerms(string name, string definition) public;
  function hasLicenseTerms(bytes32 hash) public view returns(bool);
  function name(bytes32 hash) public view returns(string);
  function definition(bytes32 hash) public view returns(string);
}

// imported contracts/proposals/OCP-IP-9/ISchemaRegistry.sol
contract ISchemaRegistry {
  event SchemaAdded(bytes32 hash, uint256 updatedAtUtcSec);
  function hashSchema(string name, string definition) public pure returns(bytes32);
  function addSchema(string name, string definition) public;
  function hasSchema(bytes32 hash) public view returns(bool);
  function name(bytes32 hash) public view returns(string);
  function definition(bytes32 hash) public view returns(string);
}

contract AuctionHouse is AuctionManagerRole, IAuctionHouse, IAuctionHouseStateTransition, OCPTokenReceiver {
  AuctionHouseBidRegistry private _bidRegistry;
  IAuctionHouseBiddingComponent private _biddingComponent;
  IAuctionHouseClearingPriceComponent private _clearingPriceComponent;
  ILicenseTermsRegistry private _licenseTermsRegistry;
  ISchemaRegistry private _schemaRegistry;
  uint256 private _currentAuctionId;
  mapping(uint256 => AuctionState) private _state;
  constructor() public {
    setCurrentAuctionId(1);
    emit AuctionHouseCreated(now); // solhint-disable-line not-rely-on-time
  }
  function transferPrimary(address account) public onlyAuctionManager {
    _biddingComponent.transferPrimary(account);
    _clearingPriceComponent.transferPrimary(account);
  }
  function currentAuctionId() public view returns(uint256) {
    return _currentAuctionId;
  }
  function biddingComponent() public view returns(address) {
    return address(_biddingComponent);
  }
  function clearingPriceComponent() public view returns(address) {
    return address(_clearingPriceComponent);
  }
  function licenseTermsRegistry() public view returns(address) {
    return address(_licenseTermsRegistry);
  }
  function schemaRegistry() public view returns(address) {
    return address(_schemaRegistry);
  }
  function setCurrentAuctionId(uint256 auctionId) public onlyAuctionManager {
    _currentAuctionId = auctionId;
    if (_state[auctionId] == AuctionState.Undetermined) {
      transition(_currentAuctionId, AuctionState.AuctionCreated);
    }
  }
  function setBiddingComponent(address component) public onlyAuctionManager {
    _biddingComponent = IAuctionHouseBiddingComponent(component);
  }
  function setClearingPriceComponent(address component) public onlyAuctionManager {
    _clearingPriceComponent = IAuctionHouseClearingPriceComponent(component);
  }
  function setLicenseTermsRegistry(address component) public onlyAuctionManager {
    _licenseTermsRegistry = ILicenseTermsRegistry(component);
  }
  function setSchemaRegistry(address component) public onlyAuctionManager {
    _schemaRegistry = ISchemaRegistry(component);
  }
  function setOCPTokenContract(address ocpToken) public onlyAuctionManager {
    _setOCPTokenContract(ocpToken);
  }
  function setBidRegistry(address bidRegistry) public onlyAuctionManager {
    _bidRegistry = AuctionHouseBidRegistry(bidRegistry);
    _biddingComponent.setBidRegistry(bidRegistry);
    _clearingPriceComponent.setBidRegistry(bidRegistry);
  }
  function setLicenseNFT(address licenseNFTContract) public onlyAuctionManager {
    _biddingComponent.setLicenseNFT(licenseNFTContract);
  }
  function setClearingPriceSubmissionDeposit(uint256 deposit) public onlyAuctionManager {
    _clearingPriceComponent.setSubmissionDeposit(deposit);
  }
  function setPercentAllocationFee(uint256 numerator, uint256 denominator) public onlyAuctionManager {
    _clearingPriceComponent.setPercentAllocationFee(numerator, denominator);
  }
  function payBid(address, uint256 value, bytes data) public onlyOcpToken {
    require(data.length == 32);
    bytes32 bidHash;
    assembly { // solhint-disable-line
      bidHash := mload(add(data, 32))
    }
    _biddingComponent.payBid(bidHash, value);
  }
  function payDeposit(address submitter, uint256 value, bytes data) public onlyOcpToken {
    require(data.length == 32);
    uint256 auctionId;
    assembly { // solhint-disable-line
      auctionId := mload(add(data, 32))
    }
    _clearingPriceComponent.payDeposit(auctionId, submitter, value);
  }
  function allocateBid(address anyValidPriceClearingSubmitter, bytes32 bidHash) public {
    uint256 auctionId = _bidRegistry.auction(bidHash);
    require(_state[auctionId] == AuctionState.BidAllocationOpen);
    require(_clearingPriceComponent.isValidSubmitter(anyValidPriceClearingSubmitter, bidHash));
    if (_clearingPriceComponent.hasClearingPrice(anyValidPriceClearingSubmitter, bidHash)) {
      uint256 clearingPrice = _clearingPriceComponent.clearingPrice(
        anyValidPriceClearingSubmitter,
        bidHash
      );
      _biddingComponent.allocateBid(bidHash, clearingPrice);
    } else {
      _biddingComponent.doNotAllocateBid(bidHash);
    }
    _payBidAllocationFee(bidHash);
    _payRefund(bidHash);
    _biddingComponent.issueLicenseNFT(bidHash);
  }
  function claimReward(uint256 auctionId, address clearingPriceSubmitter) public {
    uint reward = _clearingPriceComponent.calcReward(auctionId, clearingPriceSubmitter);
    _clearingPriceComponent.payReward(auctionId, clearingPriceSubmitter, reward);
    ERC223 oct = ERC223(ocpTokenContract());
    oct.transfer(clearingPriceSubmitter, reward);
  }
  function auctionState(uint256 auctionId) public view returns(AuctionState) {
    return _state[auctionId];
  }
  function transition(uint256 auctionId, AuctionState state) public onlyAuctionManager {
    require(_state[auctionId] != state);
    _state[auctionId] = state;
    _transitionBiddingComponent(auctionId, state);
    _transitionClearingPriceComponent(auctionId, state);
    emit AuctionStateChange(auctionId, state, now); // solhint-disable-line not-rely-on-time
  }
  function _payBidAllocationFee(bytes32 bidHash) internal {
    uint256 fee = _clearingPriceComponent.calcBidAllocationFee(bidHash);
    _biddingComponent.payBidAllocationFee(bidHash, fee);
    _clearingPriceComponent.payBidAllocationFee(bidHash, fee);
  }
  function _payRefund(bytes32 bidHash) internal {
    uint256 refund = _biddingComponent.calcRefund(bidHash);
    _biddingComponent.payRefund(bidHash, refund);
    address bidder = _bidRegistry.bidder(bidHash);
    ERC223 oct = ERC223(ocpTokenContract());
    oct.transfer(bidder, refund);
  }
  function _transitionBiddingComponent(uint256 auctionId, AuctionState state) internal {
    if (state == AuctionState.BiddingSubmissionOpen) {
      _biddingComponent.setSubmissionOpen(auctionId);
    } else if (state == AuctionState.BiddingSubmissionClosed) {
      _biddingComponent.setSubmissionClosed(auctionId);
    } else if (state == AuctionState.BiddingRevealOpen) {
      _biddingComponent.setRevealOpen(auctionId);
    } else if (state == AuctionState.BiddingRevealClosed) {
      _biddingComponent.setRevealClosed(auctionId);
    } else if (state == AuctionState.BidAllocationOpen) {
      _biddingComponent.setAllocationOpen(auctionId);
    } else if (state == AuctionState.BidAllocationClosed) {
      _biddingComponent.setAllocationClosed(auctionId);
    }
  }
  function _transitionClearingPriceComponent(uint256 auctionId, AuctionState state) internal {
    if (state == AuctionState.ClearingPriceSubmissionOpen) {
      _clearingPriceComponent.setSubmissionOpen(auctionId);
    } else if (state == AuctionState.ClearingPriceSubmissionClosed) {
      _clearingPriceComponent.setSubmissionClosed(auctionId);
    } else if (state == AuctionState.ClearingPriceValidationOpen) {
      _clearingPriceComponent.setValidationOpen(auctionId);
    } else if (state == AuctionState.ClearingPriceValidationClosed) {
      _clearingPriceComponent.setValidationClosed(auctionId);
    } else if (state == AuctionState.RewardAllocationOpen) {
      _clearingPriceComponent.setRewardOpen(auctionId);
    } else if (state == AuctionState.RewardAllocationClosed) {
      _clearingPriceComponent.setRewardClosed(auctionId);
    }
  }
}

Contract ABI

[{"constant":false,"inputs":[{"name":"deposit","type":"uint256"}],"name":"setClearingPriceSubmissionDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"currentAuctionId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ocpTokenContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"auctionId","type":"uint256"}],"name":"setCurrentAuctionId","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"transferPrimary","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"schemaRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"biddingComponent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"licenseTermsRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"ocpToken","type":"address"}],"name":"setOCPTokenContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"licenseNFTContract","type":"address"}],"name":"setLicenseNFT","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isAuctionManager","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceAuctionManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"component","type":"address"}],"name":"setLicenseTermsRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"auctionId","type":"uint256"}],"name":"auctionState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"clearingPriceComponent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addAuctionManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bidRegistry","type":"address"}],"name":"setBidRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"anyValidPriceClearingSubmitter","type":"address"},{"name":"bidHash","type":"bytes32"}],"name":"allocateBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"submitter","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"payDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"component","type":"address"}],"name":"setSchemaRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"numerator","type":"uint256"},{"name":"denominator","type":"uint256"}],"name":"setPercentAllocationFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"primary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"component","type":"address"}],"name":"setClearingPriceComponent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"component","type":"address"}],"name":"setBiddingComponent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"auctionId","type":"uint256"},{"name":"clearingPriceSubmitter","type":"address"}],"name":"claimReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"auctionId","type":"uint256"},{"name":"state","type":"uint8"}],"name":"transition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"payBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"auctionId","type":"uint256"},{"indexed":true,"name":"state","type":"uint8"},{"indexed":false,"name":"updatedAtUtcSec","type":"uint256"}],"name":"AuctionStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"updatedAtUtcSec","type":"uint256"}],"name":"AuctionHouseCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"recipient","type":"address"}],"name":"PrimaryTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"AuctionManagerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"AuctionManagerRemoved","type":"event"}]

Contract Creation Code

60806040523480156200001157600080fd5b5062000036336000620001546401000000000262002244179091906401000000009004565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d9600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a162000117600162000217640100000000026401000000009004565b7fa79458509e6f513bf0b39462cad1b6aff6c39a51938e9703f80630f1481d19f7426040518082815260200191505060405180910390a162000e77565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156200019157600080fd5b620001ac8282620002a8640100000000026401000000009004565b151515620001b957600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b62000231336200033d640100000000026401000000009004565b15156200023d57600080fd5b806008819055506000600d8111156200025257fe5b6009600083815260200190815260200160002060009054906101000a900460ff16600d8111156200027f57fe5b1415620002a557620002a460085460016200036a640100000000026401000000009004565b5b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515620002e657600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600062000363826000620002a86401000000000262002101179091906401000000009004565b9050919050565b62000384336200033d640100000000026401000000009004565b15156200039057600080fd5b80600d8111156200039d57fe5b6009600084815260200190815260200160002060009054906101000a900460ff16600d811115620003ca57fe5b14151515620003d857600080fd5b806009600084815260200190815260200160002060006101000a81548160ff0219169083600d8111156200040857fe5b02179055506200042882826200048c640100000000026401000000009004565b62000443828262000982640100000000026401000000009004565b80600d8111156200045057fe5b827f40ed1ebe63eef268d391651b33af2b9926bf255540a739224501902f492a90d0426040518082815260200191505060405180910390a35050565b6002600d8111156200049a57fe5b81600d811115620004a757fe5b14156200055f57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2ee8be9836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b1580156200054057600080fd5b505af115801562000555573d6000803e3d6000fd5b505050506200097e565b6003600d8111156200056d57fe5b81600d8111156200057a57fe5b14156200063257600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639e3e230b836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b1580156200061357600080fd5b505af115801562000628573d6000803e3d6000fd5b505050506200097d565b6004600d8111156200064057fe5b81600d8111156200064d57fe5b14156200070557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635f7118c7836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015620006e657600080fd5b505af1158015620006fb573d6000803e3d6000fd5b505050506200097c565b6005600d8111156200071357fe5b81600d8111156200072057fe5b1415620007d857600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a7e60b6836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015620007b957600080fd5b505af1158015620007ce573d6000803e3d6000fd5b505050506200097b565b600a600d811115620007e657fe5b81600d811115620007f357fe5b1415620008ab57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c96322836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b1580156200088c57600080fd5b505af1158015620008a1573d6000803e3d6000fd5b505050506200097a565b600b600d811115620008b957fe5b81600d811115620008c657fe5b14156200097957600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166316962bc1836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b1580156200095f57600080fd5b505af115801562000974573d6000803e3d6000fd5b505050505b5b5b5b5b5b5050565b6006600d8111156200099057fe5b81600d8111156200099d57fe5b141562000a5557600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2ee8be9836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801562000a3657600080fd5b505af115801562000a4b573d6000803e3d6000fd5b5050505062000e73565b6007600d81111562000a6357fe5b81600d81111562000a7057fe5b141562000b2857600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639e3e230b836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801562000b0957600080fd5b505af115801562000b1e573d6000803e3d6000fd5b5050505062000e72565b6008600d81111562000b3657fe5b81600d81111562000b4357fe5b141562000bfb57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b63688d3836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801562000bdc57600080fd5b505af115801562000bf1573d6000803e3d6000fd5b5050505062000e71565b6009600d81111562000c0957fe5b81600d81111562000c1657fe5b141562000cce57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323d669db836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801562000caf57600080fd5b505af115801562000cc4573d6000803e3d6000fd5b5050505062000e70565b600c600d81111562000cdc57fe5b81600d81111562000ce957fe5b141562000da157600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360bfe04e836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801562000d8257600080fd5b505af115801562000d97573d6000803e3d6000fd5b5050505062000e6f565b600d8081111562000dae57fe5b81600d81111562000dbb57fe5b141562000e6e57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2df15d6836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801562000e5457600080fd5b505af115801562000e69573d6000803e3d6000fd5b505050505b5b5b5b5b5b5050565b61326c8062000e876000396000f30060806040526004361061016a576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630bab4d841461016f5780630c0b86ca1461019c5780631a82eeb4146101c757806322aaea911461021e5780632348238c1461024b5780634441bbd91461028e57806349f22b4a146102e557806350c0f2b91461033c57806354c916a1146103935780635fd030c0146103d65780636a2803171461041957806374715432146104745780637dbb82a81461048b57806384861e93146104ce578063864059ac1461051d5780639260931514610574578063956a2ea7146105b7578063957d8250146105fa578063ad00297a1461064b578063c051f75f146106de578063c0ee0b8a14610721578063c4b781a8146107b4578063c6dbdf61146107eb578063d89ea0f514610842578063e553379014610885578063e70eb392146108c8578063f1fc042714610915578063fce897e51461094f575b600080fd5b34801561017b57600080fd5b5061019a600480360381019080803590602001909291905050506109e2565b005b3480156101a857600080fd5b506101b1610aa2565b6040518082815260200191505060405180910390f35b3480156101d357600080fd5b506101dc610aac565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561022a57600080fd5b5061024960048036038101908080359060200190929190505050610ad6565b005b34801561025757600080fd5b5061028c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b41565b005b34801561029a57600080fd5b506102a3610d02565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102f157600080fd5b506102fa610d2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561034857600080fd5b50610351610d56565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039f57600080fd5b506103d4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d80565b005b3480156103e257600080fd5b50610417600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610da0565b005b34801561042557600080fd5b5061045a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e8c565b604051808215151515815260200191505060405180910390f35b34801561048057600080fd5b50610489610ea9565b005b34801561049757600080fd5b506104cc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ebf565b005b3480156104da57600080fd5b506104f960048036038101908080359060200190929190505050610f17565b6040518082600d81111561050957fe5b60ff16815260200191505060405180910390f35b34801561052957600080fd5b50610532610f41565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561058057600080fd5b506105b5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f6b565b005b3480156105c357600080fd5b506105f8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fd9565b005b34801561060657600080fd5b50610649600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291905050506111db565b005b34801561065757600080fd5b506106dc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061185c565b005b3480156106ea57600080fd5b5061071f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a1565b005b34801561072d57600080fd5b506107b2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506119f9565b005b3480156107c057600080fd5b506107e96004803603810190808035906020019092919080359060200190929190505050611a3f565b005b3480156107f757600080fd5b50610800611b08565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561084e57600080fd5b50610883600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b32565b005b34801561089157600080fd5b506108c6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b8a565b005b3480156108d457600080fd5b5061091360048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611be2565b005b34801561092157600080fd5b5061094d60048036038101908080359060200190929190803560ff169060200190929190505050611ebb565b005b34801561095b57600080fd5b506109e0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611fa4565b005b6109eb33610e8c565b15156109f657600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166332f72e39826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015610a8757600080fd5b505af1158015610a9b573d6000803e3d6000fd5b5050505050565b6000600854905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610adf33610e8c565b1515610aea57600080fd5b806008819055506000600d811115610afe57fe5b6009600083815260200190815260200160002060009054906101000a900460ff16600d811115610b2a57fe5b1415610b3e57610b3d6008546001611ebb565b5b50565b610b4a33610e8c565b1515610b5557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632348238c826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015610c1257600080fd5b505af1158015610c26573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632348238c826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015610ce757600080fd5b505af1158015610cfb573d6000803e3d6000fd5b5050505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610d8933610e8c565b1515610d9457600080fd5b610d9d816120bd565b50565b610da933610e8c565b1515610db457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd030c0826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015610e7157600080fd5b505af1158015610e85573d6000803e3d6000fd5b5050505050565b6000610ea282600061210190919063ffffffff16565b9050919050565b610ebd33600061219590919063ffffffff16565b565b610ec833610e8c565b1515610ed357600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006009600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f7433610e8c565b1515610f7f57600080fd5b610f9381600061224490919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcada9d9f5a63d5ea982f9ef16f003bac9e7adf66cba02a4a9e138c4d944c1d9260405160405180910390a250565b610fe233610e8c565b1515610fed57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663956a2ea7826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663956a2ea7826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156111c057600080fd5b505af11580156111d4573d6000803e3d6000fd5b5050505050565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663715ede94846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050506040513d60208110156112a157600080fd5b81019080805190602001909291905050509150600a600d8111156112c157fe5b6009600084815260200190815260200160002060009054906101000a900460ff16600d8111156112ed57fe5b1415156112f957600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166363ebb3cf85856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001826000191660001916815260200192505050602060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b505050506040513d60208110156113f057600080fd5b8101908080519060200190929190505050151561140c57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd6a9abb85856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001826000191660001916815260200192505050602060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b505050506040513d602081101561150357600080fd5b8101908080519060200190929190505050156116e157600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d8590f9385856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001826000191660001916815260200192505050602060405180830381600087803b1580156115e657600080fd5b505af11580156115fa573d6000803e3d6000fd5b505050506040513d602081101561161057600080fd5b81019080805190602001909291905050509050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630611ae4a84836040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b50505050611793565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166354adb7b1846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050600060405180830381600087803b15801561177a57600080fd5b505af115801561178e573d6000803e3d6000fd5b505050505b61179c836122f4565b6117a583612542565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636749ec48846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050600060405180830381600087803b15801561183e57600080fd5b505af1158015611852573d6000803e3d6000fd5b5050505050505050565b6000611866610aac565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561189f57600080fd5b602082511415156118af57600080fd5b60208201519050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c727980a8286866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561198357600080fd5b505af1158015611997573d6000803e3d6000fd5b5050505050505050565b6119aa33610e8c565b15156119b557600080fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a01610aac565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a3a57600080fd5b600080fd5b611a4833610e8c565b1515611a5357600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4b781a883836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182815260200192505050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b3b33610e8c565b1515611b4657600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b9333610e8c565b1515611b9e57600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385461f6985856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015611caa57600080fd5b505af1158015611cbe573d6000803e3d6000fd5b505050506040513d6020811015611cd457600080fd5b81019080805190602001909291905050509150600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166380a92b678585856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015611db457600080fd5b505af1158015611dc8573d6000803e3d6000fd5b50505050611dd4610aac565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611e7957600080fd5b505af1158015611e8d573d6000803e3d6000fd5b505050506040513d6020811015611ea357600080fd5b81019080805190602001909291905050505050505050565b611ec433610e8c565b1515611ecf57600080fd5b80600d811115611edb57fe5b6009600084815260200190815260200160002060009054906101000a900460ff16600d811115611f0757fe5b14151515611f1457600080fd5b806009600084815260200190815260200160002060006101000a81548160ff0219169083600d811115611f4357fe5b0217905550611f52828261289b565b611f5c8282612d6e565b80600d811115611f6857fe5b827f40ed1ebe63eef268d391651b33af2b9926bf255540a739224501902f492a90d0426040518082815260200191505060405180910390a35050565b6000611fae610aac565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fe757600080fd5b60208251141515611ff757600080fd5b60208201519050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f26193982856040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b15801561209f57600080fd5b505af11580156120b3573d6000803e3d6000fd5b5050505050505050565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561213e57600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121d157600080fd5b6121db8282612101565b15156121e657600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561228057600080fd5b61228a8282612101565b15151561229657600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166373c90b43836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561238f57600080fd5b505af11580156123a3573d6000803e3d6000fd5b505050506040513d60208110156123b957600080fd5b81019080805190602001909291905050509050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a536ae3883836040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b15801561246d57600080fd5b505af1158015612481573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a536ae3883836040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b15801561252657600080fd5b505af115801561253a573d6000803e3d6000fd5b505050505050565b6000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663612867c2856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156125e057600080fd5b505af11580156125f4573d6000803e3d6000fd5b505050506040513d602081101561260a57600080fd5b81019080805190602001909291905050509250600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166362f0329085856040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156126be57600080fd5b505af11580156126d2573d6000803e3d6000fd5b50505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e90acd53856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561276f57600080fd5b505af1158015612783573d6000803e3d6000fd5b505050506040513d602081101561279957600080fd5b810190808051906020019092919050505091506127b4610aac565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561285957600080fd5b505af115801561286d573d6000803e3d6000fd5b505050506040513d602081101561288357600080fd5b81019080805190602001909291905050505050505050565b6002600d8111156128a857fe5b81600d8111156128b457fe5b141561296857600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2ee8be9836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561294b57600080fd5b505af115801561295f573d6000803e3d6000fd5b50505050612d6a565b6003600d81111561297557fe5b81600d81111561298157fe5b1415612a3557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639e3e230b836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015612a1857600080fd5b505af1158015612a2c573d6000803e3d6000fd5b50505050612d69565b6004600d811115612a4257fe5b81600d811115612a4e57fe5b1415612b0257600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635f7118c7836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015612ae557600080fd5b505af1158015612af9573d6000803e3d6000fd5b50505050612d68565b6005600d811115612b0f57fe5b81600d811115612b1b57fe5b1415612bcf57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a7e60b6836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015612bb257600080fd5b505af1158015612bc6573d6000803e3d6000fd5b50505050612d67565b600a600d811115612bdc57fe5b81600d811115612be857fe5b1415612c9c57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c96322836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015612c7f57600080fd5b505af1158015612c93573d6000803e3d6000fd5b50505050612d66565b600b600d811115612ca957fe5b81600d811115612cb557fe5b1415612d6557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166316962bc1836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015612d4c57600080fd5b505af1158015612d60573d6000803e3d6000fd5b505050505b5b5b5b5b5b5050565b6006600d811115612d7b57fe5b81600d811115612d8757fe5b1415612e3b57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2ee8be9836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015612e1e57600080fd5b505af1158015612e32573d6000803e3d6000fd5b5050505061323c565b6007600d811115612e4857fe5b81600d811115612e5457fe5b1415612f0857600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639e3e230b836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015612eeb57600080fd5b505af1158015612eff573d6000803e3d6000fd5b5050505061323b565b6008600d811115612f1557fe5b81600d811115612f2157fe5b1415612fd557600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b63688d3836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015612fb857600080fd5b505af1158015612fcc573d6000803e3d6000fd5b5050505061323a565b6009600d811115612fe257fe5b81600d811115612fee57fe5b14156130a257600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323d669db836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561308557600080fd5b505af1158015613099573d6000803e3d6000fd5b50505050613239565b600c600d8111156130af57fe5b81600d8111156130bb57fe5b141561316f57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360bfe04e836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561315257600080fd5b505af1158015613166573d6000803e3d6000fd5b50505050613238565b600d8081111561317b57fe5b81600d81111561318757fe5b141561323757600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2df15d6836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561321e57600080fd5b505af1158015613232573d6000803e3d6000fd5b505050505b5b5b5b5b5b50505600a165627a7a723058201095758f8d71d65ac27c52847b8503f86502500c3da25c7d8c636135132c15480029

Swarm Source

bzzr://1095758f8d71d65ac27c52847b8503f86502500c3da25c7d8c636135132c1548
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward