OP Sepolia Testnet

Contract

0x5Da4b2A07da92b26Cc64eE308a9A1A4E7D5c9544

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Conclude Round174767652024-09-19 14:27:5078 days ago1726756070IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0000416449990.00010026
Open Commitment174767562024-09-19 14:27:3278 days ago1726756052IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003357588430.00010026
Open Commitment174767502024-09-19 14:27:2078 days ago1726756040IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003493425940.00010026
Open Commitment174767442024-09-19 14:27:0878 days ago1726756028IN
0x5Da4b2A0...E7D5c9544
0 ETH0.000349276520.00095057
Submit Commitmen...174767342024-09-19 14:26:4878 days ago1726756008IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003389194210.00095057
Submit Commitmen...174767282024-09-19 14:26:3678 days ago1726755996IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003256587390.00097026
Submit Commitmen...174767192024-09-19 14:26:1878 days ago1726755978IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003256329010.00097996
Conclude Round174766962024-09-19 14:25:3278 days ago1726755932IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0000468595020.00097026
Open Commitment174766882024-09-19 14:25:1678 days ago1726755916IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003225894190.00097026
Open Commitment174766822024-09-19 14:25:0478 days ago1726755904IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003629434320.00097026
Open Commitment174766762024-09-19 14:24:5278 days ago1726755892IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0004236370580.00097026
Submit Commitmen...174766632024-09-19 14:24:2678 days ago1726755866IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003956679680.00097026
Submit Commitmen...174766562024-09-19 14:24:1278 days ago1726755852IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003956556690.00097026
Submit Commitmen...174766442024-09-19 14:23:4878 days ago1726755828IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003956846270.00097026
Conclude Round174766082024-09-19 14:22:3678 days ago1726755756IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0000569517350.00097026
Open Commitment174765982024-09-19 14:22:1678 days ago1726755736IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0004767656090.00097026
Open Commitment174765562024-09-19 14:20:5278 days ago1726755652IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0004583534040.00097996
Open Commitment174765482024-09-19 14:20:3678 days ago1726755636IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0004950874810.00097996
Submit Commitmen...174765052024-09-19 14:19:1078 days ago1726755550IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0003657644530.00097996
Submit Commitmen...174764992024-09-19 14:18:5878 days ago1726755538IN
0x5Da4b2A0...E7D5c9544
0 ETH0.000379712660.00097996
Submit Commitmen...174764822024-09-19 14:18:2478 days ago1726755504IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0004271290860.00097996
Start Game174764602024-09-19 14:17:4078 days ago1726755460IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0000638518380.00097996
Join Game174764462024-09-19 14:17:1278 days ago1726755432IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0000590703830.00097996
Join Game174764332024-09-19 14:16:4678 days ago1726755406IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0000525332930.00097996
Join Game174764292024-09-19 14:16:3878 days ago1726755398IN
0x5Da4b2A0...E7D5c9544
0 ETH0.0000505035890.00097996
View all transactions

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GuessingGame

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 7 : GuessingGame.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IGuessingGame} from "./interfaces/IGuessingGame.sol";
import {ICommitmentVerifier} from "./interfaces/ICommitmentVerifier.sol";
import {IOpeningVerifier} from "./interfaces/IOpeningVerifier.sol";
import {MIN_NUM, MAX_NUM, MIN_PLAYERS_TO_START, ROUNDS_TO_WIN} from "./base/Constants.sol";
// import "hardhat/console.sol";

contract GuessingGame is IGuessingGame, Ownable {
  ICommitmentVerifier public commitmentVerifier;
  IOpeningVerifier public openingVerifier;

  // Storing all the game info. Refer to the interface to see the game struct
  Game[] public games;
  uint32 public nextGameId = 0;

  // Constructor
  // @param cVerAddress: commitment verifier address
  constructor(ICommitmentVerifier cVerAddr, IOpeningVerifier oVerAddr) Ownable(msg.sender) {
    // Initialization happens here
    commitmentVerifier = cVerAddr;
    openingVerifier = oVerAddr;
  }

  // Modifiers declaration
  modifier validGameId(uint32 gameId) {
    if (gameId >= nextGameId) {
      revert GuessingGame__InvalidGameId();
    }
    _;
  }

  modifier nonEndState(uint32 gameId) {
    Game storage game = games[gameId];
    if (game.state == GameState.GameEnd) {
      revert GuessingGame__GameHasEnded();
    }
    _;
  }

  modifier oneOfPlayers(uint32 gameId) {
    Game storage game = games[gameId];
    bool found = false;
    for (uint8 i = 0; i < game.players.length; ++i) {
      if (game.players[i] == msg.sender) {
        found = true;
        break;
      }
    }
    if (!found) {
      revert GuessingGame__NotOneOfPlayers();
    }
    _;
  }

  modifier gameStateEq(uint32 gameId, GameState gs) {
    Game storage game = games[gameId];
    if (game.state != gs) {
      revert GuessingGame__UnexpectedGameState(gs, game.state);
    }
    _;
  }

  modifier byGameHost(uint32 gameId) {
    Game storage game = games[gameId];
    address host = game.players[0];
    if (host != msg.sender) {
      revert GuessingGame__NotGameHost(gameId, msg.sender);
    }
    _;
  }

  /**
   * View functions
   **/

  function getGame(uint32 gameId) public view validGameId(gameId) returns (GameView memory) {
    Game storage game = games[gameId];

    return
      GameView({
        players: game.players,
        currentRound: game.currentRound,
        roundWinners: game.roundWinners,
        state: game.state,
        winner: game.winner,
        startTime: game.startTime,
        lastUpdate: game.lastUpdate,
        endTime: game.endTime
      });
  }

  function getGameHost(uint32 gameId) public view validGameId(gameId) returns (address) {
    Game storage game = games[gameId];
    return game.players[0];
  }

  function getPlayerCommitment(
    uint32 gameId,
    uint8 round,
    address player
  ) public view validGameId(gameId) returns (Commitment memory) {
    Game storage game = games[gameId];
    return game.commitments[round][player];
  }

  function getPlayerOpening(
    uint32 gameId,
    uint8 round,
    address player
  ) public view validGameId(gameId) returns (uint16) {
    Game storage game = games[gameId];
    return game.openings[round][player];
  }

  /**
   * Internal helper functions
   **/

  function _updateGameState(
    uint32 gameId,
    GameState state
  ) internal validGameId(gameId) nonEndState(gameId) {
    Game storage game = games[gameId];
    game.state = state;

    // Dealing with time recording
    game.lastUpdate = block.timestamp;
    if (state == GameState.GameEnd) {
      game.endTime = game.lastUpdate;
    }

    emit GameStateUpdated(gameId, state);
  }

  function _diff(uint64 a, uint64 b) internal pure returns (uint64) {
    if (a >= b) {
      return a - b;
    }
    return b - a;
  }

  /**
   * Main functions
   **/

  function newGame() external override returns (uint32 gameId) {
    Game storage game = games.push();
    game.players.push(msg.sender);
    game.state = GameState.GameInitiated;
    game.startTime = block.timestamp;
    game.lastUpdate = block.timestamp;

    gameId = nextGameId++;
    emit NewGame(gameId, msg.sender);
  }

  function joinGame(
    uint32 gameId
  ) external override validGameId(gameId) gameStateEq(gameId, GameState.GameInitiated) {
    Game storage game = games[gameId];
    // check the player has not been added to the game
    for (uint8 i = 0; i < game.players.length; ++i) {
      if (game.players[i] == msg.sender) {
        revert GuessingGame__PlayerAlreadyJoin(msg.sender);
      }
    }

    game.players.push(msg.sender);
    _updateGameState(gameId, GameState.GameInitiated);
    emit PlayerJoinGame(gameId, msg.sender);
  }

  function startGame(
    uint32 gameId
  )
    external
    override
    validGameId(gameId)
    byGameHost(gameId)
    gameStateEq(gameId, GameState.GameInitiated)
  {
    Game storage game = games[gameId];
    // Need at least three players for a game
    // 1 player: no game
    // 2 players: both player tie
    if (game.players.length < MIN_PLAYERS_TO_START) {
      revert GuessingGame__NotEnoughPlayers(gameId);
    }

    _updateGameState(gameId, GameState.RoundCommit);
    emit GameStarted(gameId);
  }

  function submitCommitment(
    uint32 gameId,
    uint256[24] calldata proof,
    uint256[2] calldata pubSignals
  )
    external
    override
    validGameId(gameId)
    oneOfPlayers(gameId)
    gameStateEq(gameId, GameState.RoundCommit)
  {
    // each player submit a bid. The last player that submit a bid will change the game state
    Game storage game = games[gameId];
    uint8 round = game.currentRound;

    // Verify the commitment
    try commitmentVerifier.verifyProof(proof, pubSignals) returns (bool result) {
      if (!result) {
        revert GuessingGame__InvalidCommitmentProof(gameId, round, msg.sender);
      }
    } catch {
      revert GuessingGame__InvalidCommitmentProof(gameId, round, msg.sender);
    }

    game.commitments[round][msg.sender] = Commitment(pubSignals[0], pubSignals[1]);
    emit CommitmentSubmitted(gameId, round, msg.sender);

    // If all players have submitted bid, update game state
    bool notYetCommitted = false;
    for (uint i = 0; i < game.players.length; ++i) {
      address p = game.players[i];
      if (game.commitments[round][p].nullifier == 0) {
        notYetCommitted = true;
        break;
      }
    }

    if (!notYetCommitted) {
      _updateGameState(gameId, GameState.RoundOpen);
    }
  }

  function openCommitment(
    uint32 gameId,
    uint256[24] calldata proof,
    uint256[4] calldata pubSignals
  )
    external
    override
    validGameId(gameId)
    oneOfPlayers(gameId)
    gameStateEq(gameId, GameState.RoundOpen)
  {
    Game storage game = games[gameId];
    uint8 round = game.currentRound;

    // First, check the 1st two pubSignals the same as the commitment
    Commitment storage pc = game.commitments[round][msg.sender];
    if (pc.submission != pubSignals[0] || pc.nullifier != pubSignals[1]) {
      revert GuessingGame__UnmatchedCommitment(gameId, round, msg.sender);
    }

    // Then, check if it pass the zk verifier
    try openingVerifier.verifyProof(proof, pubSignals) returns (bool result) {
      if (!result) {
        revert GuessingGame__InvalidOpeningProof(gameId, round, msg.sender);
      }
    } catch {
      revert GuessingGame__InvalidOpeningProof(gameId, round, msg.sender);
    }

    // Save the openings and emit an event
    game.openings[round][msg.sender] = uint16(pubSignals[2]);
    emit CommitmentOpened(gameId, round, msg.sender);

    // If all players have submitted revelation, update game state
    bool notYetOpen = false;
    for (uint i = 0; i < game.players.length; ++i) {
      address p = game.players[i];
      if (game.openings[round][p] == 0) {
        notYetOpen = true;
        break;
      }
    }

    if (!notYetOpen) {
      _updateGameState(gameId, GameState.RoundEnd);
    }
  }

  function concludeRound(
    uint32 gameId
  )
    external
    override
    validGameId(gameId)
    byGameHost(gameId)
    gameStateEq(gameId, GameState.RoundEnd)
  {
    Game storage game = games[gameId];
    uint64 playerCnt = uint64(game.players.length);
    uint8 round = game.currentRound;

    // Assumption: all openings have been submitted successfully.
    // We will multiply all value by 1000 to minimize the fraction rounding error at division

    // Calculate out the mean of all openings
    uint64 sum = 0;
    for (uint64 i = 0; i < game.players.length; i++) {
      address p = game.players[i];
      sum += uint64(game.openings[round][p]) * 1000;
    }
    uint64 average = uint64(sum / playerCnt);

    // Finding the winner
    // When two openings have the same distance from the average, the round is draw.
    address minPlayer = game.players[0];
    uint64 minDiff = _diff(uint64(game.openings[round][minPlayer]) * 1000, average);

    bool draw = false;
    for (uint64 i = 1; i < game.players.length; i++) {
      address p = game.players[i];
      uint64 diff = _diff(uint64(game.openings[round][p]) * 1000, average);
      if (diff == minDiff) {
        draw = true;
      } else if (diff < minDiff) {
        minDiff = diff;
        minPlayer = p;
        draw = false;
      }
    }

    // Save the round winner on-chain and announce the winner
    if (draw) {
      emit RoundDraw(gameId, round);
    } else {
      game.roundWinners.push(minPlayer);
      emit RoundWinner(gameId, round, minPlayer, game.openings[round][minPlayer]);
    }

    uint8 roundsWon = 0;
    for (uint8 i = 0; i < game.roundWinners.length; ++i) {
      if (game.roundWinners[i] == minPlayer) ++roundsWon;
    }

    // update the game.state or end the game
    if (roundsWon == ROUNDS_TO_WIN) {
      game.winner = minPlayer;
      emit GameWinner(gameId, minPlayer);
      _updateGameState(gameId, GameState.GameEnd);
    } else {
      game.currentRound += 1;
      _updateGameState(gameId, GameState.RoundCommit);
    }
  }
}

File 2 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 4 of 7 : Constants.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

uint16 constant MIN_NUM = 1;
uint16 constant MAX_NUM = 100;
uint16 constant MIN_PLAYERS_TO_START = 3;
uint8 constant ROUNDS_TO_WIN = 3;

File 5 of 7 : ICommitmentVerifier.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface ICommitmentVerifier {
  function verifyProof(
    uint256[24] calldata _proof,
    uint256[2] calldata _pubSignals
  ) external view returns (bool);
}

File 6 of 7 : IGuessingGame.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface IGuessingGame {
  struct Commitment {
    uint256 submission;
    uint256 nullifier;
  }

  struct Game {
    GameState state;
    // game players. The first player is the game host
    address[] players;
    uint8 currentRound;
    address[] roundWinners;
    // player bid list
    mapping(uint8 => mapping(address => Commitment)) commitments;
    mapping(uint8 => mapping(address => uint16)) openings;
    address winner;
    uint256 startTime;
    uint256 lastUpdate;
    uint256 endTime;
  }

  struct GameView {
    address[] players;
    uint8 currentRound;
    address[] roundWinners;
    GameState state;
    address winner;
    uint256 startTime;
    uint256 lastUpdate;
    uint256 endTime;
  }

  // game state
  enum GameState {
    GameInitiated,
    RoundCommit,
    RoundOpen,
    RoundEnd,
    GameEnd
  }

  // Error declaration
  error GuessingGame__InvalidGameId();
  error GuessingGame__NotEnoughPlayers(uint32 gameId);
  error GuessingGame__GameHasEnded();
  error GuessingGame__UnexpectedGameState(GameState expected, GameState actual);
  error GuessingGame__PlayerAlreadyJoin(address p);
  error GuessingGame__NotGameHost(uint32 gameId, address addr);
  error GuessingGame__InvalidCommitmentProof(uint32 gameId, uint8 round, address addr);
  error GuessingGame__UnmatchedCommitment(uint32 gameId, uint8 round, address addr);
  error GuessingGame__InvalidOpeningProof(uint32 gameId, uint8 round, address addr);
  error GuessingGame__NotOneOfPlayers();

  // Emitted Events
  event NewGame(uint32 indexed gameId, address indexed sender);
  event PlayerJoinGame(uint32 indexed gameId, address indexed sender);
  event GameStarted(uint32 gameId);
  event GameStateUpdated(uint32 gameId, GameState state);
  event CommitmentSubmitted(uint32 gameId, uint8 round, address sender);
  event CommitmentOpened(uint32 gameId, uint8 round, address sender);
  event RoundWinner(uint32 gameId, uint8 round, address winner, uint16 bid);
  event RoundDraw(uint32 gameId, uint8 round);
  event GameWinner(uint32 gameId, address winner);

  // External Functions
  function newGame() external returns (uint32 gameId);
  function joinGame(uint32 gameId) external;
  function startGame(uint32 gameId) external;
  function submitCommitment(
    uint32 gameId,
    uint256[24] calldata _proof,
    uint256[2] calldata _pubSignals
  ) external;
  function openCommitment(
    uint32 gameId,
    uint256[24] calldata _proof,
    uint256[4] calldata _pubSignals
  ) external;
  function concludeRound(uint32 gameId) external;
}

File 7 of 7 : IOpeningVerifier.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface IOpeningVerifier {
  function verifyProof(
    uint256[24] calldata _proof,
    uint256[4] calldata _pubSignals
  ) external view returns (bool);
}

Settings
{
  "viaIR": true,
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"contract ICommitmentVerifier","name":"cVerAddr","type":"address"},{"internalType":"contract IOpeningVerifier","name":"oVerAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"GuessingGame__GameHasEnded","type":"error"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"},{"internalType":"uint8","name":"round","type":"uint8"},{"internalType":"address","name":"addr","type":"address"}],"name":"GuessingGame__InvalidCommitmentProof","type":"error"},{"inputs":[],"name":"GuessingGame__InvalidGameId","type":"error"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"},{"internalType":"uint8","name":"round","type":"uint8"},{"internalType":"address","name":"addr","type":"address"}],"name":"GuessingGame__InvalidOpeningProof","type":"error"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"}],"name":"GuessingGame__NotEnoughPlayers","type":"error"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"},{"internalType":"address","name":"addr","type":"address"}],"name":"GuessingGame__NotGameHost","type":"error"},{"inputs":[],"name":"GuessingGame__NotOneOfPlayers","type":"error"},{"inputs":[{"internalType":"address","name":"p","type":"address"}],"name":"GuessingGame__PlayerAlreadyJoin","type":"error"},{"inputs":[{"internalType":"enum IGuessingGame.GameState","name":"expected","type":"uint8"},{"internalType":"enum IGuessingGame.GameState","name":"actual","type":"uint8"}],"name":"GuessingGame__UnexpectedGameState","type":"error"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"},{"internalType":"uint8","name":"round","type":"uint8"},{"internalType":"address","name":"addr","type":"address"}],"name":"GuessingGame__UnmatchedCommitment","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"gameId","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"round","type":"uint8"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"CommitmentOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"gameId","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"round","type":"uint8"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"CommitmentSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"gameId","type":"uint32"}],"name":"GameStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"gameId","type":"uint32"},{"indexed":false,"internalType":"enum IGuessingGame.GameState","name":"state","type":"uint8"}],"name":"GameStateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"gameId","type":"uint32"},{"indexed":false,"internalType":"address","name":"winner","type":"address"}],"name":"GameWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"gameId","type":"uint32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"NewGame","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"gameId","type":"uint32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"PlayerJoinGame","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"gameId","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"round","type":"uint8"}],"name":"RoundDraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"gameId","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"round","type":"uint8"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint16","name":"bid","type":"uint16"}],"name":"RoundWinner","type":"event"},{"inputs":[],"name":"commitmentVerifier","outputs":[{"internalType":"contract ICommitmentVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"}],"name":"concludeRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"games","outputs":[{"internalType":"enum IGuessingGame.GameState","name":"state","type":"uint8"},{"internalType":"uint8","name":"currentRound","type":"uint8"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"lastUpdate","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"}],"name":"getGame","outputs":[{"components":[{"internalType":"address[]","name":"players","type":"address[]"},{"internalType":"uint8","name":"currentRound","type":"uint8"},{"internalType":"address[]","name":"roundWinners","type":"address[]"},{"internalType":"enum IGuessingGame.GameState","name":"state","type":"uint8"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"lastUpdate","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"internalType":"struct IGuessingGame.GameView","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"}],"name":"getGameHost","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"},{"internalType":"uint8","name":"round","type":"uint8"},{"internalType":"address","name":"player","type":"address"}],"name":"getPlayerCommitment","outputs":[{"components":[{"internalType":"uint256","name":"submission","type":"uint256"},{"internalType":"uint256","name":"nullifier","type":"uint256"}],"internalType":"struct IGuessingGame.Commitment","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"},{"internalType":"uint8","name":"round","type":"uint8"},{"internalType":"address","name":"player","type":"address"}],"name":"getPlayerOpening","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"}],"name":"joinGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"newGame","outputs":[{"internalType":"uint32","name":"gameId","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextGameId","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"},{"internalType":"uint256[24]","name":"proof","type":"uint256[24]"},{"internalType":"uint256[4]","name":"pubSignals","type":"uint256[4]"}],"name":"openCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openingVerifier","outputs":[{"internalType":"contract IOpeningVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"}],"name":"startGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"gameId","type":"uint32"},{"internalType":"uint256[24]","name":"proof","type":"uint256[24]"},{"internalType":"uint256[2]","name":"pubSignals","type":"uint256[2]"}],"name":"submitCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523462000038576200001f620000186200016d565b90620002d8565b620000296200003e565b613365620004bf823961336590f35b62000044565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b90620000759062000049565b810190811060018060401b038211176200008e57604052565b62000053565b90620000ab620000a36200003e565b928362000069565b565b600080fd5b60018060a01b031690565b620000c890620000b2565b90565b620000d690620000bd565b90565b620000e481620000cb565b03620000ec57565b600080fd5b905051906200010082620000d9565b565b6200010d90620000bd565b90565b6200011b8162000102565b036200012357565b600080fd5b90505190620001378262000110565b565b91906040838203126200016757806200015a620001649260008601620000f1565b9360200162000128565b90565b620000ad565b620001906200382480380380620001848162000094565b92833981019062000139565b9091565b60001b90565b90620001ab63ffffffff9162000194565b9181191691161790565b90565b63ffffffff1690565b90565b620001dd620001d7620001e392620001b5565b620001c1565b620001b8565b90565b90565b9062000203620001fd6200020b92620001c4565b620001e6565b82546200019a565b9055565b906200022260018060a01b039162000194565b9181191691161790565b620002456200023f6200024b92620000b2565b620001c1565b620000b2565b90565b62000259906200022c565b90565b62000267906200024e565b90565b90565b9062000287620002816200028f926200025c565b6200026a565b82546200020f565b9055565b6200029e906200022c565b90565b620002ac9062000293565b90565b90565b90620002cc620002c6620002d492620002a1565b620002af565b82546200020f565b9055565b90620003036200030b92620002ed3362000364565b620002fb60006004620001e9565b60016200026d565b6002620002b2565b565b62000326620003206200032c92620001b5565b620001c1565b620000b2565b90565b6200033a906200030d565b90565b6200034890620000bd565b9052565b919062000362906000602085019401906200033d565b565b80620003866200037f6200037960006200032f565b620000bd565b91620000bd565b146200039957620003979062000451565b565b620003ca620003a960006200032f565b620003b36200003e565b918291631e4fbdf760e01b8352600483016200034c565b0390fd5b60001c90565b60018060a01b031690565b620003ee620003f491620003ce565b620003d4565b90565b620004039054620003df565b90565b62000411906200022c565b90565b6200041f9062000406565b90565b90565b906200043f62000439620004479262000414565b62000422565b82546200020f565b9055565b60000190565b6200045d6000620003f7565b6200046a82600062000425565b90620004a26200049b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000414565b9162000414565b91620004ad6200003e565b80620004b9816200044b565b0390a356fe60806040526004361015610013575b610c6f565b61001e60003561012d565b8063117a5b90146101285780632915724f1461012357806347b9c8bb1461011e5780635d682cee14610119578063715018a6146101145780637d03f5f31461010f578063812f0fb01461010a57806389f45339146101055780638da5cb5b146101005780639335f348146100fb578063b135bbb0146100f6578063b6f69086146100f1578063c6e89258146100ec578063d17d0d63146100e7578063d8958f17146100e2578063dfd70c75146100dd5763f2fde38b0361000e57610c3c565b610be7565b610b76565b610ad1565b610a9c565b6109cd565b610946565b6108cd565b6107eb565b6107a2565b61076d565b6105d1565b61057b565b610537565b610498565b610465565b6103d7565b60e01c90565b60405190565b600080fd5b600080fd5b90565b61014f81610143565b0361015657565b600080fd5b9050359061016882610146565b565b90602082820312610184576101819160000161015b565b90565b61013e565b634e487b7160e01b600052603260045260246000fd5b5490565b600052602060002090565b6101b78161019f565b8210156101d2576101c9600a916101a3565b91020190600090565b610189565b60001c90565b60ff1690565b6101ef6101f4916101d7565b6101dd565b90565b61020190546101e3565b90565b60ff1690565b61021661021b916101d7565b610204565b90565b610228905461020a565b90565b60018060a01b031690565b610242610247916101d7565b61022b565b90565b6102549054610236565b90565b90565b61026661026b916101d7565b610257565b90565b610278905461025a565b90565b6003906102878261019f565b8110156102e857610297916101ae565b50906102a5600083016101f7565b916102b26002820161021e565b916102bf6006830161024a565b916102cc6007820161026e565b916102e560096102de6008850161026e565b930161026e565b90565b600080fd5b634e487b7160e01b600052602160045260246000fd5b6005111561030d57565b6102ed565b9061031c82610303565b565b61032790610312565b90565b6103339061031e565b9052565b60ff1690565b61034690610337565b9052565b60018060a01b031690565b61035e9061034a565b90565b61036a90610355565b9052565b61037790610143565b9052565b91946103c46103ce929897956103ba60a0966103b06103d59a6103a660c08a019e60008b019061032a565b602089019061033d565b6040870190610361565b606085019061036e565b608083019061036e565b019061036e565b565b3461040e5761040a6103f26103ed36600461016a565b61027b565b92610401969496929192610133565b9687968761037b565b0390f35b610139565b63ffffffff1690565b61042581610413565b0361042c57565b600080fd5b9050359061043e8261041c565b565b9060208282031261045a5761045791600001610431565b90565b61013e565b60000190565b346104935761047d610478366004610440565b61106b565b610485610133565b8061048f8161045f565b0390f35b610139565b346104c6576104b06104ab366004610440565b61194d565b6104b8610133565b806104c28161045f565b0390f35b610139565b600080fd5b919060206018028301116104e057565b6104cb565b919060206004028301116104f557565b6104cb565b90916103a0828403126105325761052f6105178460008501610431565b9361052581602086016104d0565b93610320016104e5565b90565b61013e565b346105665761055061054a3660046104fa565b916120a3565b610558610133565b806105628161045f565b0390f35b610139565b600091031261057657565b61013e565b346105a95761058b36600461056b565b6105936120fe565b61059b610133565b806105a58161045f565b0390f35b610139565b6105b790610413565b9052565b91906105cf906000602085019401906105ae565b565b34610601576105e136600461056b565b6105fd6105ec61225a565b6105f4610133565b918291826105bb565b0390f35b610139565b5190565b60209181520190565b60200190565b61062290610355565b9052565b9061063381602093610619565b0190565b60200190565b9061065a61065461064d84610606565b809361060a565b92610613565b9060005b81811061066b5750505090565b90919261068461067e6001928651610626565b94610637565b910191909161065e565b61069790610337565b9052565b6106a49061031e565b9052565b6106b190610143565b9052565b906107519060e0806106fe6106da61010085016000880151868203600088015261063d565b6106ec6020880151602087019061068e565b6040870151858203604087015261063d565b946107116060820151606086019061069b565b61072360808201516080860190610619565b61073560a082015160a08601906106a8565b61074760c082015160c08601906106a8565b01519101906106a8565b90565b61076a91602082019160008184039101526106b5565b90565b3461079d57610799610788610783366004610440565b61261c565b610790610133565b91829182610754565b0390f35b610139565b346107d0576107ba6107b5366004610440565b612861565b6107c2610133565b806107cc8161045f565b0390f35b610139565b91906107e990600060208501940190610361565b565b3461081b576107fb36600461056b565b610817610806612871565b61080e610133565b918291826107d5565b0390f35b610139565b61082981610337565b0361083057565b600080fd5b9050359061084282610820565b565b61084d81610355565b0361085457565b600080fd5b9050359061086682610844565b565b909160608284031261089e5761089b6108848460008501610431565b936108928160208601610835565b93604001610859565b90565b61013e565b61ffff1690565b6108b3906108a3565b9052565b91906108cb906000602085019401906108aa565b565b346108fe576108fa6108e96108e3366004610868565b91612916565b6108f1610133565b918291826108b7565b0390f35b610139565b1c90565b63ffffffff1690565b6109209060086109259302610903565b610907565b90565b906109339154610910565b90565b6109436004600090610928565b90565b346109765761095636600461056b565b610972610961610936565b610969610133565b918291826105bb565b0390f35b610139565b9190602060020283011161098b57565b6104cb565b9091610360828403126109c8576109c56109ad8460008501610431565b936109bb81602086016104d0565b936103200161097b565b90565b61013e565b346109fc576109e66109e0366004610990565b91612e33565b6109ee610133565b806109f88161045f565b0390f35b610139565b60018060a01b031690565b610a1c906008610a219302610903565b610a01565b90565b90610a2f9154610a0c565b90565b610a3f6001600090610a24565b90565b90565b610a59610a54610a5e9261034a565b610a42565b61034a565b90565b610a6a90610a45565b90565b610a7690610a61565b90565b610a8290610a6d565b9052565b9190610a9a90600060208501940190610a79565b565b34610acc57610aac36600461056b565b610ac8610ab7610a32565b610abf610133565b91829182610a86565b0390f35b610139565b34610b0157610afd610aec610ae7366004610440565b612ec2565b610af4610133565b918291826107d5565b0390f35b610139565b60018060a01b031690565b610b21906008610b269302610903565b610b06565b90565b90610b349154610b11565b90565b610b446002600090610b29565b90565b610b5090610a61565b90565b610b5c90610b47565b9052565b9190610b7490600060208501940190610b53565b565b34610ba657610b8636600461056b565b610ba2610b91610b37565b610b99610133565b91829182610b60565b0390f35b610139565b90602080610bcf93610bc5600082015160008601906106a8565b01519101906106a8565b565b9190610be590600060408501940190610bab565b565b34610c1857610c14610c03610bfd366004610868565b91612fe5565b610c0b610133565b91829182610bd1565b0390f35b610139565b90602082820312610c3757610c3491600001610859565b90565b61013e565b34610c6a57610c54610c4f366004610c1d565b613069565b610c5c610133565b80610c668161045f565b0390f35b610139565b600080fd5b610c80610c85916101d7565b610907565b90565b610c929054610c74565b90565b80610cb1610cab610ca66004610c88565b610413565b91610413565b1015610cc257610cc090610d0c565b565b610cca610133565b630e5ea16760e41b815280610ce16004820161045f565b0390fd5b90565b916020610d0a929493610d036040820196600083019061032a565b019061032a565b565b80610d23610d1d60009260036101ae565b50610ce5565b90610d30600083016101f7565b610d42610d3c83610312565b91610312565b03610d54575050610d5290610f52565b565b6000610d619192016101f7565b90610d82610d6d610133565b928392628c577560e41b845260048401610ce8565b0390fd5b90565b610d9d610d98610da292610d86565b610a42565b610337565b90565b634e487b7160e01b600052601160045260246000fd5b610dc490610337565b60ff8114610dd25760010190565b610da5565b5490565b610def610dea610df492610337565b610a42565b610143565b90565b600052602060002090565b610e0b81610dd7565b821015610e2657610e1d600191610df7565b91020190600090565b610189565b610e3b906008610e409302610903565b61022b565b90565b90610e4e9154610e2b565b90565b90565b634e487b7160e01b600052604160045260246000fd5b600052602060002090565b5490565b610e8281610e75565b821015610e9d57610e94600191610e6a565b91020190600090565b610189565b1b90565b91906008610ec6910291610ec060018060a01b0384610ea2565b92610ea2565b9181191691161790565b610ed990610a61565b90565b90565b9190610ef5610ef0610efd93610ed0565b610edc565b908354610ea6565b9055565b9081549168010000000000000000831015610f315782610f29916001610f2f95018155610e79565b90610edf565b565b610e54565b610f4a610f45610f4f92610413565b610a42565b610413565b90565b90610f68610f62600384906101ae565b50610ce5565b90610f736000610d89565b5b80610f92610f8c610f8760018701610dd7565b610143565b91610ddb565b1015610ffa57610faf610fa9600185018390610e02565b90610e43565b610fc1610fbb33610355565b91610355565b14610fd457610fcf90610dbb565b610f74565b610ff633610fe0610133565b91829163729ca8e760e11b8352600483016107d5565b0390fd5b50919061100c60016110139201610e51565b3390610f01565b61101f816000906131f4565b3361105361104d7f0376ec1451fb8d69bd1557f9ea553b81ba8052dfbea4c7aa3c0160c43ccf2fcd93610f36565b91610ed0565b9161105c610133565b806110668161045f565b0390a3565b61107490610c95565b565b8061109261108c6110876004610c88565b610413565b91610413565b10156110a3576110a1906110ea565b565b6110ab610133565b630e5ea16760e41b8152806110c26004820161045f565b0390fd5b9160206110e89294936110e1604082019660008301906105ae565b0190610361565b565b806111176111116001611108611102600386906101ae565b50610ce5565b01600090610e02565b90610e43565b61112961112333610355565b91610355565b0361113a575061113890611161565b565b339061115d611147610133565b9283926352f3537f60e01b8452600484016110c6565b0390fd5b8061117861117260039260036101ae565b50610ce5565b90611185600083016101f7565b61119761119183610312565b91610312565b036111a95750506111a790611502565b565b60006111b69192016101f7565b906111d76111c2610133565b928392628c577560e41b845260048401610ce8565b0390fd5b67ffffffffffffffff1690565b6111fc6111f761120192610143565b610a42565b6111db565b90565b61121861121361121d92610d86565b610a42565b6111db565b90565b611229906111db565b67ffffffffffffffff811461123e5760010190565b610da5565b61125761125261125c926111db565b610a42565b610143565b90565b61127361126e61127892610337565b610a42565b610337565b90565b906112859061125f565b600052602052604060002090565b9061129d90610ed0565b600052602052604060002090565b61ffff1690565b6112be6112c3916101d7565b6112ab565b90565b6112d090546112b2565b90565b6112e76112e26112ec926108a3565b610a42565b6111db565b90565b90565b61130661130161130b926112ef565b610a42565b6111db565b90565b61131a611320916111db565b916111db565b029061132b826111db565b91820361133457565b610da5565b61134561134b916111db565b916111db565b019067ffffffffffffffff821161135e57565b610da5565b634e487b7160e01b600052601260045260246000fd5b61138561138b916111db565b916111db565b908115611396570490565b611363565b90565b6113b26113ad6113b79261139b565b610a42565b6111db565b90565b6113f06113f7946113e66060949897956113dc608086019a60008701906105ae565b602085019061033d565b6040830190610361565b01906108aa565b565b91602061141b929493611414604082019660008301906105ae565b019061033d565b565b90565b61143461142f6114399261141d565b610a42565b610337565b90565b6114466003611420565b90565b61145d6114586114629261139b565b610a42565b610337565b90565b61147161147791610337565b91610337565b019060ff821161148357565b610da5565b60001b90565b9061149a60ff91611488565b9181191691161790565b90565b906114bc6114b76114c39261125f565b6114a4565b825461148e565b9055565b906114d860018060a01b0391611488565b9181191691161790565b906114f76114f26114fe92610ed0565b610edc565b82546114c7565b9055565b611517611511600383906101ae565b50610ce5565b61152b61152660018301610dd7565b6111e8565b916115386002830161021e565b906115436000611204565b9461154e6000611204565b955b8661156e61156861156360018901610dd7565b610143565b91611243565b10156115dd576115d16115d7916115cb6115ba6115b56115b061159d6115978e60018e01610e02565b90610e43565b6115ab60058d018c9061127b565b611293565b6112c6565b6112d3565b6115c56103e86112f2565b9061130e565b90611339565b96611220565b95611550565b6115eb929591939650611379565b936116046115fe60018501600090610e02565b90610e43565b9361164b61164461163361162e61162961162260058a01889061127b565b8a90611293565b6112c6565b6112d3565b61163e6103e86112f2565b9061130e565b8790613230565b92600095611659600161139e565b965b8761167961167361166e60018b01610dd7565b610143565b91611243565b101561174857866116dd6116d66116c56116c06116bb6116b460058f6116a56116ab9160018b01610e02565b90610e43565b97018c9061127b565b8690611293565b6112c6565b6112d3565b6116d06103e86112f2565b9061130e565b8b90613230565b806116f06116ea8a6111db565b916111db565b1460001461170d575050506117076001975b611220565b9661165b565b8099929961172361171d8a6111db565b916111db565b10611734575b505061170790611702565b925095509650936117076000979038611729565b92965093509395506000146118d65783907fd91d09e1ae5d9e92ba174c808658c9834ff0c5affe15d59f47ff48c2739997a89161178f611786610133565b928392836113f9565b0390a15b61179d6000610d89565b916117a86000610d89565b5b806117c76117c16117bc60038a01610dd7565b610143565b91610ddb565b101561181f576117e46117de600388018390610e02565b90610e43565b6117f66117f085610355565b91610355565b1461180a575b61180590610dbb565b6117a9565b9261181761180591610dbb565b9390506117fc565b5093929161183c61183661183161143c565b610337565b91610337565b1460001461189b576118556118989360068391016114e2565b81907f42a6ea4a404209acf2556b8a45d50b968bc0d9323540042586ba912a30c5d7369161188d611884610133565b928392836110c6565b0390a16004906131f4565b5b565b506118c96118d1926118c360026118b26001611449565b9201916118be8361021e565b611465565b906114a7565b6001906131f4565b611899565b6118ec6118e560038701610e51565b8390610f01565b83819061194561191261190d611906879660058c0161127b565b8790611293565b6112c6565b7f24c05ed18a5f698a764dcd3504f1c43fc1e6e385a4e88d90e6e4712781e021e69461193c610133565b948594856113ba565b0390a1611793565b61195690611076565b565b91908261197661197061196b6004610c88565b610413565b91610413565b101561198757611985926119af565b565b61198f610133565b630e5ea16760e41b8152806119a66004820161045f565b0390fd5b151590565b90916119c56119bf8360036101ae565b50610ce5565b926000936119d36000610d89565b5b806119f26119ec6119e760018601610dd7565b610143565b91610ddb565b1015611a7857611a0f611a09600184018390610e02565b90610e43565b611a21611a1b33610355565b91610355565b14611a3457611a2f90610dbb565b6119d4565b505090919250611a4660015b156119aa565b611a5557611a5392611a86565b565b611a5d610133565b63a242193d60e01b815280611a746004820161045f565b0390fd5b5050909192611a4690611a40565b92919083611aa0611a9a60029660036101ae565b50610ce5565b94611aad600087016101f7565b611abf611ab983610312565b91610312565b03611ad25750611ad0939450611d64565b565b611ade600087016101f7565b90611aff611aea610133565b928392628c577560e41b845260048401610ce8565b0390fd5b90611b0d9061125f565b600052602052604060002090565b90611b2590610ed0565b600052602052604060002090565b90565b906004811015611b47576020020190565b610189565b611b60611b5b611b6592610d86565b610a42565b610143565b90565b35611b7281610146565b90565b611b89611b84611b8e9261139b565b610a42565b610143565b90565b604090611bbb611bc29496959396611bb1606084019860008501906105ae565b602083019061033d565b0190610361565b565b611bd0611bd5916101d7565b610b06565b90565b611be29054611bc4565b90565b601f801991011690565b90611bf990611be5565b810190811067ffffffffffffffff821117611c1357604052565b610e54565b60e01b90565b611c27816119aa565b03611c2e57565b600080fd5b90505190611c4082611c1e565b565b90602082820312611c5c57611c5991600001611c33565b90565b61013e565b9037565b611c729161030091611c61565b565b611c8091608091611c61565b565b91610300611ca6929493611c9f6103808201966000830190611c65565b0190611c74565b565b90565b611cbf611cba611cc492611ca8565b610a42565b610143565b90565b611cdb611cd6611ce092610143565b610a42565b6108a3565b90565b90611cf061ffff91611488565b9181191691161790565b611d0e611d09611d13926108a3565b610a42565b6108a3565b90565b90565b90611d2e611d29611d3592611cfa565b611d16565b8254611ce3565b9055565b6001611d459101610143565b90565b611d5c611d57611d6192610d86565b610a42565b6108a3565b90565b9091611d7b611d75600384906101ae565b50610ce5565b90611d886002830161021e565b93611da9611da4611d9d600486018890611b03565b3390611b1b565b611b33565b611db56000820161026e565b611de2611ddc611dd7611dd287611dcc6000611b4c565b90611b36565b611b68565b610143565b91610143565b1415908115612061575b50612038576020611e05611e006002611bd8565b610b47565b636183f6b49290611e288594611e33611e1c610133565b96879586948594611c18565b845260048401611c82565b03915afa8091600092612008575b5015600014611fc057506001611f9857611e79611e74611e6f611e96935b611e696002611cab565b90611b36565b611b68565b611cc7565b611e91611e8a60058501879061127b565b3390611293565b611d19565b81833391611ed07f8091531c95e42cbd103ed41c7b1f94540748b6acf3187990fbd8e9c9af44ea4493611ec7610133565b93849384611b91565b0390a1600092611ee06000611b4c565b5b80611eff611ef9611ef460018701610dd7565b610143565b91610143565b1015611f8b57611f3a611f35611f22611f1c600187018590610e02565b90610e43565b611f3060058701869061127b565b611293565b6112c6565b611f4d611f476000611d48565b916108a3565b14611f6057611f5b90611d39565b611ee1565b5050509050611f7160015b156119aa565b611f79575b50565b611f85906003906131f4565b38611f76565b50505090611f7190611f6b565b5050611fbc33611fa6610133565b938493631c75226560e11b855260048501611b91565b0390fd5b611fca90156119aa565b611fe057611e79611e74611e6f611e9693611e5f565b505061200433611fee610133565b938493631c75226560e11b855260048501611b91565b0390fd5b61202a91925060203d8111612031575b6120228183611bef565b810190611c42565b9038611e41565b503d612018565b50505061205d33612047610133565b93849363ffd646e160e01b855260048501611b91565b0390fd5b61206e915060010161026e565b61209b61209561209061208b866120856001611b75565b90611b36565b611b68565b610143565b91610143565b141538611dec565b906120ae9291611958565b565b6120b861326c565b6120c06120ea565b565b6120d66120d16120db92610d86565b610a42565b61034a565b90565b6120e7906120c2565b90565b6120fc6120f760006120de565b6132c1565b565b6121066120b0565b565b600090565b90565b5490565b600052602060002090565b61212881612110565b8210156121435761213a600a91612114565b91020190600090565b610189565b61215181612110565b68010000000000000000811015612175576121719160018201815561211f565b9091565b610e54565b61218390610312565b90565b90565b9061219e6121996121a59261217a565b612186565b825461148e565b9055565b906121b660001991611488565b9181191691161790565b6121d46121cf6121d992610143565b610a42565b610143565b90565b90565b906121f46121ef6121fb926121c0565b6121dc565b82546121a9565b9055565b61220890610413565b63ffffffff81146122195760010190565b610da5565b9061222d63ffffffff91611488565b9181191691161790565b90565b9061224f61224a61225692610f36565b612237565b825461221e565b9055565b612262612108565b506122bb61228161227b612276600361210d565b612148565b50610ce5565b61229761229060018301610e51565b3390610f01565b6122a46000808301612189565b6122b142600783016121df565b60084291016121df565b6122c56004610c88565b6122d86122d1826121ff565b600461223a565b90813361230e6123087f4d02ce21c9b87cd569227bcf4c505c9c57c55b19697fcd04316a57d69ed52a0193610f36565b91610ed0565b91612317610133565b806123218161045f565b0390a3565b90612339612332610133565b9283611bef565b565b612346610100612326565b90565b606090565b600090565b600090565b600090565b600090565b61236a61233b565b906020808080808080808961237d612349565b81520161238861234e565b815201612393612349565b81520161239e612353565b8152016123a9612358565b8152016123b461235d565b8152016123bf61235d565b8152016123ca61235d565b81525050565b6123d8612362565b90565b90806123f86123f26123ed6004610c88565b610413565b91610413565b101561240a576124079161251c565b90565b612412610133565b630e5ea16760e41b8152806124296004820161045f565b0390fd5b612438610100612326565b90565b6124459054610236565b90565b60010190565b9061246b61246561245e84610dd7565b809361060a565b92610df7565b9060005b81811061247c5750505090565b90919261249c6124966001926124918761243b565b610626565b94612448565b910191909161246f565b906124b09161244e565b90565b906124d36124cc926124c3610133565b938480926124a6565b0383611bef565b565b6124de906124b3565b90565b52565b906124ee90610337565b9052565b906124fc90610312565b9052565b9061250a90610355565b9052565b9061251890610143565b9052565b50600390612529916101ae565b5061253390610ce5565b8060010190806002016125459061021e565b908060030181600001612557906101f7565b826006016125649061024a565b90836007016125729061026e565b92846008016125809061026e565b9460090161258d9061026e565b9561259661242d565b976125a0906124d5565b60008901906125ae916124e1565b60208801906125bc916124e4565b6125c5906124d5565b60408701906125d3916124e1565b60608601906125e1916124f2565b60808501906125ef91612500565b60a08401906125fd9161250e565b60c083019061260b9161250e565b60e08201906126199161250e565b90565b61262d906126286123d0565b6123db565b90565b8061264c6126466126416004610c88565b610413565b91610413565b101561265d5761265b90612680565b565b612665610133565b630e5ea16760e41b81528061267c6004820161045f565b0390fd5b806126ad6126a7600161269e612698600386906101ae565b50610ce5565b01600090610e02565b90610e43565b6126bf6126b933610355565b91610355565b036126d057506126ce906126f7565b565b33906126f36126dd610133565b9283926352f3537f60e01b8452600484016110c6565b0390fd5b8061270e61270860009260036101ae565b50610ce5565b9061271b600083016101f7565b61272d61272783610312565b91610312565b0361273f57505061273d906127b6565b565b600061274c9192016101f7565b9061276d612758610133565b928392628c577560e41b845260048401610ce8565b0390fd5b61278561278061278a9261141d565b610a42565b6108a3565b90565b6127976003612771565b90565b6127ae6127a96127b3926108a3565b610a42565b610143565b90565b6127d660016127d06127ca600385906101ae565b50610ce5565b01610dd7565b6127ef6127e96127e461278d565b61279a565b91610143565b1061283b57612800816001906131f4565b6128367fe6aebc56b3bafc90ff9fcf8f838e304f2b308c7b3cc63fde56fb1806a03968fe9161282d610133565b918291826105bb565b0390a1565b61285d90612847610133565b9182916376293c1d60e01b8352600483016105bb565b0390fd5b61286a90612630565b565b600090565b61287961286c565b50612884600061024a565b90565b600090565b929190806128ab6128a56128a06004610c88565b610413565b91610413565b10156128bd576128ba936128e0565b90565b6128c5610133565b630e5ea16760e41b8152806128dc6004820161045f565b0390fd5b61290e9260056129036128fd6129139795612909955060036101ae565b50610ce5565b0161127b565b611293565b6112c6565b90565b906129299291612924612887565b61288c565b90565b91908261294a61294461293f6004610c88565b610413565b91610413565b101561295b576129599261297e565b565b612963610133565b630e5ea16760e41b81528061297a6004820161045f565b0390fd5b909161299461298e8360036101ae565b50610ce5565b926000936129a26000610d89565b5b806129c16129bb6129b660018601610dd7565b610143565b91610ddb565b1015612a47576129de6129d8600184018390610e02565b90610e43565b6129f06129ea33610355565b91610355565b14612a03576129fe90610dbb565b6129a3565b505090919250612a1560015b156119aa565b612a2457612a2292612a55565b565b612a2c610133565b63a242193d60e01b815280612a436004820161045f565b0390fd5b5050909192612a1590612a0f565b92919083612a6f612a6960019660036101ae565b50610ce5565b94612a7c600087016101f7565b612a8e612a8883610312565b91610312565b03612aa15750612a9f939450612b98565b565b612aad600087016101f7565b90612ace612ab9610133565b928392628c577560e41b845260048401610ce8565b0390fd5b612ade612ae3916101d7565b610a01565b90565b612af09054612ad2565b90565b612aff91604091611c61565b565b91610300612b25929493612b1e6103408201966000830190611c65565b0190612af3565b565b906002811015612b38576020020190565b610189565b612b476040612326565b90565b612b549051610143565b90565b90612b8460206001612b8a94612b7c60008201612b7660008801612b4a565b906121df565b019201612b4a565b906121df565b565b90612b9691612b57565b565b9091612baf612ba9600384906101ae565b50610ce5565b90612bbc6002830161021e565b936020612bd1612bcc6001612ae6565b610a6d565b63c0e9d81c9290612bf48594612bff612be8610133565b96879586948594611c18565b845260048401612b01565b03915afa8091600092612e03575b5015600014612dc457506001612d9c57612c98905b612c7b612c5d612c58612c47612c4285612c3c6000611b4c565b90612b27565b611b68565b93612c526001611b75565b90612b27565b611b68565b612c72612c68612b3d565b936000850161250e565b6020830161250e565b612c93612c8c600485018790611b03565b3390611b1b565b612b8c565b81833391612cd27f2a2e685f4b35ad9685bb75094db1851f4d30e370bc4a4c32d1103a9626fed5a593612cc9610133565b93849384611b91565b0390a1600092612ce26000611b4c565b5b80612d01612cfb612cf660018701610dd7565b610143565b91610143565b1015612d8f57612d3e6001612d38612d25612d1f8388018690610e02565b90610e43565b612d33600488018790611b03565b611b1b565b0161026e565b612d51612d4b6000611b4c565b91610143565b14612d6457612d5f90611d39565b612ce3565b5050509050612d7560015b156119aa565b612d7d575b50565b612d89906002906131f4565b38612d7a565b50505090612d7590612d6f565b5050612dc033612daa610133565b938493630ff25d5d60e11b855260048501611b91565b0390fd5b612dce90156119aa565b612ddb57612c9890612c22565b5050612dff33612de9610133565b938493630ff25d5d60e11b855260048501611b91565b0390fd5b612e2591925060203d8111612e2c575b612e1d8183611bef565b810190611c42565b9038612c0d565b503d612e13565b90612e3e929161292c565b565b9080612e5d612e57612e526004610c88565b610413565b91610413565b1015612e6f57612e6c91612e92565b90565b612e77610133565b630e5ea16760e41b815280612e8e6004820161045f565b0390fd5b6001612eb0612eaa612ebf94612eb9945060036101ae565b50610ce5565b01600090610e02565b90610e43565b90565b612ed390612ece61286c565b612e40565b90565b612ee06040612326565b90565b612eeb612ed6565b9060208083612ef861235d565b815201612f0361235d565b81525050565b612f11612ee3565b90565b92919080612f33612f2d612f286004610c88565b610413565b91610413565b1015612f4557612f4293612faf565b90565b612f4d610133565b630e5ea16760e41b815280612f646004820161045f565b0390fd5b90612fa1612f986001612f79612ed6565b94612f92612f896000830161026e565b6000880161250e565b0161026e565b6020840161250e565b565b612fac90612f68565b90565b612fdd926004612fd2612fcc612fe29795612fd8955060036101ae565b50610ce5565b01611b03565b611b1b565b612fa3565b90565b90612ff89291612ff3612f09565b612f14565b90565b61300c9061300761326c565b61300e565b565b8061302a61302461301f60006120de565b610355565b91610355565b1461303a57613038906132c1565b565b61306561304760006120de565b61304f610133565b918291631e4fbdf760e01b8352600483016107d5565b0390fd5b61307290612ffb565b565b908161309161308b6130866004610c88565b610413565b91610413565b10156130a2576130a0916130c5565b565b6130aa610133565b630e5ea16760e41b8152806130c16004820161045f565b0390fd5b906130e560006130df6130d98560036101ae565b50610ce5565b016101f7565b6130f86130f26004610312565b91610312565b14613108576131069161314f565b565b613110610133565b637934aa7b60e01b8152806131276004820161045f565b0390fd5b91602061314d929493613146604082019660008301906105ae565b019061032a565b565b61316461315e600383906101ae565b50610ce5565b6131718360008301612189565b61317e42600883016121df565b8261319261318c6004610312565b91610312565b146131d5575b50907f256ace825f57d7b5916c17edd2ef1b56760a9754eb5a14ea1a15dd7adf890c47916131d06131c7610133565b9283928361312b565b0390a1565b8060096131e760086131ee940161026e565b91016121df565b38613198565b906131fe91613074565b565b600090565b613211613217916111db565b916111db565b90039067ffffffffffffffff821161322b57565b610da5565b90613239613200565b508161324d613247836111db565b916111db565b1015613260579061325d91613205565b90565b61326991613205565b90565b613274612871565b61328d613287613282613322565b610355565b91610355565b0361329457565b6132bd61329f613322565b6132a7610133565b91829163118cdaa760e01b8352600483016107d5565b0390fd5b6132cb600061024a565b6132d68260006114e2565b9061330a6133047f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610ed0565b91610ed0565b91613313610133565b8061331d8161045f565b0390a3565b61332a61286c565b50339056fea2646970667358221220053736d40f7afa7d9eba2565f5e81982d8c3b48526e26a0680956815f20bc44c64736f6c6343000817003300000000000000000000000097bc1d08465f70039dda8fe22bdedf110d2bd8a50000000000000000000000003044e5d78e1a2eb3c3189a3fc52c0846ed1f3f7d

Deployed Bytecode

0x60806040526004361015610013575b610c6f565b61001e60003561012d565b8063117a5b90146101285780632915724f1461012357806347b9c8bb1461011e5780635d682cee14610119578063715018a6146101145780637d03f5f31461010f578063812f0fb01461010a57806389f45339146101055780638da5cb5b146101005780639335f348146100fb578063b135bbb0146100f6578063b6f69086146100f1578063c6e89258146100ec578063d17d0d63146100e7578063d8958f17146100e2578063dfd70c75146100dd5763f2fde38b0361000e57610c3c565b610be7565b610b76565b610ad1565b610a9c565b6109cd565b610946565b6108cd565b6107eb565b6107a2565b61076d565b6105d1565b61057b565b610537565b610498565b610465565b6103d7565b60e01c90565b60405190565b600080fd5b600080fd5b90565b61014f81610143565b0361015657565b600080fd5b9050359061016882610146565b565b90602082820312610184576101819160000161015b565b90565b61013e565b634e487b7160e01b600052603260045260246000fd5b5490565b600052602060002090565b6101b78161019f565b8210156101d2576101c9600a916101a3565b91020190600090565b610189565b60001c90565b60ff1690565b6101ef6101f4916101d7565b6101dd565b90565b61020190546101e3565b90565b60ff1690565b61021661021b916101d7565b610204565b90565b610228905461020a565b90565b60018060a01b031690565b610242610247916101d7565b61022b565b90565b6102549054610236565b90565b90565b61026661026b916101d7565b610257565b90565b610278905461025a565b90565b6003906102878261019f565b8110156102e857610297916101ae565b50906102a5600083016101f7565b916102b26002820161021e565b916102bf6006830161024a565b916102cc6007820161026e565b916102e560096102de6008850161026e565b930161026e565b90565b600080fd5b634e487b7160e01b600052602160045260246000fd5b6005111561030d57565b6102ed565b9061031c82610303565b565b61032790610312565b90565b6103339061031e565b9052565b60ff1690565b61034690610337565b9052565b60018060a01b031690565b61035e9061034a565b90565b61036a90610355565b9052565b61037790610143565b9052565b91946103c46103ce929897956103ba60a0966103b06103d59a6103a660c08a019e60008b019061032a565b602089019061033d565b6040870190610361565b606085019061036e565b608083019061036e565b019061036e565b565b3461040e5761040a6103f26103ed36600461016a565b61027b565b92610401969496929192610133565b9687968761037b565b0390f35b610139565b63ffffffff1690565b61042581610413565b0361042c57565b600080fd5b9050359061043e8261041c565b565b9060208282031261045a5761045791600001610431565b90565b61013e565b60000190565b346104935761047d610478366004610440565b61106b565b610485610133565b8061048f8161045f565b0390f35b610139565b346104c6576104b06104ab366004610440565b61194d565b6104b8610133565b806104c28161045f565b0390f35b610139565b600080fd5b919060206018028301116104e057565b6104cb565b919060206004028301116104f557565b6104cb565b90916103a0828403126105325761052f6105178460008501610431565b9361052581602086016104d0565b93610320016104e5565b90565b61013e565b346105665761055061054a3660046104fa565b916120a3565b610558610133565b806105628161045f565b0390f35b610139565b600091031261057657565b61013e565b346105a95761058b36600461056b565b6105936120fe565b61059b610133565b806105a58161045f565b0390f35b610139565b6105b790610413565b9052565b91906105cf906000602085019401906105ae565b565b34610601576105e136600461056b565b6105fd6105ec61225a565b6105f4610133565b918291826105bb565b0390f35b610139565b5190565b60209181520190565b60200190565b61062290610355565b9052565b9061063381602093610619565b0190565b60200190565b9061065a61065461064d84610606565b809361060a565b92610613565b9060005b81811061066b5750505090565b90919261068461067e6001928651610626565b94610637565b910191909161065e565b61069790610337565b9052565b6106a49061031e565b9052565b6106b190610143565b9052565b906107519060e0806106fe6106da61010085016000880151868203600088015261063d565b6106ec6020880151602087019061068e565b6040870151858203604087015261063d565b946107116060820151606086019061069b565b61072360808201516080860190610619565b61073560a082015160a08601906106a8565b61074760c082015160c08601906106a8565b01519101906106a8565b90565b61076a91602082019160008184039101526106b5565b90565b3461079d57610799610788610783366004610440565b61261c565b610790610133565b91829182610754565b0390f35b610139565b346107d0576107ba6107b5366004610440565b612861565b6107c2610133565b806107cc8161045f565b0390f35b610139565b91906107e990600060208501940190610361565b565b3461081b576107fb36600461056b565b610817610806612871565b61080e610133565b918291826107d5565b0390f35b610139565b61082981610337565b0361083057565b600080fd5b9050359061084282610820565b565b61084d81610355565b0361085457565b600080fd5b9050359061086682610844565b565b909160608284031261089e5761089b6108848460008501610431565b936108928160208601610835565b93604001610859565b90565b61013e565b61ffff1690565b6108b3906108a3565b9052565b91906108cb906000602085019401906108aa565b565b346108fe576108fa6108e96108e3366004610868565b91612916565b6108f1610133565b918291826108b7565b0390f35b610139565b1c90565b63ffffffff1690565b6109209060086109259302610903565b610907565b90565b906109339154610910565b90565b6109436004600090610928565b90565b346109765761095636600461056b565b610972610961610936565b610969610133565b918291826105bb565b0390f35b610139565b9190602060020283011161098b57565b6104cb565b9091610360828403126109c8576109c56109ad8460008501610431565b936109bb81602086016104d0565b936103200161097b565b90565b61013e565b346109fc576109e66109e0366004610990565b91612e33565b6109ee610133565b806109f88161045f565b0390f35b610139565b60018060a01b031690565b610a1c906008610a219302610903565b610a01565b90565b90610a2f9154610a0c565b90565b610a3f6001600090610a24565b90565b90565b610a59610a54610a5e9261034a565b610a42565b61034a565b90565b610a6a90610a45565b90565b610a7690610a61565b90565b610a8290610a6d565b9052565b9190610a9a90600060208501940190610a79565b565b34610acc57610aac36600461056b565b610ac8610ab7610a32565b610abf610133565b91829182610a86565b0390f35b610139565b34610b0157610afd610aec610ae7366004610440565b612ec2565b610af4610133565b918291826107d5565b0390f35b610139565b60018060a01b031690565b610b21906008610b269302610903565b610b06565b90565b90610b349154610b11565b90565b610b446002600090610b29565b90565b610b5090610a61565b90565b610b5c90610b47565b9052565b9190610b7490600060208501940190610b53565b565b34610ba657610b8636600461056b565b610ba2610b91610b37565b610b99610133565b91829182610b60565b0390f35b610139565b90602080610bcf93610bc5600082015160008601906106a8565b01519101906106a8565b565b9190610be590600060408501940190610bab565b565b34610c1857610c14610c03610bfd366004610868565b91612fe5565b610c0b610133565b91829182610bd1565b0390f35b610139565b90602082820312610c3757610c3491600001610859565b90565b61013e565b34610c6a57610c54610c4f366004610c1d565b613069565b610c5c610133565b80610c668161045f565b0390f35b610139565b600080fd5b610c80610c85916101d7565b610907565b90565b610c929054610c74565b90565b80610cb1610cab610ca66004610c88565b610413565b91610413565b1015610cc257610cc090610d0c565b565b610cca610133565b630e5ea16760e41b815280610ce16004820161045f565b0390fd5b90565b916020610d0a929493610d036040820196600083019061032a565b019061032a565b565b80610d23610d1d60009260036101ae565b50610ce5565b90610d30600083016101f7565b610d42610d3c83610312565b91610312565b03610d54575050610d5290610f52565b565b6000610d619192016101f7565b90610d82610d6d610133565b928392628c577560e41b845260048401610ce8565b0390fd5b90565b610d9d610d98610da292610d86565b610a42565b610337565b90565b634e487b7160e01b600052601160045260246000fd5b610dc490610337565b60ff8114610dd25760010190565b610da5565b5490565b610def610dea610df492610337565b610a42565b610143565b90565b600052602060002090565b610e0b81610dd7565b821015610e2657610e1d600191610df7565b91020190600090565b610189565b610e3b906008610e409302610903565b61022b565b90565b90610e4e9154610e2b565b90565b90565b634e487b7160e01b600052604160045260246000fd5b600052602060002090565b5490565b610e8281610e75565b821015610e9d57610e94600191610e6a565b91020190600090565b610189565b1b90565b91906008610ec6910291610ec060018060a01b0384610ea2565b92610ea2565b9181191691161790565b610ed990610a61565b90565b90565b9190610ef5610ef0610efd93610ed0565b610edc565b908354610ea6565b9055565b9081549168010000000000000000831015610f315782610f29916001610f2f95018155610e79565b90610edf565b565b610e54565b610f4a610f45610f4f92610413565b610a42565b610413565b90565b90610f68610f62600384906101ae565b50610ce5565b90610f736000610d89565b5b80610f92610f8c610f8760018701610dd7565b610143565b91610ddb565b1015610ffa57610faf610fa9600185018390610e02565b90610e43565b610fc1610fbb33610355565b91610355565b14610fd457610fcf90610dbb565b610f74565b610ff633610fe0610133565b91829163729ca8e760e11b8352600483016107d5565b0390fd5b50919061100c60016110139201610e51565b3390610f01565b61101f816000906131f4565b3361105361104d7f0376ec1451fb8d69bd1557f9ea553b81ba8052dfbea4c7aa3c0160c43ccf2fcd93610f36565b91610ed0565b9161105c610133565b806110668161045f565b0390a3565b61107490610c95565b565b8061109261108c6110876004610c88565b610413565b91610413565b10156110a3576110a1906110ea565b565b6110ab610133565b630e5ea16760e41b8152806110c26004820161045f565b0390fd5b9160206110e89294936110e1604082019660008301906105ae565b0190610361565b565b806111176111116001611108611102600386906101ae565b50610ce5565b01600090610e02565b90610e43565b61112961112333610355565b91610355565b0361113a575061113890611161565b565b339061115d611147610133565b9283926352f3537f60e01b8452600484016110c6565b0390fd5b8061117861117260039260036101ae565b50610ce5565b90611185600083016101f7565b61119761119183610312565b91610312565b036111a95750506111a790611502565b565b60006111b69192016101f7565b906111d76111c2610133565b928392628c577560e41b845260048401610ce8565b0390fd5b67ffffffffffffffff1690565b6111fc6111f761120192610143565b610a42565b6111db565b90565b61121861121361121d92610d86565b610a42565b6111db565b90565b611229906111db565b67ffffffffffffffff811461123e5760010190565b610da5565b61125761125261125c926111db565b610a42565b610143565b90565b61127361126e61127892610337565b610a42565b610337565b90565b906112859061125f565b600052602052604060002090565b9061129d90610ed0565b600052602052604060002090565b61ffff1690565b6112be6112c3916101d7565b6112ab565b90565b6112d090546112b2565b90565b6112e76112e26112ec926108a3565b610a42565b6111db565b90565b90565b61130661130161130b926112ef565b610a42565b6111db565b90565b61131a611320916111db565b916111db565b029061132b826111db565b91820361133457565b610da5565b61134561134b916111db565b916111db565b019067ffffffffffffffff821161135e57565b610da5565b634e487b7160e01b600052601260045260246000fd5b61138561138b916111db565b916111db565b908115611396570490565b611363565b90565b6113b26113ad6113b79261139b565b610a42565b6111db565b90565b6113f06113f7946113e66060949897956113dc608086019a60008701906105ae565b602085019061033d565b6040830190610361565b01906108aa565b565b91602061141b929493611414604082019660008301906105ae565b019061033d565b565b90565b61143461142f6114399261141d565b610a42565b610337565b90565b6114466003611420565b90565b61145d6114586114629261139b565b610a42565b610337565b90565b61147161147791610337565b91610337565b019060ff821161148357565b610da5565b60001b90565b9061149a60ff91611488565b9181191691161790565b90565b906114bc6114b76114c39261125f565b6114a4565b825461148e565b9055565b906114d860018060a01b0391611488565b9181191691161790565b906114f76114f26114fe92610ed0565b610edc565b82546114c7565b9055565b611517611511600383906101ae565b50610ce5565b61152b61152660018301610dd7565b6111e8565b916115386002830161021e565b906115436000611204565b9461154e6000611204565b955b8661156e61156861156360018901610dd7565b610143565b91611243565b10156115dd576115d16115d7916115cb6115ba6115b56115b061159d6115978e60018e01610e02565b90610e43565b6115ab60058d018c9061127b565b611293565b6112c6565b6112d3565b6115c56103e86112f2565b9061130e565b90611339565b96611220565b95611550565b6115eb929591939650611379565b936116046115fe60018501600090610e02565b90610e43565b9361164b61164461163361162e61162961162260058a01889061127b565b8a90611293565b6112c6565b6112d3565b61163e6103e86112f2565b9061130e565b8790613230565b92600095611659600161139e565b965b8761167961167361166e60018b01610dd7565b610143565b91611243565b101561174857866116dd6116d66116c56116c06116bb6116b460058f6116a56116ab9160018b01610e02565b90610e43565b97018c9061127b565b8690611293565b6112c6565b6112d3565b6116d06103e86112f2565b9061130e565b8b90613230565b806116f06116ea8a6111db565b916111db565b1460001461170d575050506117076001975b611220565b9661165b565b8099929961172361171d8a6111db565b916111db565b10611734575b505061170790611702565b925095509650936117076000979038611729565b92965093509395506000146118d65783907fd91d09e1ae5d9e92ba174c808658c9834ff0c5affe15d59f47ff48c2739997a89161178f611786610133565b928392836113f9565b0390a15b61179d6000610d89565b916117a86000610d89565b5b806117c76117c16117bc60038a01610dd7565b610143565b91610ddb565b101561181f576117e46117de600388018390610e02565b90610e43565b6117f66117f085610355565b91610355565b1461180a575b61180590610dbb565b6117a9565b9261181761180591610dbb565b9390506117fc565b5093929161183c61183661183161143c565b610337565b91610337565b1460001461189b576118556118989360068391016114e2565b81907f42a6ea4a404209acf2556b8a45d50b968bc0d9323540042586ba912a30c5d7369161188d611884610133565b928392836110c6565b0390a16004906131f4565b5b565b506118c96118d1926118c360026118b26001611449565b9201916118be8361021e565b611465565b906114a7565b6001906131f4565b611899565b6118ec6118e560038701610e51565b8390610f01565b83819061194561191261190d611906879660058c0161127b565b8790611293565b6112c6565b7f24c05ed18a5f698a764dcd3504f1c43fc1e6e385a4e88d90e6e4712781e021e69461193c610133565b948594856113ba565b0390a1611793565b61195690611076565b565b91908261197661197061196b6004610c88565b610413565b91610413565b101561198757611985926119af565b565b61198f610133565b630e5ea16760e41b8152806119a66004820161045f565b0390fd5b151590565b90916119c56119bf8360036101ae565b50610ce5565b926000936119d36000610d89565b5b806119f26119ec6119e760018601610dd7565b610143565b91610ddb565b1015611a7857611a0f611a09600184018390610e02565b90610e43565b611a21611a1b33610355565b91610355565b14611a3457611a2f90610dbb565b6119d4565b505090919250611a4660015b156119aa565b611a5557611a5392611a86565b565b611a5d610133565b63a242193d60e01b815280611a746004820161045f565b0390fd5b5050909192611a4690611a40565b92919083611aa0611a9a60029660036101ae565b50610ce5565b94611aad600087016101f7565b611abf611ab983610312565b91610312565b03611ad25750611ad0939450611d64565b565b611ade600087016101f7565b90611aff611aea610133565b928392628c577560e41b845260048401610ce8565b0390fd5b90611b0d9061125f565b600052602052604060002090565b90611b2590610ed0565b600052602052604060002090565b90565b906004811015611b47576020020190565b610189565b611b60611b5b611b6592610d86565b610a42565b610143565b90565b35611b7281610146565b90565b611b89611b84611b8e9261139b565b610a42565b610143565b90565b604090611bbb611bc29496959396611bb1606084019860008501906105ae565b602083019061033d565b0190610361565b565b611bd0611bd5916101d7565b610b06565b90565b611be29054611bc4565b90565b601f801991011690565b90611bf990611be5565b810190811067ffffffffffffffff821117611c1357604052565b610e54565b60e01b90565b611c27816119aa565b03611c2e57565b600080fd5b90505190611c4082611c1e565b565b90602082820312611c5c57611c5991600001611c33565b90565b61013e565b9037565b611c729161030091611c61565b565b611c8091608091611c61565b565b91610300611ca6929493611c9f6103808201966000830190611c65565b0190611c74565b565b90565b611cbf611cba611cc492611ca8565b610a42565b610143565b90565b611cdb611cd6611ce092610143565b610a42565b6108a3565b90565b90611cf061ffff91611488565b9181191691161790565b611d0e611d09611d13926108a3565b610a42565b6108a3565b90565b90565b90611d2e611d29611d3592611cfa565b611d16565b8254611ce3565b9055565b6001611d459101610143565b90565b611d5c611d57611d6192610d86565b610a42565b6108a3565b90565b9091611d7b611d75600384906101ae565b50610ce5565b90611d886002830161021e565b93611da9611da4611d9d600486018890611b03565b3390611b1b565b611b33565b611db56000820161026e565b611de2611ddc611dd7611dd287611dcc6000611b4c565b90611b36565b611b68565b610143565b91610143565b1415908115612061575b50612038576020611e05611e006002611bd8565b610b47565b636183f6b49290611e288594611e33611e1c610133565b96879586948594611c18565b845260048401611c82565b03915afa8091600092612008575b5015600014611fc057506001611f9857611e79611e74611e6f611e96935b611e696002611cab565b90611b36565b611b68565b611cc7565b611e91611e8a60058501879061127b565b3390611293565b611d19565b81833391611ed07f8091531c95e42cbd103ed41c7b1f94540748b6acf3187990fbd8e9c9af44ea4493611ec7610133565b93849384611b91565b0390a1600092611ee06000611b4c565b5b80611eff611ef9611ef460018701610dd7565b610143565b91610143565b1015611f8b57611f3a611f35611f22611f1c600187018590610e02565b90610e43565b611f3060058701869061127b565b611293565b6112c6565b611f4d611f476000611d48565b916108a3565b14611f6057611f5b90611d39565b611ee1565b5050509050611f7160015b156119aa565b611f79575b50565b611f85906003906131f4565b38611f76565b50505090611f7190611f6b565b5050611fbc33611fa6610133565b938493631c75226560e11b855260048501611b91565b0390fd5b611fca90156119aa565b611fe057611e79611e74611e6f611e9693611e5f565b505061200433611fee610133565b938493631c75226560e11b855260048501611b91565b0390fd5b61202a91925060203d8111612031575b6120228183611bef565b810190611c42565b9038611e41565b503d612018565b50505061205d33612047610133565b93849363ffd646e160e01b855260048501611b91565b0390fd5b61206e915060010161026e565b61209b61209561209061208b866120856001611b75565b90611b36565b611b68565b610143565b91610143565b141538611dec565b906120ae9291611958565b565b6120b861326c565b6120c06120ea565b565b6120d66120d16120db92610d86565b610a42565b61034a565b90565b6120e7906120c2565b90565b6120fc6120f760006120de565b6132c1565b565b6121066120b0565b565b600090565b90565b5490565b600052602060002090565b61212881612110565b8210156121435761213a600a91612114565b91020190600090565b610189565b61215181612110565b68010000000000000000811015612175576121719160018201815561211f565b9091565b610e54565b61218390610312565b90565b90565b9061219e6121996121a59261217a565b612186565b825461148e565b9055565b906121b660001991611488565b9181191691161790565b6121d46121cf6121d992610143565b610a42565b610143565b90565b90565b906121f46121ef6121fb926121c0565b6121dc565b82546121a9565b9055565b61220890610413565b63ffffffff81146122195760010190565b610da5565b9061222d63ffffffff91611488565b9181191691161790565b90565b9061224f61224a61225692610f36565b612237565b825461221e565b9055565b612262612108565b506122bb61228161227b612276600361210d565b612148565b50610ce5565b61229761229060018301610e51565b3390610f01565b6122a46000808301612189565b6122b142600783016121df565b60084291016121df565b6122c56004610c88565b6122d86122d1826121ff565b600461223a565b90813361230e6123087f4d02ce21c9b87cd569227bcf4c505c9c57c55b19697fcd04316a57d69ed52a0193610f36565b91610ed0565b91612317610133565b806123218161045f565b0390a3565b90612339612332610133565b9283611bef565b565b612346610100612326565b90565b606090565b600090565b600090565b600090565b600090565b61236a61233b565b906020808080808080808961237d612349565b81520161238861234e565b815201612393612349565b81520161239e612353565b8152016123a9612358565b8152016123b461235d565b8152016123bf61235d565b8152016123ca61235d565b81525050565b6123d8612362565b90565b90806123f86123f26123ed6004610c88565b610413565b91610413565b101561240a576124079161251c565b90565b612412610133565b630e5ea16760e41b8152806124296004820161045f565b0390fd5b612438610100612326565b90565b6124459054610236565b90565b60010190565b9061246b61246561245e84610dd7565b809361060a565b92610df7565b9060005b81811061247c5750505090565b90919261249c6124966001926124918761243b565b610626565b94612448565b910191909161246f565b906124b09161244e565b90565b906124d36124cc926124c3610133565b938480926124a6565b0383611bef565b565b6124de906124b3565b90565b52565b906124ee90610337565b9052565b906124fc90610312565b9052565b9061250a90610355565b9052565b9061251890610143565b9052565b50600390612529916101ae565b5061253390610ce5565b8060010190806002016125459061021e565b908060030181600001612557906101f7565b826006016125649061024a565b90836007016125729061026e565b92846008016125809061026e565b9460090161258d9061026e565b9561259661242d565b976125a0906124d5565b60008901906125ae916124e1565b60208801906125bc916124e4565b6125c5906124d5565b60408701906125d3916124e1565b60608601906125e1916124f2565b60808501906125ef91612500565b60a08401906125fd9161250e565b60c083019061260b9161250e565b60e08201906126199161250e565b90565b61262d906126286123d0565b6123db565b90565b8061264c6126466126416004610c88565b610413565b91610413565b101561265d5761265b90612680565b565b612665610133565b630e5ea16760e41b81528061267c6004820161045f565b0390fd5b806126ad6126a7600161269e612698600386906101ae565b50610ce5565b01600090610e02565b90610e43565b6126bf6126b933610355565b91610355565b036126d057506126ce906126f7565b565b33906126f36126dd610133565b9283926352f3537f60e01b8452600484016110c6565b0390fd5b8061270e61270860009260036101ae565b50610ce5565b9061271b600083016101f7565b61272d61272783610312565b91610312565b0361273f57505061273d906127b6565b565b600061274c9192016101f7565b9061276d612758610133565b928392628c577560e41b845260048401610ce8565b0390fd5b61278561278061278a9261141d565b610a42565b6108a3565b90565b6127976003612771565b90565b6127ae6127a96127b3926108a3565b610a42565b610143565b90565b6127d660016127d06127ca600385906101ae565b50610ce5565b01610dd7565b6127ef6127e96127e461278d565b61279a565b91610143565b1061283b57612800816001906131f4565b6128367fe6aebc56b3bafc90ff9fcf8f838e304f2b308c7b3cc63fde56fb1806a03968fe9161282d610133565b918291826105bb565b0390a1565b61285d90612847610133565b9182916376293c1d60e01b8352600483016105bb565b0390fd5b61286a90612630565b565b600090565b61287961286c565b50612884600061024a565b90565b600090565b929190806128ab6128a56128a06004610c88565b610413565b91610413565b10156128bd576128ba936128e0565b90565b6128c5610133565b630e5ea16760e41b8152806128dc6004820161045f565b0390fd5b61290e9260056129036128fd6129139795612909955060036101ae565b50610ce5565b0161127b565b611293565b6112c6565b90565b906129299291612924612887565b61288c565b90565b91908261294a61294461293f6004610c88565b610413565b91610413565b101561295b576129599261297e565b565b612963610133565b630e5ea16760e41b81528061297a6004820161045f565b0390fd5b909161299461298e8360036101ae565b50610ce5565b926000936129a26000610d89565b5b806129c16129bb6129b660018601610dd7565b610143565b91610ddb565b1015612a47576129de6129d8600184018390610e02565b90610e43565b6129f06129ea33610355565b91610355565b14612a03576129fe90610dbb565b6129a3565b505090919250612a1560015b156119aa565b612a2457612a2292612a55565b565b612a2c610133565b63a242193d60e01b815280612a436004820161045f565b0390fd5b5050909192612a1590612a0f565b92919083612a6f612a6960019660036101ae565b50610ce5565b94612a7c600087016101f7565b612a8e612a8883610312565b91610312565b03612aa15750612a9f939450612b98565b565b612aad600087016101f7565b90612ace612ab9610133565b928392628c577560e41b845260048401610ce8565b0390fd5b612ade612ae3916101d7565b610a01565b90565b612af09054612ad2565b90565b612aff91604091611c61565b565b91610300612b25929493612b1e6103408201966000830190611c65565b0190612af3565b565b906002811015612b38576020020190565b610189565b612b476040612326565b90565b612b549051610143565b90565b90612b8460206001612b8a94612b7c60008201612b7660008801612b4a565b906121df565b019201612b4a565b906121df565b565b90612b9691612b57565b565b9091612baf612ba9600384906101ae565b50610ce5565b90612bbc6002830161021e565b936020612bd1612bcc6001612ae6565b610a6d565b63c0e9d81c9290612bf48594612bff612be8610133565b96879586948594611c18565b845260048401612b01565b03915afa8091600092612e03575b5015600014612dc457506001612d9c57612c98905b612c7b612c5d612c58612c47612c4285612c3c6000611b4c565b90612b27565b611b68565b93612c526001611b75565b90612b27565b611b68565b612c72612c68612b3d565b936000850161250e565b6020830161250e565b612c93612c8c600485018790611b03565b3390611b1b565b612b8c565b81833391612cd27f2a2e685f4b35ad9685bb75094db1851f4d30e370bc4a4c32d1103a9626fed5a593612cc9610133565b93849384611b91565b0390a1600092612ce26000611b4c565b5b80612d01612cfb612cf660018701610dd7565b610143565b91610143565b1015612d8f57612d3e6001612d38612d25612d1f8388018690610e02565b90610e43565b612d33600488018790611b03565b611b1b565b0161026e565b612d51612d4b6000611b4c565b91610143565b14612d6457612d5f90611d39565b612ce3565b5050509050612d7560015b156119aa565b612d7d575b50565b612d89906002906131f4565b38612d7a565b50505090612d7590612d6f565b5050612dc033612daa610133565b938493630ff25d5d60e11b855260048501611b91565b0390fd5b612dce90156119aa565b612ddb57612c9890612c22565b5050612dff33612de9610133565b938493630ff25d5d60e11b855260048501611b91565b0390fd5b612e2591925060203d8111612e2c575b612e1d8183611bef565b810190611c42565b9038612c0d565b503d612e13565b90612e3e929161292c565b565b9080612e5d612e57612e526004610c88565b610413565b91610413565b1015612e6f57612e6c91612e92565b90565b612e77610133565b630e5ea16760e41b815280612e8e6004820161045f565b0390fd5b6001612eb0612eaa612ebf94612eb9945060036101ae565b50610ce5565b01600090610e02565b90610e43565b90565b612ed390612ece61286c565b612e40565b90565b612ee06040612326565b90565b612eeb612ed6565b9060208083612ef861235d565b815201612f0361235d565b81525050565b612f11612ee3565b90565b92919080612f33612f2d612f286004610c88565b610413565b91610413565b1015612f4557612f4293612faf565b90565b612f4d610133565b630e5ea16760e41b815280612f646004820161045f565b0390fd5b90612fa1612f986001612f79612ed6565b94612f92612f896000830161026e565b6000880161250e565b0161026e565b6020840161250e565b565b612fac90612f68565b90565b612fdd926004612fd2612fcc612fe29795612fd8955060036101ae565b50610ce5565b01611b03565b611b1b565b612fa3565b90565b90612ff89291612ff3612f09565b612f14565b90565b61300c9061300761326c565b61300e565b565b8061302a61302461301f60006120de565b610355565b91610355565b1461303a57613038906132c1565b565b61306561304760006120de565b61304f610133565b918291631e4fbdf760e01b8352600483016107d5565b0390fd5b61307290612ffb565b565b908161309161308b6130866004610c88565b610413565b91610413565b10156130a2576130a0916130c5565b565b6130aa610133565b630e5ea16760e41b8152806130c16004820161045f565b0390fd5b906130e560006130df6130d98560036101ae565b50610ce5565b016101f7565b6130f86130f26004610312565b91610312565b14613108576131069161314f565b565b613110610133565b637934aa7b60e01b8152806131276004820161045f565b0390fd5b91602061314d929493613146604082019660008301906105ae565b019061032a565b565b61316461315e600383906101ae565b50610ce5565b6131718360008301612189565b61317e42600883016121df565b8261319261318c6004610312565b91610312565b146131d5575b50907f256ace825f57d7b5916c17edd2ef1b56760a9754eb5a14ea1a15dd7adf890c47916131d06131c7610133565b9283928361312b565b0390a1565b8060096131e760086131ee940161026e565b91016121df565b38613198565b906131fe91613074565b565b600090565b613211613217916111db565b916111db565b90039067ffffffffffffffff821161322b57565b610da5565b90613239613200565b508161324d613247836111db565b916111db565b1015613260579061325d91613205565b90565b61326991613205565b90565b613274612871565b61328d613287613282613322565b610355565b91610355565b0361329457565b6132bd61329f613322565b6132a7610133565b91829163118cdaa760e01b8352600483016107d5565b0390fd5b6132cb600061024a565b6132d68260006114e2565b9061330a6133047f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610ed0565b91610ed0565b91613313610133565b8061331d8161045f565b0390a3565b61332a61286c565b50339056fea2646970667358221220053736d40f7afa7d9eba2565f5e81982d8c3b48526e26a0680956815f20bc44c64736f6c63430008170033

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

00000000000000000000000097bc1d08465f70039dda8fe22bdedf110d2bd8a50000000000000000000000003044e5d78e1a2eb3c3189a3fc52c0846ed1f3f7d

-----Decoded View---------------
Arg [0] : cVerAddr (address): 0x97bc1D08465F70039dda8Fe22bdEdF110D2bd8A5
Arg [1] : oVerAddr (address): 0x3044e5d78e1A2eb3c3189a3fC52C0846Ed1f3f7d

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000097bc1d08465f70039dda8fe22bdedf110d2bd8a5
Arg [1] : 0000000000000000000000003044e5d78e1a2eb3c3189a3fc52c0846ed1f3f7d


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
[ 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.