ETH Price: $3,129.05 (-0.24%)

Contract

0xEa6556E350cD0C61452a26aB34E69EBf6f1808BA
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Vote143910912022-03-15 12:12:55978 days ago1647346375IN
0xEa6556E3...f6f1808BA
0 ETH0.000787317.37447207
Vote143910842022-03-15 12:11:57978 days ago1647346317IN
0xEa6556E3...f6f1808BA
0 ETH0.0007799517.21220067
Vote142012882022-02-14 1:33:231008 days ago1644802403IN
0xEa6556E3...f6f1808BA
0 ETH0.0019563343.16152118
Withdraw Winning...141831012022-02-11 6:19:351011 days ago1644560375IN
0xEa6556E3...f6f1808BA
0 ETH0.0018107735.1
Withdraw Winning...141831012022-02-11 6:19:351011 days ago1644560375IN
0xEa6556E3...f6f1808BA
0 ETH0.0018107735.1
Withdraw Winning...141831012022-02-11 6:19:351011 days ago1644560375IN
0xEa6556E3...f6f1808BA
0 ETH0.0018107735.1
Withdraw Winning...141831012022-02-11 6:19:351011 days ago1644560375IN
0xEa6556E3...f6f1808BA
0 ETH0.0018107735.1
Vote141457212022-02-05 11:20:541016 days ago1644060054IN
0xEa6556E3...f6f1808BA
0 ETH0.0017342140.62816667
Vote141453742022-02-05 10:11:461016 days ago1644055906IN
0xEa6556E3...f6f1808BA
0 ETH0.0018903744.28662098
Vote141453742022-02-05 10:11:461016 days ago1644055906IN
0xEa6556E3...f6f1808BA
0 ETH0.0018785644.00989292
Vote141453532022-02-05 10:07:331016 days ago1644055653IN
0xEa6556E3...f6f1808BA
0 ETH0.0019216945.02028897
Update Tournamen...141444562022-02-05 6:49:511017 days ago1644043791IN
0xEa6556E3...f6f1808BA
0 ETH0.0038742270
Vote141037322022-01-29 23:53:121023 days ago1643500392IN
0xEa6556E3...f6f1808BA
0 ETH0.020530460.1
Vote141037322022-01-29 23:53:121023 days ago1643500392IN
0xEa6556E3...f6f1808BA
0 ETH0.021037460.1
Vote140485572022-01-21 11:04:291031 days ago1642763069IN
0xEa6556E3...f6f1808BA
0 ETH0.0278262379.49716148
Withdraw Winning...140165652022-01-16 12:38:291036 days ago1642336709IN
0xEa6556E3...f6f1808BA
0 ETH0.0039259276.1
Vote140161102022-01-16 11:00:061036 days ago1642330806IN
0xEa6556E3...f6f1808BA
0 ETH0.0295534279
Vote140155702022-01-16 8:53:401036 days ago1642323220IN
0xEa6556E3...f6f1808BA
0 ETH0.0352855483.82320967
Vote140131782022-01-15 23:55:001037 days ago1642290900IN
0xEa6556E3...f6f1808BA
0 ETH0.0208355485.1
Vote140130012022-01-15 23:16:461037 days ago1642288606IN
0xEa6556E3...f6f1808BA
0 ETH0.0249530285.1
Vote140130012022-01-15 23:16:461037 days ago1642288606IN
0xEa6556E3...f6f1808BA
0 ETH0.0215534485.1
Vote139742752022-01-09 23:25:011043 days ago1641770701IN
0xEa6556E3...f6f1808BA
0 ETH0.02753861104.1
Vote139741712022-01-09 23:00:551043 days ago1641769255IN
0xEa6556E3...f6f1808BA
0 ETH0.02440215112.1
Vote139741532022-01-09 22:58:141043 days ago1641769094IN
0xEa6556E3...f6f1808BA
0 ETH0.03056846122.1
Vote139741352022-01-09 22:55:051043 days ago1641768905IN
0xEa6556E3...f6f1808BA
0 ETH0.03139473126.1
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Trollbox

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: TrollboxComplete.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.7.4;

import "./SafeMathLib.sol";

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}


contract Trollbox {
    using SafeMathLib for uint;

    /**
        Votes are a mapping from choices to weights, plus a metadataHash, which references an arbitrary bit of metadata
        stored on IPFS. The meaning of these choices is not stored on chain, only the index. For example, if  the choices
        are ["BTC", "ETH", "DASH"],  and the user  wants to put 3 votes on BTC, 5 votes on ETH and 4 on DASH, then this
        will be recorded as weights[1]  = 3; weights[2]  = 5; weights[3] = 4; The choices are indexed starting on 1 to
        prevent confusion caused by empty votes.
    **/
    struct Vote {
        mapping(uint => uint) weights;
        bytes32 metadataHash;
    }

    /**
        Rounds occur with some frequency and represent a complete cycle of prediction->resolution. Each round has an id,
        which represents it's location in a linear sequence of rounds of the same type. It stores a mapping of voter
        ids to votes and records the winning option when the round is resolved.
    **/
    struct Round {
        uint roundId;
        mapping (uint => Vote) votes;
        mapping (uint => uint) voteTotals;
        uint winningOption;
    }

    /**
        A tournament is a linear sequence of rounds of the same type. Tournaments are identified by an integer that
        increases sequentially with each tournament. Tournaments also have hash for storing off-chain metadata about the
        tournament. A tournament has a set wavelength and phase, called roundLengthSeconds and startDate, respectively. Each
        tournament also has it's own set of voice credits, which is a mapping from address to balance. The rounds
        mapping takes a round id and spits out a Round struct. The tokenRoundBonus attribute describes how much IERC20 to be
        distributed to the voters each round. The tokenListENS stores the ENS address of a token list that forms the
        choices of the tournament.
    **/
    struct Tournament {
        uint tournamentId;
        bytes32 metadataHash;  // ipfs hash of more verbose description, possibly multimedia
        uint startTime;
        uint roundLengthSeconds;
        uint tokenRoundBonus;
        uint minimumRank;
        uint voiceUBI;   // number of voice credits available to spend each round
        bytes32 tokenListENS;
        address winnerOracle;  // address that sets the winner for a tournament
        mapping (uint => uint) voiceCredits;
        mapping (uint => Round) rounds;
    }

    /**
        An identity is purchased with IERC20 and stores the creation time and a mapping of tournament id to the last round
        id that the identity voted in, which is used for deferred reward computation.
    **/
    struct IdMetadata {
        mapping (uint => uint) lastRoundVoted;
//        uint firstTimeVoted;
//        uint timesVoted;
        uint cumulativeBonus;
        uint rank;
    }

    address public management; // authoritative key that can make important decisions, can be DAO address later
    address public rankManager;
    IERC20 public token;
    IERC721 public identity;

    uint public numTournaments = 0; // a counter to know what index to assign to new tournaments
    bytes32 public siteHash;

    mapping (uint => Tournament) public tournaments; // mapping from tournament id to tournament struct
    mapping (uint => IdMetadata) public identities; // mapping from address to identity struct
    mapping (uint => uint) public tokensWon; // tokensWon[voterId] = fvt-wei owed
    mapping (uint => mapping (uint => mapping (uint => bool))) public syncMap; // syncMap[voterId][tournamentId][roundId] = true/false

    // events for consumption by off chain systems
    event VoteOccurred(uint indexed tournamentId, uint indexed roundId, uint indexed voterId, uint[] choices, uint[] weights, bytes32 metadata);
    event RoundResolved(uint indexed tournamentId, uint roundId, uint winningChoice);
    event TournamentCreated(uint tournamentId, bytes32 metadataHash, uint startTime, uint roundLengthSeconds, uint tokenRoundBonus, uint minimumRank, uint voiceUBI, bytes32 tokenListENS, address winnerOracle);
    event ManagementUpdated(address oldManagement, address newManagement);
    event SiteHashUpdated(bytes32 oldSiteHash, bytes32 newSiteHash);
    event RankUpdated(uint voterId, uint oldRank, uint newRank);
    event RankManagerUpdated(address oldManager, address newManager);
    event TournamentUpdated(uint tournamentId, bytes32 metadataHash, uint tokenRoundBonus, uint minimumRank, uint voiceUBI, bytes32 tokenListENS, address winnerOracle);
    event AccountSynced(uint tournamentId, uint voterId);

    modifier managementOnly() {
        require (msg.sender == management, 'Only management may call this');
        _;
    }

    constructor(address mgmt, address rankMgmt, address id) {
        management = mgmt;
        rankManager = rankMgmt;
        identity = IERC721(id);
    }

    // this function creates a new tournament type, only management can call it
    function createTournament(
        bytes32 hash,
        uint startTime,
        uint roundLengthSeconds,
        uint tokenRoundBonus,
        bytes32 tokenListENS,
        address oracle,
        uint minRank,
        uint voiceUBI) public managementOnly {
        numTournaments = numTournaments.plus(1);
        Tournament storage tournament = tournaments[numTournaments];
        tournament.metadataHash = hash;
        tournament.startTime = startTime == 0 ? block.timestamp : startTime;
        tournament.tournamentId = numTournaments;
        tournament.roundLengthSeconds = roundLengthSeconds;
        tournament.tokenRoundBonus = tokenRoundBonus;
        tournament.minimumRank = minRank;
        tournament.voiceUBI = voiceUBI;
        tournament.tokenListENS = tokenListENS;
        tournament.winnerOracle = oracle;
        emit TournamentCreated(numTournaments, hash, startTime, roundLengthSeconds, tokenRoundBonus, minRank, voiceUBI, tokenListENS, oracle);
    }



    // this completes the round, and assigns it a winning choice, which enables deferred updates to voice credits
    function resolveRound(uint tournamentId, uint roundId, uint winningOption) public {
        Tournament storage tournament = tournaments[tournamentId];
        require(msg.sender == tournament.winnerOracle, 'Only winner oracle can call this');
        uint currentRoundId = getCurrentRoundId(tournamentId);
        Round storage round = tournament.rounds[roundId];
        require(roundAlreadyResolved(tournamentId, roundId) == false, 'Round already resolved');
        require(currentRoundId > roundId + 1, 'Too early to resolve');
        round.roundId = roundId;
        round.winningOption = winningOption;
        emit RoundResolved(tournamentId, roundId, winningOption);
    }

    function voteCheck(uint voterId, uint tournamentId, uint roundId) internal view {
        require(roundId > 0, 'Tournament not started yet');
        require(identity.ownerOf(voterId) == msg.sender, 'Must own identity to vote with it');
        require(roundId > identities[voterId].lastRoundVoted[tournamentId], 'Can only vote one time per round');
        require(tournaments[tournamentId].minimumRank <= identities[voterId].rank, 'Insufficient rank to participate in this tournament');
    }

    // this is called by an identity that wishes to vote on a given tournament, with the choices and weights
    function vote(
        uint voterId,
        uint tournamentId,
        uint[] memory choices,
        uint[] memory weights,
        bytes32 hash,
        uint updateRoundId
    ) public {
        uint roundId = getCurrentRoundId(tournamentId);
        Round storage currentRound = tournaments[tournamentId].rounds[roundId];

        voteCheck(voterId, tournamentId, roundId);
        require(choices.length == weights.length, 'Mismatched choices and lengths');

        updateAccount(voterId, tournamentId, updateRoundId);

        identities[voterId].lastRoundVoted[tournamentId] = roundId;

        Vote storage currentVote = currentRound.votes[voterId];
        currentVote.metadataHash = hash;
        uint balance = getVoiceCredits(tournamentId, voterId);
        uint sum = 0;

        for (uint i = 0; i < weights.length; i++) {
            currentVote.weights[choices[i]] = weights[i];
            currentRound.voteTotals[choices[i]] = currentRound.voteTotals[choices[i]].plus(weights[i]);
            sum = sum.plus(weights[i].times(weights[i]));
        }
        require(sum <= balance, 'Must not spend more than your balance');

        emit VoteOccurred(tournamentId, roundId, voterId, choices, weights, hash);
    }

    function withdrawWinnings(uint voterId) public {
        uint winnings = tokensWon[voterId];
        address owner = identity.ownerOf(voterId);
        require(winnings > 0, 'Nothing to withdraw');
        // doing it this way out of re-entry avoidance habit, not because it's actually possible here
        tokensWon[voterId] = 0;
        token.transfer(owner, winnings);
    }

    // this actually updates the voice credit balance to include the reward
    function updateAccount(uint voterId, uint tournamentId, uint roundId) public {
        IdMetadata storage id = identities[voterId];
        Tournament storage tournament = tournaments[tournamentId];
        bool roundResolved = roundAlreadyResolved(tournamentId, roundId);
        bool shouldSync = isSynced(voterId, tournamentId, roundId) == false;

        if (shouldSync && roundResolved) {
            // idempotent condition, call twice, update once, since this function is public
            syncMap[voterId][tournamentId][roundId] = true; // idempotence

            (uint voiceCreditBonus, uint tokenBonus) = getRoundBonus(voterId, tournamentId, roundId);
            tournament.voiceCredits[voterId] = getVoiceCredits(tournamentId, voterId).plus(voiceCreditBonus);
            tokensWon[voterId] = tokensWon[voterId].plus(tokenBonus);
            id.cumulativeBonus = id.cumulativeBonus.plus(voiceCreditBonus);
            emit AccountSynced(tournamentId, voterId);
        }
    }


/**
====================================== GETTERS ==========================================================
**/
    function getRound(uint tournamentId, uint roundId) public view returns (uint[2] memory) {
        Round storage round = tournaments[tournamentId].rounds[roundId];
        return [round.roundId, round.winningOption];
    }

    // this computes the id of the current round for a given tournament, starting with round 1 on the startTime
    function getCurrentRoundId(uint tournamentId) public view returns (uint) {
        Tournament storage tournament = tournaments[tournamentId];
        uint startTime = tournament.startTime;
        uint roundLengthSeconds = tournament.roundLengthSeconds;
        if (block.timestamp >= startTime) {
            return 1 + ((block.timestamp - startTime) / roundLengthSeconds);
        } else {
            return 0;
        }
    }

    function getVoiceCredits(uint tournamentId, uint voterId) public view returns (uint) {
        Tournament storage tournament = tournaments[tournamentId];
        uint voiceCredits = tournament.voiceCredits[voterId];
        if (voiceCredits > 0) {
            return voiceCredits;
        } else {
            return tournament.voiceUBI;
        }
    }

    function getLastRoundVoted(uint tournamentId, uint voterId) public view returns (uint) {
        return identities[voterId].lastRoundVoted[tournamentId];
    }

    function getVoteTotals(uint tournamentId, uint roundId, uint option) public view returns (uint) {
        return tournaments[tournamentId].rounds[roundId].voteTotals[option];
    }

    function getVoteMetadata(uint tournamentId, uint roundId, uint voterId) public view returns (bytes32) {
        return tournaments[tournamentId].rounds[roundId].votes[voterId].metadataHash;
    }

    function getVoiceUBI(uint tournamentId) public view  returns (uint)  {
        return tournaments[tournamentId].voiceUBI;
    }

    function getRoundResults(uint voterId, uint tournamentId, uint roundId) public view returns (uint, uint) {
        Tournament storage tournament = tournaments[tournamentId];
        Round storage round = tournament.rounds[roundId];
        Vote storage thisVote = round.votes[voterId];
        return (thisVote.weights[round.winningOption], round.voteTotals[round.winningOption]);
    }

    // this actually updates the voice credit balance to include the reward
    function getRoundBonus(uint voterId, uint tournamentId, uint roundId) public view returns (uint, uint) {
        Tournament storage tournament = tournaments[tournamentId];
        (uint voteWeight, uint totalVotes) = getRoundResults(voterId, tournamentId, roundId);
        uint tokenBonus = 0;
        // if this is the first round voterId has voted in, totalVotes will be 0
        if (totalVotes > 0) {
            tokenBonus = tournament.tokenRoundBonus.times(voteWeight) / totalVotes;
        }
        uint voiceCreditBonus = voteWeight.times(voteWeight);
        return (voiceCreditBonus, tokenBonus);
    }

    function isSynced(uint voterId, uint tournamentId, uint roundId) public view returns (bool) {
        return syncMap[voterId][tournamentId][roundId];
    }

    function roundAlreadyResolved(uint tournamentId, uint roundId) public view returns (bool) {
        return tournaments[tournamentId].rounds[roundId].winningOption > 0;
    }

/**
====================================== SETTERS ==========================================================
**/

    // change the site hash
    function setSiteHash(bytes32 newHash) public managementOnly {
        bytes32 oldHash = siteHash;
        siteHash = newHash;
        emit SiteHashUpdated(oldHash, newHash);
    }

    function setRank(uint voterId, uint newRank) public {
        require(msg.sender == rankManager, 'Only rankManager may call this');
        IdMetadata storage id = identities[voterId];
        uint oldRank = id.rank;
        id.rank = newRank;
        emit RankUpdated(voterId, oldRank, newRank);
    }

    function setToken(address tokenAddr) public managementOnly {
        token = IERC20(tokenAddr);
    }

    function updateTournament(uint tournamentId, bytes32 newMetadata, uint newBonus,  uint newMinRank, uint newUBI, bytes32 newTokenList, address newOracle) public managementOnly {
        Tournament storage tournament = tournaments[tournamentId];
        tournament.metadataHash = newMetadata;
        // no changing round length
        tournament.tokenRoundBonus = newBonus;
        tournament.minimumRank = newMinRank;
        tournament.voiceUBI = newUBI;
        tournament.tokenListENS = newTokenList;
        tournament.winnerOracle = newOracle;
        emit TournamentUpdated(tournamentId, newMetadata, newBonus, newMinRank, newUBI, newTokenList, newOracle);
    }

    function setRankManager(address newManager) public managementOnly {
        address oldManager = rankManager;
        rankManager = newManager;
        emit RankManagerUpdated(oldManager, newManager);
    }

    // change the management key
    function setManagement(address newMgmt) public managementOnly {
        address oldMgmt =  management;
        management = newMgmt;
        emit ManagementUpdated(oldMgmt, newMgmt);
    }


}

File 2 of 2: SafeMathLib.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.7.4;

library SafeMathLib {
  function times(uint a, uint b) public pure returns (uint) {
    uint c = a * b;
    require(a == 0 || c / a == b, 'Overflow detected');
    return c;
  }

  function minus(uint a, uint b) public pure returns (uint) {
    require(b <= a, 'Underflow detected');
    return a - b;
  }

  function plus(uint a, uint b) public pure returns (uint) {
    uint c = a + b;
    require(c>=a && c>=b, 'Overflow detected');
    return c;
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"mgmt","type":"address"},{"internalType":"address","name":"rankMgmt","type":"address"},{"internalType":"address","name":"id","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tournamentId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"voterId","type":"uint256"}],"name":"AccountSynced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldManagement","type":"address"},{"indexed":false,"internalType":"address","name":"newManagement","type":"address"}],"name":"ManagementUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldManager","type":"address"},{"indexed":false,"internalType":"address","name":"newManager","type":"address"}],"name":"RankManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"voterId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldRank","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRank","type":"uint256"}],"name":"RankUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tournamentId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winningChoice","type":"uint256"}],"name":"RoundResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"oldSiteHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newSiteHash","type":"bytes32"}],"name":"SiteHashUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tournamentId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"metadataHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundLengthSeconds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenRoundBonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minimumRank","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"voiceUBI","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"tokenListENS","type":"bytes32"},{"indexed":false,"internalType":"address","name":"winnerOracle","type":"address"}],"name":"TournamentCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tournamentId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"metadataHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"tokenRoundBonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minimumRank","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"voiceUBI","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"tokenListENS","type":"bytes32"},{"indexed":false,"internalType":"address","name":"winnerOracle","type":"address"}],"name":"TournamentUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tournamentId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"voterId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"choices","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"indexed":false,"internalType":"bytes32","name":"metadata","type":"bytes32"}],"name":"VoteOccurred","type":"event"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"roundLengthSeconds","type":"uint256"},{"internalType":"uint256","name":"tokenRoundBonus","type":"uint256"},{"internalType":"bytes32","name":"tokenListENS","type":"bytes32"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"minRank","type":"uint256"},{"internalType":"uint256","name":"voiceUBI","type":"uint256"}],"name":"createTournament","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"}],"name":"getCurrentRoundId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"voterId","type":"uint256"}],"name":"getLastRoundVoted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"getRound","outputs":[{"internalType":"uint256[2]","name":"","type":"uint256[2]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"voterId","type":"uint256"},{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"getRoundBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"voterId","type":"uint256"},{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"getRoundResults","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"voterId","type":"uint256"}],"name":"getVoiceCredits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"}],"name":"getVoiceUBI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"uint256","name":"voterId","type":"uint256"}],"name":"getVoteMetadata","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"uint256","name":"option","type":"uint256"}],"name":"getVoteTotals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"identities","outputs":[{"internalType":"uint256","name":"cumulativeBonus","type":"uint256"},{"internalType":"uint256","name":"rank","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"identity","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"voterId","type":"uint256"},{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"isSynced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"management","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTournaments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rankManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"uint256","name":"winningOption","type":"uint256"}],"name":"resolveRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"roundAlreadyResolved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newMgmt","type":"address"}],"name":"setManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"voterId","type":"uint256"},{"internalType":"uint256","name":"newRank","type":"uint256"}],"name":"setRank","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newManager","type":"address"}],"name":"setRankManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newHash","type":"bytes32"}],"name":"setSiteHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"siteHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"syncMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensWon","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tournaments","outputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"bytes32","name":"metadataHash","type":"bytes32"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"roundLengthSeconds","type":"uint256"},{"internalType":"uint256","name":"tokenRoundBonus","type":"uint256"},{"internalType":"uint256","name":"minimumRank","type":"uint256"},{"internalType":"uint256","name":"voiceUBI","type":"uint256"},{"internalType":"bytes32","name":"tokenListENS","type":"bytes32"},{"internalType":"address","name":"winnerOracle","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"voterId","type":"uint256"},{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"updateAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"bytes32","name":"newMetadata","type":"bytes32"},{"internalType":"uint256","name":"newBonus","type":"uint256"},{"internalType":"uint256","name":"newMinRank","type":"uint256"},{"internalType":"uint256","name":"newUBI","type":"uint256"},{"internalType":"bytes32","name":"newTokenList","type":"bytes32"},{"internalType":"address","name":"newOracle","type":"address"}],"name":"updateTournament","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"voterId","type":"uint256"},{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"uint256[]","name":"choices","type":"uint256[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint256","name":"updateRoundId","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"voterId","type":"uint256"}],"name":"withdrawWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060045534801561001557600080fd5b50604051612ee0380380612ee08339818101604052606081101561003857600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050612daf806101316000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80639bea8e541161010f578063cb22b4b4116100a2578063d624ac3411610071578063d624ac3414610b3c578063d76627a114610b99578063eaaf77e614610bf6578063fc0c546a14610c3f576101f0565b8063cb22b4b4146109fe578063cc834f5a14610a4a578063d2fad7df14610aa2578063d4a22bde14610af8576101f0565b8063b303f325116100de578063b303f325146108e4578063b78bb75514610932578063b9bc74f814610966578063c3243ff1146109a8576101f0565b80639bea8e54146108125780639f79727314610830578063a511cf5914610874578063abc56eee146108b6576101f0565b80632c159a1a116101875780637503e1b7116101565780637503e1b7146106ee578063855628161461077e57806388a8d6021461079c578063928b7c99146107d0576101f0565b80632c159a1a1461057957806339ec68a3146105ad5780633b3c3456146106215780636f60088e146106ac576101f0565b80631afb9068116101c35780631afb9068146102eb578063209380361461045f57806321e3b795146104a1578063274a52b5146104f9576101f0565b80630c2f2be7146101f5578063125bc2881461022d578063144fa6d71461027957806314794702146102bd575b600080fd5b61022b6004803603604081101561020b57600080fd5b810190808035906020019092919080359060200190929190505050610c73565b005b6102636004803603604081101561024357600080fd5b810190808035906020019092919080359060200190929190505050610dac565b6040518082815260200191505060405180910390f35b6102bb6004803603602081101561028f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dde565b005b6102e9600480360360208110156102d357600080fd5b8101908080359060200190929190505050610ee3565b005b61045d600480360360c081101561030157600080fd5b8101908080359060200190929190803590602001909291908035906020019064010000000081111561033257600080fd5b82018360208201111561034457600080fd5b8035906020019184602083028401116401000000008311171561036657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103c657600080fd5b8201836020820111156103d857600080fd5b803590602001918460208302840111640100000000831117156103fa57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190505050611110565b005b61048b6004803603602081101561047557600080fd5b8101908080359060200190929190505050611608565b6040518082815260200191505060405180910390f35b6104e1600480360360608110156104b757600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061165f565b60405180821515815260200191505060405180910390f35b610577600480360360e081101561050f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116ad565b005b61058161187c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105e3600480360360408110156105c357600080fd5b8101908080359060200190929190803590602001909291905050506118a2565b6040518082600260200280838360005b8381101561060e5780820151818401526020810190506105f3565b5050505090500191505060405180910390f35b6106aa600480360361010081101561063857600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506118fb565b005b6106ec600480360360608110156106c257600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611ba8565b005b61071a6004803603602081101561070457600080fd5b8101908080359060200190929190505050611ec7565b604051808a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001995050505050505050505060405180910390f35b610786611f35565b6040518082815260200191505060405180910390f35b6107a4611f3b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610810600480360360608110156107e657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611f5f565b005b61081a6121b6565b6040518082815260200191505060405180910390f35b6108726004803603602081101561084657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121bc565b005b6108a06004803603602081101561088a57600080fd5b8101908080359060200190929190505050612354565b6040518082815260200191505060405180910390f35b6108e2600480360360208110156108cc57600080fd5b810190808035906020019092919050505061236c565b005b61091a600480360360408110156108fa57600080fd5b81019080803590602001909291908035906020019092919050505061247e565b60405180821515815260200191505060405180910390f35b61093a6124b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109926004803603602081101561097c57600080fd5b81019080803590602001909291905050506124db565b6040518082815260200191505060405180910390f35b6109e8600480360360608110156109be57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506124fb565b6040518082815260200191505060405180910390f35b610a3460048036036040811015610a1457600080fd5b810190808035906020019092919080359060200190929190505050612542565b6040518082815260200191505060405180910390f35b610a8a60048036036060811015610a6057600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612597565b60405180821515815260200191505060405180910390f35b610ae260048036036060811015610ab857600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506125d3565b6040518082815260200191505060405180910390f35b610b3a60048036036020811015610b0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061261d565b005b610b7c60048036036060811015610b5257600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506127b3565b604051808381526020018281526020019250505060405180910390f35b610bd960048036036060811015610baf57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612842565b604051808381526020018281526020019250505060405180910390f35b610c2260048036036020811015610c0c57600080fd5b81019080803590602001909291905050506129c7565b604051808381526020018281526020019250505060405180910390f35b610c476129eb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f6e6c792072616e6b4d616e61676572206d61792063616c6c2074686973000081525060200191505060405180910390fd5b60006007600084815260200190815260200160002090506000816002015490508282600201819055507fae1829c1f5482a3b7cb166b061e12c7e866353ce0de02a15be4b2cedd844a4c384828560405180848152602001838152602001828152602001935050505060405180910390a150505050565b600060076000838152602001908152602001600020600001600084815260200190815260200160002054905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008381526020019081526020016000205490506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f7057600080fd5b505afa158015610f84573d6000803e3d6000fd5b505050506040513d6020811015610f9a57600080fd5b8101908080519060200190929190505050905060008211611023576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f7468696e6720746f2077697468647261770000000000000000000000000081525060200191505060405180910390fd5b60006008600085815260200190815260200160002081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110cf57600080fd5b505af11580156110e3573d6000803e3d6000fd5b505050506040513d60208110156110f957600080fd5b810190808051906020019092919050505050505050565b600061111b86611608565b9050600060066000888152602001908152602001600020600a0160008381526020019081526020016000209050611153888884612a11565b84518651146111ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4d69736d6174636865642063686f6963657320616e64206c656e67746873000081525060200191505060405180910390fd5b6111d5888885611ba8565b81600760008a815260200190815260200160002060000160008981526020019081526020016000208190555060008160010160008a81526020019081526020016000209050848160010181905550600061122f898b612542565b90506000805b88518110156114d55788818151811061124a57fe5b60200260200101518460000160008c848151811061126457fe5b60200260200101518152602001908152602001600020819055508460020160008b838151811061129057fe5b60200260200101518152602001908152602001600020547382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f90918b84815181106112cf57fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561131257600080fd5b505af4158015611326573d6000803e3d6000fd5b505050506040513d602081101561133c57600080fd5b81019080805190602001909291905050508560020160008c848151811061135f57fe5b6020026020010151815260200190815260200160002081905550817382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f90918b84815181106113a257fe5b60200260200101517382d7630c5eb722557de6d76575c9a7b8de718500631d3b9edf90918e87815181106113d257fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561141557600080fd5b505af4158015611429573d6000803e3d6000fd5b505050506040513d602081101561143f57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561148b57600080fd5b505af415801561149f573d6000803e3d6000fd5b505050506040513d60208110156114b557600080fd5b810190808051906020019092919050505091508080600101915050611235565b508181111561152f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612d556025913960400191505060405180910390fd5b8a858b7f04edc800316107e1cb2f3cd225f3a0272dc47c108869bfc56c57d00c58030d008c8c8c604051808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b838110156115a3578082015181840152602081019050611588565b50505050905001838103825285818151815260200191508051906020019060200280838360005b838110156115e55780820151818401526020810190506115ca565b505050509050019550505050505060405180910390a45050505050505050505050565b60008060066000848152602001908152602001600020905060008160020154905060008260030154905081421061165257808242038161164457fe5b04600101935050505061165a565b600093505050505b919050565b6000600960008581526020019081526020016000206000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1690509392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b6000600660008981526020019081526020016000209050868160010181905550858160040181905550848160050181905550838160060181905550828160070181905550818160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb00ffa191a389d361ca0f453d132d9db5309d1c7bfa83c0a43585302e602bb7788888888888888604051808881526020018781526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200197505050505050505060405180910390a15050505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118aa612cde565b600060066000858152602001908152602001600020600a0160008481526020019081526020016000209050604051806040016040528082600001548152602001826003015481525091505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b6004547382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f909160016040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611a1857600080fd5b505af4158015611a2c573d6000803e3d6000fd5b505050506040513d6020811015611a4257600080fd5b81019080805190602001909291905050506004819055506000600660006004548152602001908152602001600020905088816001018190555060008814611a895787611a8b565b425b81600201819055506004548160000181905550868160030181905550858160040181905550828160050181905550818160060181905550848160070181905550838160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6613ef55521872654a1dbad4d7f48162875bd3240bebc9d32f27072192991d166004548a8a8a8a88888c8c604051808a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001995050505050505050505060405180910390a1505050505050505050565b600060076000858152602001908152602001600020905060006006600085815260200190815260200160002090506000611be2858561247e565b90506000801515611bf488888861165f565b1515149050808015611c035750815b15611ebe576001600960008981526020019081526020016000206000888152602001908152602001600020600087815260200190815260200160002060006101000a81548160ff021916908315150217905550600080611c64898989612842565b91509150611c72888a612542565b7382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611cca57600080fd5b505af4158015611cde573d6000803e3d6000fd5b505050506040513d6020811015611cf457600080fd5b81019080805190602001909291905050508560090160008b815260200190815260200160002081905550600860008a8152602001908152602001600020547382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f9091836040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611d8a57600080fd5b505af4158015611d9e573d6000803e3d6000fd5b505050506040513d6020811015611db457600080fd5b8101908080519060200190929190505050600860008b81526020019081526020016000208190555085600101547382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611e3957600080fd5b505af4158015611e4d573d6000803e3d6000fd5b505050506040513d6020811015611e6357600080fd5b810190808051906020019092919050505086600101819055507f7d102bc7499f7a615efb0ba95eb8d125e85f54153c7287930a2c8ac506582a14888a604051808381526020018281526020019250505060405180910390a150505b50505050505050565b60066020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b60045481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006600085815260200190815260200160002090508060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461203b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f6e6c792077696e6e6572206f7261636c652063616e2063616c6c207468697381525060200191505060405180910390fd5b600061204685611608565b9050600082600a01600086815260200190815260200160002090506000151561206f878761247e565b1515146120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f526f756e6420616c7265616479207265736f6c7665640000000000000000000081525060200191505060405180910390fd5b60018501821161215c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6f206561726c7920746f207265736f6c766500000000000000000000000081525060200191505060405180910390fd5b848160000181905550838160030181905550857fdf07e825493e51009f1886bb919580bbd00b0ddc6a433f3f40655cb158beae118686604051808381526020018281526020019250505060405180910390a2505050505050565b60055481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461227d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f89778a3930aa8dd052d29a0290ba6f0a1549a0ef85e4099794ff6475297bd4668183604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b60086020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b60006005549050816005819055507f8d5040d17999087d5b86309eb9b1a1b50b2cba80a53645702ee70195eb0109278183604051808381526020018281526020019250505060405180910390a15050565b60008060066000858152602001908152602001600020600a0160008481526020019081526020016000206003015411905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060066000838152602001908152602001600020600601549050919050565b600060066000858152602001908152602001600020600a01600084815260200190815260200160002060020160008381526020019081526020016000205490509392505050565b60008060066000858152602001908152602001600020905060008160090160008581526020019081526020016000205490506000811115612587578092505050612591565b8160060154925050505b92915050565b6009602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b600060066000858152602001908152602001600020600a01600084815260200190815260200160002060010160008381526020019081526020016000206001015490509392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8caf0a9df2e1da9becb3ebfb8a56e83121a5b3f6c5622f715a939ec29c54dfdf8183604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b6000806000600660008681526020019081526020016000209050600081600a0160008681526020019081526020016000209050600081600101600089815260200190815260200160002090508060000160008360030154815260200190815260200160002054826002016000846003015481526020019081526020016000205494509450505050935093915050565b600080600060066000868152602001908152602001600020905060008061286a8888886127b3565b9150915060008082111561291c578184600401547382d7630c5eb722557de6d76575c9a7b8de718500631d3b9edf9091866040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156128d657600080fd5b505af41580156128ea573d6000803e3d6000fd5b505050506040513d602081101561290057600080fd5b81019080805190602001909291905050508161291857fe5b0490505b6000837382d7630c5eb722557de6d76575c9a7b8de718500631d3b9edf9091866040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561297757600080fd5b505af415801561298b573d6000803e3d6000fd5b505050506040513d60208110156129a157600080fd5b810190808051906020019092919050505090508082965096505050505050935093915050565b60076020528060005260406000206000915090508060010154908060020154905082565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008111612a87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f75726e616d656e74206e6f7420737461727465642079657400000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612b1157600080fd5b505afa158015612b25573d6000803e3d6000fd5b505050506040513d6020811015612b3b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614612bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612d016021913960400191505060405180910390fd5b600760008481526020019081526020016000206000016000838152602001908152602001600020548111612c54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e206f6e6c7920766f7465206f6e652074696d652070657220726f756e6481525060200191505060405180910390fd5b600760008481526020019081526020016000206002015460066000848152602001908152602001600020600501541115612cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180612d226033913960400191505060405180910390fd5b505050565b604051806040016040528060029060208202803683378082019150509050509056fe4d757374206f776e206964656e7469747920746f20766f74652077697468206974496e73756666696369656e742072616e6b20746f20706172746963697061746520696e207468697320746f75726e616d656e744d757374206e6f74207370656e64206d6f7265207468616e20796f75722062616c616e6365a264697066735822122042f74405702980323afab94db50beadc8fc4f8208ecf1f53657b1c124acf015664736f6c63430007040033000000000000000000000000288fe43139741f91a8cbb6f4add83811c794851b000000000000000000000000288fe43139741f91a8cbb6f4add83811c794851b000000000000000000000000f779cae120093807985d5f2e7dbb21d69be6b963

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80639bea8e541161010f578063cb22b4b4116100a2578063d624ac3411610071578063d624ac3414610b3c578063d76627a114610b99578063eaaf77e614610bf6578063fc0c546a14610c3f576101f0565b8063cb22b4b4146109fe578063cc834f5a14610a4a578063d2fad7df14610aa2578063d4a22bde14610af8576101f0565b8063b303f325116100de578063b303f325146108e4578063b78bb75514610932578063b9bc74f814610966578063c3243ff1146109a8576101f0565b80639bea8e54146108125780639f79727314610830578063a511cf5914610874578063abc56eee146108b6576101f0565b80632c159a1a116101875780637503e1b7116101565780637503e1b7146106ee578063855628161461077e57806388a8d6021461079c578063928b7c99146107d0576101f0565b80632c159a1a1461057957806339ec68a3146105ad5780633b3c3456146106215780636f60088e146106ac576101f0565b80631afb9068116101c35780631afb9068146102eb578063209380361461045f57806321e3b795146104a1578063274a52b5146104f9576101f0565b80630c2f2be7146101f5578063125bc2881461022d578063144fa6d71461027957806314794702146102bd575b600080fd5b61022b6004803603604081101561020b57600080fd5b810190808035906020019092919080359060200190929190505050610c73565b005b6102636004803603604081101561024357600080fd5b810190808035906020019092919080359060200190929190505050610dac565b6040518082815260200191505060405180910390f35b6102bb6004803603602081101561028f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dde565b005b6102e9600480360360208110156102d357600080fd5b8101908080359060200190929190505050610ee3565b005b61045d600480360360c081101561030157600080fd5b8101908080359060200190929190803590602001909291908035906020019064010000000081111561033257600080fd5b82018360208201111561034457600080fd5b8035906020019184602083028401116401000000008311171561036657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103c657600080fd5b8201836020820111156103d857600080fd5b803590602001918460208302840111640100000000831117156103fa57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190505050611110565b005b61048b6004803603602081101561047557600080fd5b8101908080359060200190929190505050611608565b6040518082815260200191505060405180910390f35b6104e1600480360360608110156104b757600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061165f565b60405180821515815260200191505060405180910390f35b610577600480360360e081101561050f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116ad565b005b61058161187c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105e3600480360360408110156105c357600080fd5b8101908080359060200190929190803590602001909291905050506118a2565b6040518082600260200280838360005b8381101561060e5780820151818401526020810190506105f3565b5050505090500191505060405180910390f35b6106aa600480360361010081101561063857600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506118fb565b005b6106ec600480360360608110156106c257600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611ba8565b005b61071a6004803603602081101561070457600080fd5b8101908080359060200190929190505050611ec7565b604051808a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001995050505050505050505060405180910390f35b610786611f35565b6040518082815260200191505060405180910390f35b6107a4611f3b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610810600480360360608110156107e657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611f5f565b005b61081a6121b6565b6040518082815260200191505060405180910390f35b6108726004803603602081101561084657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121bc565b005b6108a06004803603602081101561088a57600080fd5b8101908080359060200190929190505050612354565b6040518082815260200191505060405180910390f35b6108e2600480360360208110156108cc57600080fd5b810190808035906020019092919050505061236c565b005b61091a600480360360408110156108fa57600080fd5b81019080803590602001909291908035906020019092919050505061247e565b60405180821515815260200191505060405180910390f35b61093a6124b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109926004803603602081101561097c57600080fd5b81019080803590602001909291905050506124db565b6040518082815260200191505060405180910390f35b6109e8600480360360608110156109be57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506124fb565b6040518082815260200191505060405180910390f35b610a3460048036036040811015610a1457600080fd5b810190808035906020019092919080359060200190929190505050612542565b6040518082815260200191505060405180910390f35b610a8a60048036036060811015610a6057600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612597565b60405180821515815260200191505060405180910390f35b610ae260048036036060811015610ab857600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506125d3565b6040518082815260200191505060405180910390f35b610b3a60048036036020811015610b0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061261d565b005b610b7c60048036036060811015610b5257600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506127b3565b604051808381526020018281526020019250505060405180910390f35b610bd960048036036060811015610baf57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612842565b604051808381526020018281526020019250505060405180910390f35b610c2260048036036020811015610c0c57600080fd5b81019080803590602001909291905050506129c7565b604051808381526020018281526020019250505060405180910390f35b610c476129eb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f6e6c792072616e6b4d616e61676572206d61792063616c6c2074686973000081525060200191505060405180910390fd5b60006007600084815260200190815260200160002090506000816002015490508282600201819055507fae1829c1f5482a3b7cb166b061e12c7e866353ce0de02a15be4b2cedd844a4c384828560405180848152602001838152602001828152602001935050505060405180910390a150505050565b600060076000838152602001908152602001600020600001600084815260200190815260200160002054905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008381526020019081526020016000205490506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f7057600080fd5b505afa158015610f84573d6000803e3d6000fd5b505050506040513d6020811015610f9a57600080fd5b8101908080519060200190929190505050905060008211611023576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f7468696e6720746f2077697468647261770000000000000000000000000081525060200191505060405180910390fd5b60006008600085815260200190815260200160002081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110cf57600080fd5b505af11580156110e3573d6000803e3d6000fd5b505050506040513d60208110156110f957600080fd5b810190808051906020019092919050505050505050565b600061111b86611608565b9050600060066000888152602001908152602001600020600a0160008381526020019081526020016000209050611153888884612a11565b84518651146111ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4d69736d6174636865642063686f6963657320616e64206c656e67746873000081525060200191505060405180910390fd5b6111d5888885611ba8565b81600760008a815260200190815260200160002060000160008981526020019081526020016000208190555060008160010160008a81526020019081526020016000209050848160010181905550600061122f898b612542565b90506000805b88518110156114d55788818151811061124a57fe5b60200260200101518460000160008c848151811061126457fe5b60200260200101518152602001908152602001600020819055508460020160008b838151811061129057fe5b60200260200101518152602001908152602001600020547382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f90918b84815181106112cf57fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561131257600080fd5b505af4158015611326573d6000803e3d6000fd5b505050506040513d602081101561133c57600080fd5b81019080805190602001909291905050508560020160008c848151811061135f57fe5b6020026020010151815260200190815260200160002081905550817382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f90918b84815181106113a257fe5b60200260200101517382d7630c5eb722557de6d76575c9a7b8de718500631d3b9edf90918e87815181106113d257fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561141557600080fd5b505af4158015611429573d6000803e3d6000fd5b505050506040513d602081101561143f57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561148b57600080fd5b505af415801561149f573d6000803e3d6000fd5b505050506040513d60208110156114b557600080fd5b810190808051906020019092919050505091508080600101915050611235565b508181111561152f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612d556025913960400191505060405180910390fd5b8a858b7f04edc800316107e1cb2f3cd225f3a0272dc47c108869bfc56c57d00c58030d008c8c8c604051808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b838110156115a3578082015181840152602081019050611588565b50505050905001838103825285818151815260200191508051906020019060200280838360005b838110156115e55780820151818401526020810190506115ca565b505050509050019550505050505060405180910390a45050505050505050505050565b60008060066000848152602001908152602001600020905060008160020154905060008260030154905081421061165257808242038161164457fe5b04600101935050505061165a565b600093505050505b919050565b6000600960008581526020019081526020016000206000848152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1690509392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b6000600660008981526020019081526020016000209050868160010181905550858160040181905550848160050181905550838160060181905550828160070181905550818160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb00ffa191a389d361ca0f453d132d9db5309d1c7bfa83c0a43585302e602bb7788888888888888604051808881526020018781526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200197505050505050505060405180910390a15050505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118aa612cde565b600060066000858152602001908152602001600020600a0160008481526020019081526020016000209050604051806040016040528082600001548152602001826003015481525091505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b6004547382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f909160016040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611a1857600080fd5b505af4158015611a2c573d6000803e3d6000fd5b505050506040513d6020811015611a4257600080fd5b81019080805190602001909291905050506004819055506000600660006004548152602001908152602001600020905088816001018190555060008814611a895787611a8b565b425b81600201819055506004548160000181905550868160030181905550858160040181905550828160050181905550818160060181905550848160070181905550838160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6613ef55521872654a1dbad4d7f48162875bd3240bebc9d32f27072192991d166004548a8a8a8a88888c8c604051808a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001995050505050505050505060405180910390a1505050505050505050565b600060076000858152602001908152602001600020905060006006600085815260200190815260200160002090506000611be2858561247e565b90506000801515611bf488888861165f565b1515149050808015611c035750815b15611ebe576001600960008981526020019081526020016000206000888152602001908152602001600020600087815260200190815260200160002060006101000a81548160ff021916908315150217905550600080611c64898989612842565b91509150611c72888a612542565b7382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611cca57600080fd5b505af4158015611cde573d6000803e3d6000fd5b505050506040513d6020811015611cf457600080fd5b81019080805190602001909291905050508560090160008b815260200190815260200160002081905550600860008a8152602001908152602001600020547382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f9091836040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611d8a57600080fd5b505af4158015611d9e573d6000803e3d6000fd5b505050506040513d6020811015611db457600080fd5b8101908080519060200190929190505050600860008b81526020019081526020016000208190555085600101547382d7630c5eb722557de6d76575c9a7b8de7185006366098d4f9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611e3957600080fd5b505af4158015611e4d573d6000803e3d6000fd5b505050506040513d6020811015611e6357600080fd5b810190808051906020019092919050505086600101819055507f7d102bc7499f7a615efb0ba95eb8d125e85f54153c7287930a2c8ac506582a14888a604051808381526020018281526020019250505060405180910390a150505b50505050505050565b60066020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b60045481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006600085815260200190815260200160002090508060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461203b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f6e6c792077696e6e6572206f7261636c652063616e2063616c6c207468697381525060200191505060405180910390fd5b600061204685611608565b9050600082600a01600086815260200190815260200160002090506000151561206f878761247e565b1515146120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f526f756e6420616c7265616479207265736f6c7665640000000000000000000081525060200191505060405180910390fd5b60018501821161215c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6f206561726c7920746f207265736f6c766500000000000000000000000081525060200191505060405180910390fd5b848160000181905550838160030181905550857fdf07e825493e51009f1886bb919580bbd00b0ddc6a433f3f40655cb158beae118686604051808381526020018281526020019250505060405180910390a2505050505050565b60055481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461227d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f89778a3930aa8dd052d29a0290ba6f0a1549a0ef85e4099794ff6475297bd4668183604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b60086020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b60006005549050816005819055507f8d5040d17999087d5b86309eb9b1a1b50b2cba80a53645702ee70195eb0109278183604051808381526020018281526020019250505060405180910390a15050565b60008060066000858152602001908152602001600020600a0160008481526020019081526020016000206003015411905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060066000838152602001908152602001600020600601549050919050565b600060066000858152602001908152602001600020600a01600084815260200190815260200160002060020160008381526020019081526020016000205490509392505050565b60008060066000858152602001908152602001600020905060008160090160008581526020019081526020016000205490506000811115612587578092505050612591565b8160060154925050505b92915050565b6009602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b600060066000858152602001908152602001600020600a01600084815260200190815260200160002060010160008381526020019081526020016000206001015490509392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f6e6c79206d616e6167656d656e74206d61792063616c6c207468697300000081525060200191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8caf0a9df2e1da9becb3ebfb8a56e83121a5b3f6c5622f715a939ec29c54dfdf8183604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b6000806000600660008681526020019081526020016000209050600081600a0160008681526020019081526020016000209050600081600101600089815260200190815260200160002090508060000160008360030154815260200190815260200160002054826002016000846003015481526020019081526020016000205494509450505050935093915050565b600080600060066000868152602001908152602001600020905060008061286a8888886127b3565b9150915060008082111561291c578184600401547382d7630c5eb722557de6d76575c9a7b8de718500631d3b9edf9091866040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156128d657600080fd5b505af41580156128ea573d6000803e3d6000fd5b505050506040513d602081101561290057600080fd5b81019080805190602001909291905050508161291857fe5b0490505b6000837382d7630c5eb722557de6d76575c9a7b8de718500631d3b9edf9091866040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561297757600080fd5b505af415801561298b573d6000803e3d6000fd5b505050506040513d60208110156129a157600080fd5b810190808051906020019092919050505090508082965096505050505050935093915050565b60076020528060005260406000206000915090508060010154908060020154905082565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008111612a87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f75726e616d656e74206e6f7420737461727465642079657400000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612b1157600080fd5b505afa158015612b25573d6000803e3d6000fd5b505050506040513d6020811015612b3b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614612bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612d016021913960400191505060405180910390fd5b600760008481526020019081526020016000206000016000838152602001908152602001600020548111612c54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e206f6e6c7920766f7465206f6e652074696d652070657220726f756e6481525060200191505060405180910390fd5b600760008481526020019081526020016000206002015460066000848152602001908152602001600020600501541115612cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180612d226033913960400191505060405180910390fd5b505050565b604051806040016040528060029060208202803683378082019150509050509056fe4d757374206f776e206964656e7469747920746f20766f74652077697468206974496e73756666696369656e742072616e6b20746f20706172746963697061746520696e207468697320746f75726e616d656e744d757374206e6f74207370656e64206d6f7265207468616e20796f75722062616c616e6365a264697066735822122042f74405702980323afab94db50beadc8fc4f8208ecf1f53657b1c124acf015664736f6c63430007040033

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

000000000000000000000000288fe43139741f91a8cbb6f4add83811c794851b000000000000000000000000288fe43139741f91a8cbb6f4add83811c794851b000000000000000000000000f779cae120093807985d5f2e7dbb21d69be6b963

-----Decoded View---------------
Arg [0] : mgmt (address): 0x288fE43139741F91a8Cbb6F4adD83811c794851b
Arg [1] : rankMgmt (address): 0x288fE43139741F91a8Cbb6F4adD83811c794851b
Arg [2] : id (address): 0xf779cae120093807985d5F2e7DBB21d69be6b963

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000288fe43139741f91a8cbb6f4add83811c794851b
Arg [1] : 000000000000000000000000288fe43139741f91a8cbb6f4add83811c794851b
Arg [2] : 000000000000000000000000f779cae120093807985d5f2e7dbb21d69be6b963


Libraries Used


Deployed Bytecode Sourcemap

7207:15322:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21002:302;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18561:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21310:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15857:378;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14620:1231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17767:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20334:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21417:669;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10284:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17428:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12224:978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16317:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10441:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10314:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10115:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13324:681;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10411:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22092:206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10640:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20817:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20495:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10227:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19113:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18726:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18202:353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10722:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18912:195;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22337:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19246:386;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19714:614;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;10545:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;10259:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21002:302;21086:11;;;;;;;;;;;21072:25;;:10;:25;;;21064:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21142:21;21166:10;:19;21177:7;21166:19;;;;;;;;;;;21142:43;;21195:12;21210:2;:7;;;21195:22;;21237:7;21227:2;:7;;:17;;;;21259:38;21271:7;21280;21289;21259:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21002:302;;;;:::o;18561:159::-;18642:4;18665:10;:19;18676:7;18665:19;;;;;;;;;;;:34;;:48;18700:12;18665:48;;;;;;;;;;;;18658:55;;18561:159;;;;:::o;21310:101::-;11916:10;;;;;;;;;;11902:24;;:10;:24;;;11893:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21394:9:::1;21379:5;;:25;;;;;;;;;;;;;;;;;;21310:101:::0;:::o;15857:378::-;15914:13;15930:9;:18;15940:7;15930:18;;;;;;;;;;;;15914:34;;15958:13;15974:8;;;;;;;;;;;:16;;;15991:7;15974:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15958:41;;16028:1;16017:8;:12;16009:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16186:1;16165:9;:18;16175:7;16165:18;;;;;;;;;;;:22;;;;16197:5;;;;;;;;;;;:14;;;16212:5;16219:8;16197:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15857:378;;;:::o;14620:1231::-;14818:12;14833:31;14851:12;14833:17;:31::i;:::-;14818:46;;14874:26;14903:11;:25;14915:12;14903:25;;;;;;;;;;;:32;;:41;14936:7;14903:41;;;;;;;;;;;14874:70;;14955:41;14965:7;14974:12;14988:7;14955:9;:41::i;:::-;15032:7;:14;15014:7;:14;:32;15006:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15092:51;15106:7;15115:12;15129:13;15092;:51::i;:::-;15205:7;15154:10;:19;15165:7;15154:19;;;;;;;;;;;:34;;:48;15189:12;15154:48;;;;;;;;;;;:58;;;;15223:24;15250:12;:18;;:27;15269:7;15250:27;;;;;;;;;;;15223:54;;15314:4;15287:11;:24;;:31;;;;15328:12;15343:38;15359:12;15373:7;15343:15;:38::i;:::-;15328:53;;15391:8;15419:6;15414:273;15435:7;:14;15431:1;:18;15414:273;;;15504:7;15512:1;15504:10;;;;;;;;;;;;;;15470:11;:19;;:31;15490:7;15498:1;15490:10;;;;;;;;;;;;;;15470:31;;;;;;;;;;;:44;;;;15566:12;:23;;:35;15590:7;15598:1;15590:10;;;;;;;;;;;;;;15566:35;;;;;;;;;;;;:40;;;;15607:7;15615:1;15607:10;;;;;;;;;;;;;;15566:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15528:12;:23;;:35;15552:7;15560:1;15552:10;;;;;;;;;;;;;;15528:35;;;;;;;;;;;:90;;;;15638:3;:8;;;;15647:7;15655:1;15647:10;;;;;;;;;;;;;;:16;;;;15664:7;15672:1;15664:10;;;;;;;;;;;;;;15647:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15638:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15632:44;;15451:3;;;;;;;15414:273;;;;15711:7;15704:3;:14;;15696:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15812:7;15803;15789:12;15776:68;15821:7;15830;15839:4;15776:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14620:1231;;;;;;;;;;;:::o;17767:429::-;17834:4;17850:29;17882:11;:25;17894:12;17882:25;;;;;;;;;;;17850:57;;17917:14;17934:10;:20;;;17917:37;;17964:23;17990:10;:29;;;17964:55;;18052:9;18033:15;:28;18029:161;;18121:18;18108:9;18090:15;:27;18089:50;;;;;;18084:1;:56;18077:63;;;;;;;18029:161;18178:1;18171:8;;;;;17767:429;;;;:::o;20334:155::-;20420:4;20443:7;:16;20451:7;20443:16;;;;;;;;;;;:30;20460:12;20443:30;;;;;;;;;;;:39;20474:7;20443:39;;;;;;;;;;;;;;;;;;;;;20436:46;;20334:155;;;;;:::o;21417:669::-;11916:10;;;;;;;;;;11902:24;;:10;:24;;;11893:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21602:29:::1;21634:11;:25;21646:12;21634:25;;;;;;;;;;;21602:57;;21695:11;21669:10;:23;;:37;;;;21781:8;21752:10;:26;;:37;;;;21824:10;21799;:22;;:35;;;;21866:6;21844:10;:19;;:28;;;;21908:12;21882:10;:23;;:38;;;;21956:9;21930:10;:23;;;:35;;;;;;;;;;;;;;;;;;21980:99;21998:12;22012:11;22025:8;22035:10;22047:6;22055:12;22069:9;21980:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11970:1;21417:669:::0;;;;;;;:::o;10284:23::-;;;;;;;;;;;;;:::o;17428:221::-;17500:14;;:::i;:::-;17526:19;17548:11;:25;17560:12;17548:25;;;;;;;;;;;:32;;:41;17581:7;17548:41;;;;;;;;;;;17526:63;;17599:43;;;;;;;;17607:5;:13;;;17599:43;;;;17622:5;:19;;;17599:43;;;;;;17428:221;;;;:::o;12224:978::-;11916:10;;;;;;;;;;11902:24;;:10;:24;;;11893:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12508:14:::1;;:19;;;;12528:1;12508:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;12491:14;:39;;;;12540:29;12572:11;:27;12584:14;;12572:27;;;;;;;;;;;12540:59;;12635:4;12609:10;:23;;:30;;;;12685:1;12672:9;:14;:44;;12707:9;12672:44;;;12689:15;12672:44;12649:10;:20;;:67;;;;12752:14;;12726:10;:23;;:40;;;;12808:18;12776:10;:29;;:50;;;;12865:15;12836:10;:26;;:44;;;;12915:7;12890:10;:22;;:32;;;;12954:8;12932:10;:19;;:30;;;;12998:12;12972:10;:23;;:38;;;;13046:6;13020:10;:23;;;:32;;;;;;;;;;;;;;;;;;13067:128;13085:14;;13101:4;13107:9;13118:18;13138:15;13155:7;13164:8;13174:12;13188:6;13067:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11970:1;12224:978:::0;;;;;;;;:::o;16317:990::-;16404:21;16428:10;:19;16439:7;16428:19;;;;;;;;;;;16404:43;;16457:29;16489:11;:25;16501:12;16489:25;;;;;;;;;;;16457:57;;16524:18;16545:43;16566:12;16580:7;16545:20;:43::i;:::-;16524:64;;16598:15;16660:5;16616:49;;:40;16625:7;16634:12;16648:7;16616:8;:40::i;:::-;:49;;;16598:67;;16680:10;:27;;;;;16694:13;16680:27;16676:625;;;16857:4;16815:7;:16;16823:7;16815:16;;;;;;;;;;;:30;16832:12;16815:30;;;;;;;;;;;:39;16846:7;16815:39;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;16892:21;16915:15;16934:45;16948:7;16957:12;16971:7;16934:13;:45::i;:::-;16891:88;;;;17028:38;17044:12;17058:7;17028:15;:38::i;:::-;:43;;;;17072:16;17028:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16993:10;:23;;:32;17017:7;16993:32;;;;;;;;;;;:96;;;;17124:9;:18;17134:7;17124:18;;;;;;;;;;;;:23;;;;17148:10;17124:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17103:9;:18;17113:7;17103:18;;;;;;;;;;;:56;;;;17194:2;:18;;;:23;;;;17218:16;17194:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17173:2;:18;;:62;;;;17254:36;17268:12;17282:7;17254:36;;;;;;;;;;;;;;;;;;;;;;;;16676:625;;;16317:990;;;;;;;:::o;10441:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10314:30::-;;;;:::o;10115:25::-;;;;;;;;;;;;:::o;13324:681::-;13416:29;13448:11;:25;13460:12;13448:25;;;;;;;;;;;13416:57;;13505:10;:23;;;;;;;;;;;;13491:37;;:10;:37;;;13483:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13575:19;13597:31;13615:12;13597:17;:31::i;:::-;13575:53;;13638:19;13660:10;:17;;:26;13678:7;13660:26;;;;;;;;;;;13638:48;;13751:5;13704:52;;:43;13725:12;13739:7;13704:20;:43::i;:::-;:52;;;13696:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13828:1;13818:7;:11;13801:14;:28;13793:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13880:7;13864:5;:13;;:23;;;;13919:13;13897:5;:19;;:35;;;;13961:12;13947:51;13975:7;13984:13;13947:51;;;;;;;;;;;;;;;;;;;;;;;;13324:681;;;;;;:::o;10411:23::-;;;;:::o;22092:206::-;11916:10;;;;;;;;;;11902:24;;:10;:24;;;11893:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22168:18:::1;22189:11;;;;;;;;;;;22168:32;;22224:10;22210:11;;:24;;;;;;;;;;;;;;;;;;22249:42;22268:10;22280;22249:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;11970:1;22092:206:::0;:::o;10640:39::-;;;;;;;;;;;;;;;;;:::o;20817:179::-;11916:10;;;;;;;;;;11902:24;;:10;:24;;;11893:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20887:15:::1;20905:8;;20887:26;;20934:7;20923:8;:18;;;;20956:33;20972:7;20981;20956:33;;;;;;;;;;;;;;;;;;;;;;;;11970:1;20817:179:::0;:::o;20495:173::-;20579:4;20660:1;20602:11;:25;20614:12;20602:25;;;;;;;;;;;:32;;:41;20635:7;20602:41;;;;;;;;;;;:55;;;:59;20595:66;;20495:173;;;;:::o;10227:26::-;;;;;;;;;;;;;:::o;19113:127::-;19175:4;19199:11;:25;19211:12;19199:25;;;;;;;;;;;:34;;;19192:41;;19113:127;;;:::o;18726:180::-;18816:4;18839:11;:25;18851:12;18839:25;;;;;;;;;;;:32;;:41;18872:7;18839:41;;;;;;;;;;;:52;;:60;18892:6;18839:60;;;;;;;;;;;;18832:67;;18726:180;;;;;:::o;18202:353::-;18281:4;18297:29;18329:11;:25;18341:12;18329:25;;;;;;;;;;;18297:57;;18364:17;18384:10;:23;;:32;18408:7;18384:32;;;;;;;;;;;;18364:52;;18445:1;18430:12;:16;18426:123;;;18469:12;18462:19;;;;;;18426:123;18519:10;:19;;;18512:26;;;;18202:353;;;;;:::o;10722:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18912:195::-;19005:7;19031:11;:25;19043:12;19031:25;;;;;;;;;;;:32;;:41;19064:7;19031:41;;;;;;;;;;;:47;;:56;19079:7;19031:56;;;;;;;;;;;:69;;;19024:76;;18912:195;;;;;:::o;22337:188::-;11916:10;;;;;;;;;;11902:24;;:10;:24;;;11893:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22409:15:::1;22428:10:::0;::::1;;;;;;;;;;22409:29;;22461:7;22448:10;::::0;:20:::1;;;;;;;;;;;;;;;;;;22483:35;22501:7;22510;22483:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;11970:1;22337:188:::0;:::o;19246:386::-;19339:4;19345;19361:29;19393:11;:25;19405:12;19393:25;;;;;;;;;;;19361:57;;19428:19;19450:10;:17;;:26;19468:7;19450:26;;;;;;;;;;;19428:48;;19486:21;19510:5;:11;;:20;19522:7;19510:20;;;;;;;;;;;19486:44;;19548:8;:16;;:37;19565:5;:19;;;19548:37;;;;;;;;;;;;19587:5;:16;;:37;19604:5;:19;;;19587:37;;;;;;;;;;;;19540:85;;;;;;;19246:386;;;;;;:::o;19714:614::-;19805:4;19811;19827:29;19859:11;:25;19871:12;19859:25;;;;;;;;;;;19827:57;;19895:15;19912;19931:47;19947:7;19956:12;19970:7;19931:15;:47::i;:::-;19894:84;;;;19988:15;20115:1;20102:10;:14;20098:115;;;20192:10;20145;:26;;;:32;;;;20178:10;20145:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:57;;;;;;20132:70;;20098:115;20222:21;20246:10;:16;;;;20263:10;20246:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20222:52;;20292:16;20310:10;20284:37;;;;;;;;;19714:614;;;;;;:::o;10545:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10259:19::-;;;;;;;;;;;;;:::o;14011:494::-;14119:1;14109:7;:11;14101:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14198:10;14169:39;;:8;;;;;;;;;;;:16;;;14186:7;14169:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;14161:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14274:10;:19;14285:7;14274:19;;;;;;;;;;;:34;;:48;14309:12;14274:48;;;;;;;;;;;;14264:7;:58;14256:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14418:10;:19;14429:7;14418:19;;;;;;;;;;;:24;;;14377:11;:25;14389:12;14377:25;;;;;;;;;;;:37;;;:65;;14369:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14011:494;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://42f74405702980323afab94db50beadc8fc4f8208ecf1f53657b1c124acf0156

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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.