Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 52 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Conclude Round | 17476765 | 78 days ago | IN | 0 ETH | 0.000041644999 | ||||
Open Commitment | 17476756 | 78 days ago | IN | 0 ETH | 0.000335758843 | ||||
Open Commitment | 17476750 | 78 days ago | IN | 0 ETH | 0.000349342594 | ||||
Open Commitment | 17476744 | 78 days ago | IN | 0 ETH | 0.00034927652 | ||||
Submit Commitmen... | 17476734 | 78 days ago | IN | 0 ETH | 0.000338919421 | ||||
Submit Commitmen... | 17476728 | 78 days ago | IN | 0 ETH | 0.000325658739 | ||||
Submit Commitmen... | 17476719 | 78 days ago | IN | 0 ETH | 0.000325632901 | ||||
Conclude Round | 17476696 | 78 days ago | IN | 0 ETH | 0.000046859502 | ||||
Open Commitment | 17476688 | 78 days ago | IN | 0 ETH | 0.000322589419 | ||||
Open Commitment | 17476682 | 78 days ago | IN | 0 ETH | 0.000362943432 | ||||
Open Commitment | 17476676 | 78 days ago | IN | 0 ETH | 0.000423637058 | ||||
Submit Commitmen... | 17476663 | 78 days ago | IN | 0 ETH | 0.000395667968 | ||||
Submit Commitmen... | 17476656 | 78 days ago | IN | 0 ETH | 0.000395655669 | ||||
Submit Commitmen... | 17476644 | 78 days ago | IN | 0 ETH | 0.000395684627 | ||||
Conclude Round | 17476608 | 78 days ago | IN | 0 ETH | 0.000056951735 | ||||
Open Commitment | 17476598 | 78 days ago | IN | 0 ETH | 0.000476765609 | ||||
Open Commitment | 17476556 | 78 days ago | IN | 0 ETH | 0.000458353404 | ||||
Open Commitment | 17476548 | 78 days ago | IN | 0 ETH | 0.000495087481 | ||||
Submit Commitmen... | 17476505 | 78 days ago | IN | 0 ETH | 0.000365764453 | ||||
Submit Commitmen... | 17476499 | 78 days ago | IN | 0 ETH | 0.00037971266 | ||||
Submit Commitmen... | 17476482 | 78 days ago | IN | 0 ETH | 0.000427129086 | ||||
Start Game | 17476460 | 78 days ago | IN | 0 ETH | 0.000063851838 | ||||
Join Game | 17476446 | 78 days ago | IN | 0 ETH | 0.000059070383 | ||||
Join Game | 17476433 | 78 days ago | IN | 0 ETH | 0.000052533293 | ||||
Join Game | 17476429 | 78 days ago | IN | 0 ETH | 0.000050503589 |
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)
// 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); } } }
// 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); } }
// 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; } }
// 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;
// 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); }
// 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; }
// 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); }
{ "viaIR": true, "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
[ 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.