false
true
0

Contract Address Details

0x6Ed913A50cCA907691D15c1ee9e2e012F76Ad53b

Contract Name
MinePLS
Creator
0xa36e78–370e9b at 0x17daef–68dbea
Balance
380,000 PLS ( )
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
25986547
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
MinePLS




Optimization enabled
true
Compiler version
v0.8.20+commit.a1b79de6




Optimization runs
200
EVM Version
paris




Verified at
2026-03-09T17:43:26.166278Z

Constructor Arguments

000000000000000000000000a36e78cc7ab25d599af787cfe4422e3264370e9b

Arg [0] (address) : 0xa36e78cc7ab25d599af787cfe4422e3264370e9b

              

Mine/mine.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**
 * @title  MinePLS
 * @notice Grid mining game on PulseChain.
 *
 *  ┌─────────────────────────────────────────────────────────────┐
 *  │  LAYER 1 — Every 60 seconds (Round)                         │
 *  │  • Players deploy PLS to a 5×5 grid (25 blocks)             │
 *  │  • Random block wins via commit-reveal + blockhash           │
 *  │  • Winners on winning block split 90% of the round pool      │
 *  │  • Repeat every 60 seconds, all day long                     │
 *  ├─────────────────────────────────────────────────────────────┤
 *  │  LAYER 2 — Every day at 12:00 UTC (PLS Pot Jackpot)         │
 *  │  • 5% of every deploy accumulates in the PLS Pot             │
 *  │  • At 12:00 UTC, ONE winner is drawn from all players        │
 *  │    who won at least one round that day                        │
 *  │  • Weighted by rounds won: more wins = higher chance         │
 *  │  • Winner takes the ENTIRE accumulated PLS Pot               │
 *  └─────────────────────────────────────────────────────────────┘
 *
 *  FEE STRUCTURE (on every deploy)
 *  ────────────────────────────────
 *   5%  → Platform  (feeCollector, instant)
 *   5%  → PLS Pot   (daily jackpot accumulator)
 *   90% → Round pool (split to winning-block miners)
 *
 *  MINIMUM DEPLOY:  100,000 PLS per block
 *
 *  RANDOMNESS:  Commit-reveal + blockhash (no Chainlink on PulseChain)
 */
contract MinePLS {

    // ─────────────────────────────────────────────────────────
    //  Constants
    // ─────────────────────────────────────────────────────────

    uint8   public constant GRID_SIZE            = 25;
    uint256 public roundDuration = 300; // 5 minutes, changeable by owner
    uint256 public constant MIN_DEPLOY_PER_BLOCK = 100_000 ether;
    uint256 public constant PLATFORM_FEE_BPS     = 500;   // 5%
    uint256 public constant POT_FEE_BPS          = 500;   // 5%
    uint256 public constant BPS_DENOM            = 10_000;
    uint256 public constant JACKPOT_HOUR         = 12;    // 12:00 UTC daily
    uint256 public constant ONE_DAY              = 86400; // seconds

    // ─────────────────────────────────────────────────────────
    //  Storage
    // ─────────────────────────────────────────────────────────

    address public owner;
    address public feeCollector;

    // Round state
    uint64  public currentRoundId;
    uint256 public roundStartTime;

    // PLS Pot (daily jackpot)
    uint256 public plsPot;
    uint256 public lastJackpotTime;   // timestamp of last jackpot draw
    bool    public jackpotCommitted;
    bytes32 public jackpotCommitHash;

    // Commit-reveal per round
    mapping(uint64 => bytes32) public roundCommit;
    mapping(uint64 => bool)    public roundCommitted;

    struct Round {
        uint256 totalDeployed;
        uint8   winningBlock;
        bool    settled;
        uint256 claimablePool;
        uint256 dayId;        // which UTC day this round belongs to (timestamp / ONE_DAY)
    }
    mapping(uint64 => Round) public rounds;

    mapping(uint64 => mapping(uint8 => uint256))                     public blockDeployed;
    mapping(uint64 => mapping(uint8 => mapping(address => uint256))) public minerOnBlock;
    mapping(uint64 => mapping(address => uint32))                    public minerMask;

    // Daily jackpot eligibility:
    // dayId → list of daily winners (players who won at least 1 round that day)
    // dayId → player → number of rounds won that day (weight)
    mapping(uint256 => address[]) public dailyWinnerList;
    mapping(uint256 => mapping(address => uint256)) public dailyWinCount;
    mapping(uint256 => uint256) public dailyTotalWins;

    // Jackpot history
    struct JackpotDraw {
        uint256 dayId;
        address winner;
        uint256 amount;
        uint256 timestamp;
    }
    JackpotDraw[] public jackpotHistory;

    // Pending PLS rewards (round winnings + possible jackpot)
    mapping(address => uint256) public pendingRewards;

    // Lifetime stats
    mapping(address => uint256) public lifetimeDeployed;
    mapping(address => uint256) public lifetimeWon;
    mapping(address => uint64)  public lifetimeRoundsPlayed;
    mapping(address => uint64)  public lifetimeRoundsWon;

    // ─────────────────────────────────────────────────────────
    //  Events
    // ─────────────────────────────────────────────────────────

    event RoundStarted(uint64 indexed roundId, uint256 startTime, uint256 endTime);
    event Deployed(
        uint64  indexed roundId,
        address indexed miner,
        uint8[]         blockIds,
        uint256         grossAmount,
        uint256         netAmount,
        uint256         platformFee,
        uint256         potFee
    );
    event RoundSettled(
        uint64  indexed roundId,
        uint8           winningBlock,
        uint256         claimablePool,
        uint256         dayId
    );
    event WinnersCredited(uint64 indexed roundId, uint256 totalCredited, uint256 winnerCount);
    event RewardClaimed(address indexed user, uint256 amount);
    event CommitSubmitted(uint64 indexed roundId, bytes32 commitHash);
    event JackpotCommitSubmitted(bytes32 commitHash, uint256 drawTime);
    event JackpotDrawn(uint256 indexed dayId, address indexed winner, uint256 amount, uint256 winnerCount);
    event NoJackpotWinners(uint256 indexed dayId, uint256 potRolledOver);
    event FeeCollectorUpdated(address indexed newCollector);
    event OwnershipTransferred(address indexed prev, address indexed next);

    // ─────────────────────────────────────────────────────────
    //  Errors
    // ─────────────────────────────────────────────────────────

    error NotOwner();
    error RoundNotActive();
    error AlreadyDeployedThisRound();
    error InvalidBlockIds();
    error InsufficientValue();
    error RoundNotSettleable();
    error NotCommitted();
    error AlreadyCommitted();
    error BadSecret();
    error RoundNotSettled();
    error NoRewards();
    error TransferFailed();
    error InvalidAddress();
    error JackpotNotReady();
    error JackpotAlreadyDrawnToday();

    // ─────────────────────────────────────────────────────────
    //  Modifier
    // ─────────────────────────────────────────────────────────

    modifier onlyOwner() {
        if (msg.sender != owner) revert NotOwner();
        _;
    }

    // ─────────────────────────────────────────────────────────
    //  Constructor
    // ─────────────────────────────────────────────────────────

    constructor(address _feeCollector) {
        if (_feeCollector == address(0)) revert InvalidAddress();
        owner            = msg.sender;
        feeCollector     = _feeCollector;
        // Set lastJackpotTime to today's 12:00 UTC so first draw is tomorrow 12:00
        lastJackpotTime  = _todayNoon();
        _startRound();
    }

    // ─────────────────────────────────────────────────────────
    //  PLAYER — Deploy PLS
    // ─────────────────────────────────────────────────────────

    /**
     * @notice Deploy PLS to 1–25 grid blocks. Minimum 100,000 PLS per block.
     *         10% fee: 5% platform (instant), 5% PLS Pot (daily jackpot).
     *         One deploy per address per round.
     * @param blockIds  Unique block IDs in [0, 24].
     */
    function deploy(uint8[] calldata blockIds) external payable {
        uint64 rid = currentRoundId;
        if (block.timestamp >= roundStartTime + roundDuration) revert RoundNotActive();

        uint256 n = blockIds.length;
        if (n == 0 || n > GRID_SIZE) revert InvalidBlockIds();

        uint32 mask = 0;
        for (uint256 i = 0; i < n; i++) {
            if (blockIds[i] >= GRID_SIZE) revert InvalidBlockIds();
            uint32 bit = uint32(1) << blockIds[i];
            if (mask & bit != 0) revert InvalidBlockIds();
            mask |= bit;
        }

        if (minerMask[rid][msg.sender] != 0) revert AlreadyDeployedThisRound();
        if (msg.value < MIN_DEPLOY_PER_BLOCK * n) revert InsufficientValue();

        uint256 gross       = msg.value;
        uint256 platformFee = (gross * PLATFORM_FEE_BPS) / BPS_DENOM;
        uint256 potFee      = (gross * POT_FEE_BPS)      / BPS_DENOM;
        uint256 net         = gross - platformFee - potFee;
        uint256 perBlock    = net / n;

        _sendPLS(feeCollector, platformFee);
        plsPot += potFee;

        minerMask[rid][msg.sender]  = mask;
        rounds[rid].totalDeployed  += net;
        rounds[rid].dayId           = block.timestamp / ONE_DAY;

        for (uint256 i = 0; i < n; i++) {
            uint8 bid = blockIds[i];
            blockDeployed[rid][bid]            += perBlock;
            minerOnBlock[rid][bid][msg.sender] += perBlock;
        }

        lifetimeDeployed[msg.sender]     += gross;
        lifetimeRoundsPlayed[msg.sender] += 1;

        emit Deployed(rid, msg.sender, blockIds, gross, net, platformFee, potFee);
    }

    // ─────────────────────────────────────────────────────────
    //  PLAYER — Withdraw Rewards
    // ─────────────────────────────────────────────────────────

    /**
     * @notice Withdraw all pending PLS rewards (round winnings + jackpot if won).
     *         No additional fee on withdrawal.
     */
    function claimRewards() external {
        uint256 amount = pendingRewards[msg.sender];
        if (amount == 0) revert NoRewards();
        pendingRewards[msg.sender] = 0;
        _sendPLS(msg.sender, amount);
        emit RewardClaimed(msg.sender, amount);
    }

    // ─────────────────────────────────────────────────────────
    //  ROUND SETTLEMENT — Commit / Reveal
    // ─────────────────────────────────────────────────────────

    /**
     * @notice Owner submits commitment before round ends.
     *         commitHash = keccak256(abi.encodePacked(secret, currentRoundId))
     */
    function commitSecret(bytes32 commitHash) external onlyOwner {
        uint64 rid = currentRoundId;
        if (roundCommitted[rid]) revert AlreadyCommitted();
        roundCommit[rid]    = commitHash;
        roundCommitted[rid] = true;
        emit CommitSubmitted(rid, commitHash);
    }

    /**
     * @notice Settle the expired round. Callable by anyone after round duration.
     * @param secret  Preimage used in commitSecret().
     */
    function settleRound(bytes32 secret) external {
        uint64 rid = currentRoundId;
        if (block.timestamp < roundStartTime + roundDuration) revert RoundNotSettleable();
        if (!roundCommitted[rid]) revert NotCommitted();
        if (keccak256(abi.encodePacked(secret, rid)) != roundCommit[rid]) revert BadSecret();

        Round storage r = rounds[rid];
        r.settled = true;
        r.dayId   = block.timestamp / ONE_DAY;

        uint256 total = r.totalDeployed;

        if (total == 0) {
            _startRound();
            emit RoundSettled(rid, 0, 0, r.dayId);
            return;
        }

        uint256 rand = uint256(
            keccak256(abi.encodePacked(secret, blockhash(block.number - 1), block.timestamp, rid))
        );

        uint8   winBlock   = uint8(rand % GRID_SIZE);
        r.winningBlock     = winBlock;
        uint256 winnerPool = blockDeployed[rid][winBlock];

        if (winnerPool == 0) {
            // No miners on winning block — net pool rolls to pot
            plsPot += total;
            _startRound();
            emit RoundSettled(rid, winBlock, 0, r.dayId);
            return;
        }

        r.claimablePool = total;

        _startRound();
        emit RoundSettled(rid, winBlock, total, r.dayId);
    }

    /**
     * @notice Credit winning miners for a settled round.
     *         Also registers winners as eligible for today's jackpot draw.
     *         Idempotent — already-credited miners are skipped.
     * @param roundId  The settled round ID.
     * @param miners   Addresses that deployed to the winning block.
     */
    function creditWinners(uint64 roundId, address[] calldata miners) external {
        Round storage r = rounds[roundId];
        if (!r.settled) revert RoundNotSettled();

        uint8   wb      = r.winningBlock;
        uint256 winPool = blockDeployed[roundId][wb];
        if (winPool == 0) return;

        uint256 claimable = r.claimablePool;
        uint256 credited  = 0;
        uint256 count     = 0;
        uint256 dayId     = r.dayId;

        for (uint256 i = 0; i < miners.length; i++) {
            address miner   = miners[i];
            uint256 deposit = minerOnBlock[roundId][wb][miner];
            if (deposit == 0) continue;

            minerOnBlock[roundId][wb][miner] = 0; // prevent double-credit

            uint256 reward        = (claimable * deposit) / winPool;
            pendingRewards[miner] += reward;
            lifetimeWon[miner]    += reward;
            credited              += reward;
            count++;

            // Register for daily jackpot eligibility
            if (dailyWinCount[dayId][miner] == 0) {
                dailyWinnerList[dayId].push(miner);
            }
            dailyWinCount[dayId][miner] += 1;
            dailyTotalWins[dayId]       += 1;
            lifetimeRoundsWon[miner]    += 1;
        }

        emit WinnersCredited(roundId, credited, count);
    }

    // ─────────────────────────────────────────────────────────
    //  DAILY JACKPOT — 12:00 UTC
    // ─────────────────────────────────────────────────────────

    /**
     * @notice Owner commits a secret for the daily jackpot draw.
     *         Call this before 12:00 UTC on the draw day.
     *         commitHash = keccak256(abi.encodePacked(secret, dayId))
     */
    function commitJackpotSecret(bytes32 commitHash) external onlyOwner {
        if (jackpotCommitted) revert AlreadyCommitted();
        jackpotCommitHash = commitHash;
        jackpotCommitted  = true;
        emit JackpotCommitSubmitted(commitHash, _todayNoon());
    }

    /**
     * @notice Draw the daily PLS Pot jackpot.
     *         Can be called by anyone at or after 12:00 UTC today,
     *         as long as at least 24 hours have passed since the last draw.
     *
     *         Winner selection: weighted random among all players who won
     *         at least one round yesterday (the completed day).
     *         Weight = number of rounds won that day.
     *
     * @param secret  Preimage for the jackpot commit.
     */
    function drawJackpot(bytes32 secret) external {
        // Must be 12:00 UTC or later today
        if (block.timestamp < _todayNoon()) revert JackpotNotReady();

        // Must not have drawn today already
        if (lastJackpotTime >= _todayNoon()) revert JackpotAlreadyDrawnToday();

        // Verify commit
        if (!jackpotCommitted) revert NotCommitted();
        uint256 drawDayId = block.timestamp / ONE_DAY;
        if (keccak256(abi.encodePacked(secret, drawDayId)) != jackpotCommitHash) revert BadSecret();

        // Reset commit for next draw
        jackpotCommitted  = false;
        jackpotCommitHash = bytes32(0);

        // Use YESTERDAY's winners (the completed day)
        uint256 eligibleDayId = drawDayId - 1;
        uint256 totalWins     = dailyTotalWins[eligibleDayId];
        address[] storage candidates = dailyWinnerList[eligibleDayId];

        lastJackpotTime = block.timestamp;

        if (candidates.length == 0 || totalWins == 0 || plsPot == 0) {
            // No eligible winners or empty pot — roll over
            emit NoJackpotWinners(eligibleDayId, plsPot);
            return;
        }

        // Weighted random selection using commit-reveal + blockhash
        uint256 rand = uint256(
            keccak256(abi.encodePacked(secret, blockhash(block.number - 1), block.timestamp, eligibleDayId))
        );

        // Pick weighted winner
        uint256 pick    = rand % totalWins;
        uint256 running = 0;
        address winner  = candidates[0]; // fallback

        for (uint256 i = 0; i < candidates.length; i++) {
            running += dailyWinCount[eligibleDayId][candidates[i]];
            if (pick < running) {
                winner = candidates[i];
                break;
            }
        }

        uint256 prize = plsPot;
        plsPot = 0;

        pendingRewards[winner] += prize;
        lifetimeWon[winner]    += prize;

        jackpotHistory.push(JackpotDraw({
            dayId:     eligibleDayId,
            winner:    winner,
            amount:    prize,
            timestamp: block.timestamp
        }));

        emit JackpotDrawn(eligibleDayId, winner, prize, candidates.length);
    }

    // ─────────────────────────────────────────────────────────
    //  VIEW FUNCTIONS
    // ─────────────────────────────────────────────────────────

    struct RoundInfo {
        uint64  roundId;
        uint256 startTime;
        uint256 endTime;
        uint256 totalDeployed;
        uint256 timeRemaining;
        bool    isActive;
        bool    settled;
        uint8   winningBlock;
        uint256 claimablePool;
        uint256 currentPlsPot;
        uint256 nextJackpotTime;
        uint256 currentDayId;
    }

    function getCurrentRoundInfo() external view returns (RoundInfo memory) {
        uint64  rid  = currentRoundId;
        uint256 end  = roundStartTime + roundDuration;
        uint256 now_ = block.timestamp;
        Round storage r = rounds[rid];
        return RoundInfo({
            roundId:         rid,
            startTime:       roundStartTime,
            endTime:         end,
            totalDeployed:   r.totalDeployed,
            timeRemaining:   now_ >= end ? 0 : end - now_,
            isActive:        now_ < end,
            settled:         r.settled,
            winningBlock:    r.winningBlock,
            claimablePool:   r.claimablePool,
            currentPlsPot:   plsPot,
            nextJackpotTime: _nextNoon(),
            currentDayId:    now_ / ONE_DAY
        });
    }

    function getBlockDeployed(uint64 roundId) external view returns (uint256[25] memory arr) {
        for (uint8 i = 0; i < 25; i++) {
            arr[i] = blockDeployed[roundId][i];
        }
    }

    function getMinerInfo(uint64 roundId, address miner)
        external view
        returns (uint32 mask, uint256[25] memory amounts)
    {
        mask = minerMask[roundId][miner];
        for (uint8 i = 0; i < 25; i++) {
            amounts[i] = minerOnBlock[roundId][i][miner];
        }
    }

    function getWinnerReward(uint64 roundId, address miner) external view returns (uint256) {
        Round storage r = rounds[roundId];
        if (!r.settled) return 0;
        uint256 deposit = minerOnBlock[roundId][r.winningBlock][miner];
        if (deposit == 0) return 0;
        uint256 wp = blockDeployed[roundId][r.winningBlock];
        if (wp == 0) return 0;
        return (r.claimablePool * deposit) / wp;
    }

    function getUserStats(address user)
        external view
        returns (
            uint256 pending,
            uint256 deployed,
            uint256 won,
            uint64  roundsPlayed,
            uint64  roundsWon
        )
    {
        return (
            pendingRewards[user],
            lifetimeDeployed[user],
            lifetimeWon[user],
            lifetimeRoundsPlayed[user],
            lifetimeRoundsWon[user]
        );
    }

    /// @notice Check if an address is eligible for today's jackpot (won at least 1 round today).
    function getDailyEligibility(address user, uint256 dayId)
        external view
        returns (bool eligible, uint256 winsToday, uint256 totalWinsToday, uint256 weight)
    {
        winsToday      = dailyWinCount[dayId][user];
        totalWinsToday = dailyTotalWins[dayId];
        eligible       = winsToday > 0;
        weight         = totalWinsToday > 0
            ? (winsToday * 10000) / totalWinsToday  // basis points (e.g. 2500 = 25%)
            : 0;
    }

    /// @notice How many seconds until next 12:00 UTC jackpot draw.
    function timeUntilJackpot() external view returns (uint256) {
        uint256 next = _nextNoon();
        if (block.timestamp >= next) return 0;
        return next - block.timestamp;
    }

    function getJackpotHistoryLength() external view returns (uint256) {
        return jackpotHistory.length;
    }

    function getJackpotHistory(uint256 index) external view returns (JackpotDraw memory) {
        return jackpotHistory[index];
    }

    function getLastJackpots(uint256 count) external view returns (JackpotDraw[] memory) {
        uint256 len    = jackpotHistory.length;
        uint256 result = count > len ? len : count;
        JackpotDraw[] memory out = new JackpotDraw[](result);
        for (uint256 i = 0; i < result; i++) {
            out[i] = jackpotHistory[len - result + i];
        }
        return out;
    }

    // ─────────────────────────────────────────────────────────
    //  ADMIN
    // ─────────────────────────────────────────────────────────

    function emergencyNewRound() external onlyOwner {
        uint64 rid = currentRoundId;
        Round storage r = rounds[rid];
        // Force settle current stuck round with no winners
        // Pool rolls to plsPot
        if (!r.settled) {
            r.settled = true;
            r.dayId   = block.timestamp / ONE_DAY;
            if (r.totalDeployed > 0) {
                plsPot += r.totalDeployed;
            }
        }
        // Reset commit so new round can start fresh
        roundCommitted[rid] = false;
        roundCommit[rid]    = bytes32(0);
        _startRound();
        emit RoundSettled(rid, 0, 0, r.dayId);
    }

    function setRoundDuration(uint256 newDuration) external onlyOwner {
        require(newDuration >= 60 && newDuration <= 3600, "Duration must be 60-3600s");
        roundDuration = newDuration;
    }

    function setFeeCollector(address _feeCollector) external onlyOwner {
        if (_feeCollector == address(0)) revert InvalidAddress();
        feeCollector = _feeCollector;
        emit FeeCollectorUpdated(_feeCollector);
    }

    function transferOwnership(address newOwner) external onlyOwner {
        if (newOwner == address(0)) revert InvalidAddress();
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    function emergencyWithdraw(uint256 amount) external onlyOwner {
        _sendPLS(owner, amount);
    }

    // ─────────────────────────────────────────────────────────
    //  INTERNAL HELPERS
    // ─────────────────────────────────────────────────────────

    function _startRound() internal {
        currentRoundId++;
        roundStartTime = block.timestamp;
        emit RoundStarted(currentRoundId, roundStartTime, roundStartTime + roundDuration);
    }

    /// @dev Returns today's 12:00 UTC timestamp.
    function _todayNoon() internal view returns (uint256) {
        uint256 today = (block.timestamp / ONE_DAY) * ONE_DAY;
        return today + (JACKPOT_HOUR * 3600);
    }

    /// @dev Returns next 12:00 UTC (tomorrow if already past noon today).
    function _nextNoon() internal view returns (uint256) {
        uint256 noon = _todayNoon();
        if (block.timestamp >= noon) {
            return noon + ONE_DAY;
        }
        return noon;
    }

    function _sendPLS(address to, uint256 amount) internal {
        if (amount == 0) return;
        (bool ok, ) = payable(to).call{value: amount}("");
        if (!ok) revert TransferFailed();
    }

    receive() external payable {}
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"paris","compilationTarget":{"Mine/mine.sol":"MinePLS"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_feeCollector","internalType":"address"}]},{"type":"error","name":"AlreadyCommitted","inputs":[]},{"type":"error","name":"AlreadyDeployedThisRound","inputs":[]},{"type":"error","name":"BadSecret","inputs":[]},{"type":"error","name":"InsufficientValue","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidBlockIds","inputs":[]},{"type":"error","name":"JackpotAlreadyDrawnToday","inputs":[]},{"type":"error","name":"JackpotNotReady","inputs":[]},{"type":"error","name":"NoRewards","inputs":[]},{"type":"error","name":"NotCommitted","inputs":[]},{"type":"error","name":"NotOwner","inputs":[]},{"type":"error","name":"RoundNotActive","inputs":[]},{"type":"error","name":"RoundNotSettleable","inputs":[]},{"type":"error","name":"RoundNotSettled","inputs":[]},{"type":"error","name":"TransferFailed","inputs":[]},{"type":"event","name":"CommitSubmitted","inputs":[{"type":"uint64","name":"roundId","internalType":"uint64","indexed":true},{"type":"bytes32","name":"commitHash","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"Deployed","inputs":[{"type":"uint64","name":"roundId","internalType":"uint64","indexed":true},{"type":"address","name":"miner","internalType":"address","indexed":true},{"type":"uint8[]","name":"blockIds","internalType":"uint8[]","indexed":false},{"type":"uint256","name":"grossAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"netAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"platformFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"potFee","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"FeeCollectorUpdated","inputs":[{"type":"address","name":"newCollector","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"JackpotCommitSubmitted","inputs":[{"type":"bytes32","name":"commitHash","internalType":"bytes32","indexed":false},{"type":"uint256","name":"drawTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"JackpotDrawn","inputs":[{"type":"uint256","name":"dayId","internalType":"uint256","indexed":true},{"type":"address","name":"winner","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"winnerCount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NoJackpotWinners","inputs":[{"type":"uint256","name":"dayId","internalType":"uint256","indexed":true},{"type":"uint256","name":"potRolledOver","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"prev","internalType":"address","indexed":true},{"type":"address","name":"next","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RewardClaimed","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"RoundSettled","inputs":[{"type":"uint64","name":"roundId","internalType":"uint64","indexed":true},{"type":"uint8","name":"winningBlock","internalType":"uint8","indexed":false},{"type":"uint256","name":"claimablePool","internalType":"uint256","indexed":false},{"type":"uint256","name":"dayId","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"RoundStarted","inputs":[{"type":"uint64","name":"roundId","internalType":"uint64","indexed":true},{"type":"uint256","name":"startTime","internalType":"uint256","indexed":false},{"type":"uint256","name":"endTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WinnersCredited","inputs":[{"type":"uint64","name":"roundId","internalType":"uint64","indexed":true},{"type":"uint256","name":"totalCredited","internalType":"uint256","indexed":false},{"type":"uint256","name":"winnerCount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BPS_DENOM","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"GRID_SIZE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"JACKPOT_HOUR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_DEPLOY_PER_BLOCK","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"ONE_DAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PLATFORM_FEE_BPS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POT_FEE_BPS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"blockDeployed","inputs":[{"type":"uint64","name":"","internalType":"uint64"},{"type":"uint8","name":"","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimRewards","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"commitJackpotSecret","inputs":[{"type":"bytes32","name":"commitHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"commitSecret","inputs":[{"type":"bytes32","name":"commitHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"creditWinners","inputs":[{"type":"uint64","name":"roundId","internalType":"uint64"},{"type":"address[]","name":"miners","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"currentRoundId","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"dailyTotalWins","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"dailyWinCount","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"dailyWinnerList","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"deploy","inputs":[{"type":"uint8[]","name":"blockIds","internalType":"uint8[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"drawJackpot","inputs":[{"type":"bytes32","name":"secret","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyNewRound","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeCollector","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[25]","name":"arr","internalType":"uint256[25]"}],"name":"getBlockDeployed","inputs":[{"type":"uint64","name":"roundId","internalType":"uint64"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct MinePLS.RoundInfo","components":[{"type":"uint64","name":"roundId","internalType":"uint64"},{"type":"uint256","name":"startTime","internalType":"uint256"},{"type":"uint256","name":"endTime","internalType":"uint256"},{"type":"uint256","name":"totalDeployed","internalType":"uint256"},{"type":"uint256","name":"timeRemaining","internalType":"uint256"},{"type":"bool","name":"isActive","internalType":"bool"},{"type":"bool","name":"settled","internalType":"bool"},{"type":"uint8","name":"winningBlock","internalType":"uint8"},{"type":"uint256","name":"claimablePool","internalType":"uint256"},{"type":"uint256","name":"currentPlsPot","internalType":"uint256"},{"type":"uint256","name":"nextJackpotTime","internalType":"uint256"},{"type":"uint256","name":"currentDayId","internalType":"uint256"}]}],"name":"getCurrentRoundInfo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"eligible","internalType":"bool"},{"type":"uint256","name":"winsToday","internalType":"uint256"},{"type":"uint256","name":"totalWinsToday","internalType":"uint256"},{"type":"uint256","name":"weight","internalType":"uint256"}],"name":"getDailyEligibility","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"dayId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct MinePLS.JackpotDraw","components":[{"type":"uint256","name":"dayId","internalType":"uint256"},{"type":"address","name":"winner","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"}]}],"name":"getJackpotHistory","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getJackpotHistoryLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct MinePLS.JackpotDraw[]","components":[{"type":"uint256","name":"dayId","internalType":"uint256"},{"type":"address","name":"winner","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"}]}],"name":"getLastJackpots","inputs":[{"type":"uint256","name":"count","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"mask","internalType":"uint32"},{"type":"uint256[25]","name":"amounts","internalType":"uint256[25]"}],"name":"getMinerInfo","inputs":[{"type":"uint64","name":"roundId","internalType":"uint64"},{"type":"address","name":"miner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"pending","internalType":"uint256"},{"type":"uint256","name":"deployed","internalType":"uint256"},{"type":"uint256","name":"won","internalType":"uint256"},{"type":"uint64","name":"roundsPlayed","internalType":"uint64"},{"type":"uint64","name":"roundsWon","internalType":"uint64"}],"name":"getUserStats","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getWinnerReward","inputs":[{"type":"uint64","name":"roundId","internalType":"uint64"},{"type":"address","name":"miner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"jackpotCommitHash","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"jackpotCommitted","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"dayId","internalType":"uint256"},{"type":"address","name":"winner","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"}],"name":"jackpotHistory","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastJackpotTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lifetimeDeployed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"lifetimeRoundsPlayed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"lifetimeRoundsWon","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lifetimeWon","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"minerMask","inputs":[{"type":"uint64","name":"","internalType":"uint64"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minerOnBlock","inputs":[{"type":"uint64","name":"","internalType":"uint64"},{"type":"uint8","name":"","internalType":"uint8"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingRewards","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"plsPot","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"roundCommit","inputs":[{"type":"uint64","name":"","internalType":"uint64"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"roundCommitted","inputs":[{"type":"uint64","name":"","internalType":"uint64"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"roundDuration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"roundStartTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalDeployed","internalType":"uint256"},{"type":"uint8","name":"winningBlock","internalType":"uint8"},{"type":"bool","name":"settled","internalType":"bool"},{"type":"uint256","name":"claimablePool","internalType":"uint256"},{"type":"uint256","name":"dayId","internalType":"uint256"}],"name":"rounds","inputs":[{"type":"uint64","name":"","internalType":"uint64"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeCollector","inputs":[{"type":"address","name":"_feeCollector","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRoundDuration","inputs":[{"type":"uint256","name":"newDuration","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"settleRound","inputs":[{"type":"bytes32","name":"secret","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timeUntilJackpot","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x608060405261012c6000553480156200001757600080fd5b5060405162003071380380620030718339810160408190526200003a916200018e565b6001600160a01b038116620000625760405163e6c4247b60e01b815260040160405180910390fd5b60018054336001600160a01b031991821617909155600280549091166001600160a01b03831617905562000095620000a9565b600555620000a2620000eb565b5062000260565b60008062015180620000bc8142620001d6565b620000c89190620001f9565b9050620000d9600c610e10620001f9565b620000e5908262000219565b91505090565b60028054600160a01b90046001600160401b03169060146200010d836200022f565b82546101009290920a6001600160401b03818102199093169183160217909155426003819055600254600054600160a01b90910490921692507f57223c3e85f6b584c987fa7794717b0d5cee8dd663140e6b275ca2d5feec19ca9162000174908262000219565b6040805192835260208301919091520160405180910390a2565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600082620001f457634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417620002135762000213620001c0565b92915050565b80820180821115620002135762000213620001c0565b60006001600160401b038281166002600160401b03198101620002565762000256620001c0565b6001019392505050565b612e0180620002706000396000f3fe60806040526004361061031e5760003560e01c80638da5cb5b116101ab578063c388b24d116100f7578063e050db9f11610095578063f2fde38b1161006f578063f2fde38b14610b44578063f7cb789a14610b64578063fa75251614610b7a578063ff852a2514610b9a57600080fd5b8063e050db9f14610a8c578063e65e8f5f14610adf578063f12234d414610b0c57600080fd5b8063d0b819f1116100d1578063d0b819f1146109fe578063d5e1a29f14610a2b578063dd4f8f7414610a61578063df5377c614610a7757600080fd5b8063c388b24d1461098a578063c415b95c146109a0578063ceb68b42146109c057600080fd5b8063a813532311610164578063b08817901161013e578063b08817901461089e578063b8348785146108e0578063bc3ac875146108f6578063bc75f0fa1461097457600080fd5b8063a813532314610846578063aa8e31d5146105e4578063ab7a17481461087e57600080fd5b80638da5cb5b146107425780638fcc6c5e1461077a578063902ebd041461079a5780639a80bd2f146107ba5780639cbe5efd146107e7578063a42dce801461082657600080fd5b80634e43603a1161026a5780636637e38c116102235780637fc4eda8116101fd5780637fc4eda81461068f578063843f8dac146106b6578063863e76db146106e35780638b31260f146106fa57600080fd5b80636637e38c14610629578063747dff421461063f5780637e9308661461066157600080fd5b80634e43603a1461050557806350d0e5ae146105a65780635312ea8e146105c4578063539aa77f146105e45780635609149b146105fa57806358602fa01461060f57600080fd5b806331d7a262116102d7578063372500ab116102b1578063372500ab146104905780633ff151be146104a5578063479f028f146104d25780634ba09ea0146104f257600080fd5b806331d7a2621461041657806331f872371461044357806336c92c3f1461047057600080fd5b80630282ca801461032a57806316f007af1461036a578063170456381461037f57806323418703146103bf5780632f383f70146103e157806330b8fe1c1461040157600080fd5b3661032557005b600080fd5b34801561033657600080fd5b506103576103453660046127db565b60136020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561037657600080fd5b50610357600c81565b34801561038b57600080fd5b506103af61039a366004612814565b60096020526000908152604090205460ff1681565b6040519015158152602001610361565b3480156103cb57600080fd5b506103df6103da36600461282f565b610bd0565b005b3480156103ed57600080fd5b506103df6103fc366004612893565b610eb8565b34801561040d57600080fd5b506103df611207565b34801561042257600080fd5b506103576104313660046127db565b60126020526000908152604090205481565b34801561044f57600080fd5b5061046361045e36600461282f565b611320565b60405161036191906128e5565b34801561047c57600080fd5b506103df61048b36600461282f565b6113b7565b34801561049c57600080fd5b506103df61144a565b3480156104b157600080fd5b506103576104c03660046127db565b60146020526000908152604090205481565b3480156104de57600080fd5b506103df6104ed36600461282f565b6114cd565b6103df610500366004612919565b611573565b34801561051157600080fd5b506105726105203660046127db565b6001600160a01b031660009081526012602090815260408083205460138352818420546014845282852054601585528386205460169095529290942054909491926001600160401b0390811692911690565b604080519586526020860194909452928401919091526001600160401b03908116606084015216608082015260a001610361565b3480156105b257600080fd5b5061035769152d02c7e14af680000081565b3480156105d057600080fd5b506103df6105df36600461282f565b6119d7565b3480156105f057600080fd5b506103576101f481565b34801561060657600080fd5b50610357611a1b565b34801561061b57600080fd5b506006546103af9060ff1681565b34801561063557600080fd5b5061035761271081565b34801561064b57600080fd5b50610654611a47565b604051610361919061295a565b34801561066d57600080fd5b5061068161067c366004612a04565b611ba3565b604051610361929190612a60565b34801561069b57600080fd5b506106a4601981565b60405160ff9091168152602001610361565b3480156106c257600080fd5b506106d66106d1366004612814565b611c5c565b6040516103619190612a7b565b3480156106ef57600080fd5b506103576201518081565b34801561070657600080fd5b5061071a61071536600461282f565b611ccb565b604080519485526001600160a01b039093166020850152918301526060820152608001610361565b34801561074e57600080fd5b50600154610762906001600160a01b031681565b6040516001600160a01b039091168152602001610361565b34801561078657600080fd5b506103df61079536600461282f565b611d0e565b3480156107a657600080fd5b506103576107b5366004612a04565b61213f565b3480156107c657600080fd5b506103576107d5366004612814565b60086020526000908152604090205481565b3480156107f357600080fd5b5060025461080e90600160a01b90046001600160401b031681565b6040516001600160401b039091168152602001610361565b34801561083257600080fd5b506103df6108413660046127db565b612227565b34801561085257600080fd5b50610357610861366004612a8a565b600f60209081526000928352604080842090915290825290205481565b34801561088a57600080fd5b50610762610899366004612aad565b6122c3565b3480156108aa57600080fd5b506108be6108b9366004612acf565b6122fb565b6040805194151585526020850193909352918301526060820152608001610361565b3480156108ec57600080fd5b5061035760055481565b34801561090257600080fd5b50610944610911366004612814565b600a602052600090815260409020805460018201546002830154600390930154919260ff80831693610100909304169185565b6040805195865260ff9094166020860152911515928401929092526060830191909152608082015260a001610361565b34801561098057600080fd5b5061035760075481565b34801561099657600080fd5b5061035760045481565b3480156109ac57600080fd5b50600254610762906001600160a01b031681565b3480156109cc57600080fd5b506103576109db366004612b0a565b600c60209081526000938452604080852082529284528284209052825290205481565b348015610a0a57600080fd5b50610a1e610a1936600461282f565b61235b565b6040516103619190612b4d565b348015610a3757600080fd5b5061080e610a463660046127db565b6015602052600090815260409020546001600160401b031681565b348015610a6d57600080fd5b5061035760035481565b348015610a8357600080fd5b50601154610357565b348015610a9857600080fd5b50610aca610aa7366004612a04565b600d60209081526000928352604080842090915290825290205463ffffffff1681565b60405163ffffffff9091168152602001610361565b348015610aeb57600080fd5b50610357610afa36600461282f565b60106020526000908152604090205481565b348015610b1857600080fd5b50610357610b27366004612bc2565b600b60209081526000928352604080842090915290825290205481565b348015610b5057600080fd5b506103df610b5f3660046127db565b6124ad565b348015610b7057600080fd5b5061035760005481565b348015610b8657600080fd5b506103df610b9536600461282f565b61255b565b348015610ba657600080fd5b5061080e610bb53660046127db565b6016602052600090815260409020546001600160401b031681565b600254600054600354600160a01b9092046001600160401b031691610bf59190612c02565b421015610c15576040516357ef8ef560e11b815260040160405180910390fd5b6001600160401b03811660009081526009602052604090205460ff16610c4e5760405163205e472d60e21b815260040160405180910390fd5b6001600160401b038116600090815260086020908152604091829020549151610c9191859185910191825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012014610cc55760405163e1dcd59760e01b815260040160405180910390fd5b6001600160401b0381166000908152600a6020526040902060018101805461ff001916610100179055610cfb6201518042612c2b565b600382015580546000819003610d5957610d13612627565b60038201546040805160008082526020820152908101919091526001600160401b03841690600080516020612dac8339815191529060600160405180910390a250505050565b600084610d67600143612c3f565b6040805160208082019490945291408282015242606083015260c087901b6001600160c01b03191660808301528051606881840301815260889092019052805191012090506000610db9601983612c52565b60018501805460ff191660ff83169081179091556001600160401b0387166000908152600b6020908152604080832093835292905290812054919250819003610e69578360046000828254610e0e9190612c02565b90915550610e1c9050612627565b60038501546040805160ff8516815260006020820152908101919091526001600160401b03871690600080516020612dac833981519152906060015b60405180910390a250505050505050565b60028501849055610e78612627565b60038501546040805160ff8516815260208101879052908101919091526001600160401b03871690600080516020612dac83398151915290606001610e58565b6001600160401b0383166000908152600a602052604090206001810154610100900460ff16610efa57604051632382430560e11b815260040160405180910390fd5b60018101546001600160401b0385166000908152600b6020908152604080832060ff9094168084529390915281205490819003610f3957505050505050565b600283015460038401546000908190815b888110156111b65760008a8a83818110610f6657610f66612c66565b9050602002016020810190610f7b91906127db565b6001600160401b038d166000908152600c6020908152604080832060ff8d16845282528083206001600160a01b0385168452909152812054919250819003610fc45750506111a4565b6001600160401b038d166000908152600c6020908152604080832060ff8d16845282528083206001600160a01b0386168452909152812081905588611009838a612c7c565b6110139190612c2b565b6001600160a01b038416600090815260126020526040812080549293508392909190611040908490612c02565b90915550506001600160a01b0383166000908152601460205260408120805483929061106d908490612c02565b9091555061107d90508188612c02565b96508561108981612c93565b6000878152600f602090815260408083206001600160a01b03891684529091528120549198500390506110ee576000858152600e602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790555b6000858152600f602090815260408083206001600160a01b03871684529091528120805460019290611121908490612c02565b90915550506000858152601060205260408120805460019290611145908490612c02565b90915550506001600160a01b038316600090815260166020526040812080546001929061117c9084906001600160401b0316612cac565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505050505b806111ae81612c93565b915050610f4a565b5060408051848152602081018490526001600160401b038c16917f08d3d47b87f40a45815ffcbabc28bca7ca12ebb77a75fc77b1e224bae120c0e1910160405180910390a250505050505050505050565b6001546001600160a01b03163314611232576040516330cd747160e01b815260040160405180910390fd5b600254600160a01b90046001600160401b03166000818152600a602052604090206001810154610100900460ff166112a85760018101805461ff0019166101001790556112826201518042612c2b565b60038201558054156112a8578054600480546000906112a2908490612c02565b90915550505b6001600160401b0382166000908152600960209081526040808320805460ff1916905560089091528120556112db612627565b60038101546040805160008082526020820152908101919091526001600160401b03831690600080516020612dac833981519152906060015b60405180910390a25050565b61135460405180608001604052806000815260200160006001600160a01b0316815260200160008152602001600081525090565b6011828154811061136757611367612c66565b60009182526020918290206040805160808101825260049093029091018054835260018101546001600160a01b031693830193909352600283015490820152600390910154606082015292915050565b6001546001600160a01b031633146113e2576040516330cd747160e01b815260040160405180910390fd5b603c81101580156113f55750610e108111155b6114455760405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d7573742062652036302d333630307300000000000000604482015260640160405180910390fd5b600055565b336000908152601260205260408120549081900361147b57604051630fec21fd60e21b815260040160405180910390fd5b3360008181526012602052604081205561149590826126c6565b60405181815233907f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f72419060200160405180910390a250565b6001546001600160a01b031633146114f8576040516330cd747160e01b815260040160405180910390fd5b60065460ff161561151c576040516317fd8aab60e31b815260040160405180910390fd5b60078190556006805460ff191660011790557f8882fc924e8b70043aeb7559caa6060027d5b0be574eb6d6aa05cb8cccae8b5b8161155861274b565b6040805192835260208301919091520160405180910390a150565b600254600054600354600160a01b9092046001600160401b0316916115989190612c02565b42106115b757604051633df07da560e01b815260040160405180910390fd5b818015806115c55750601981115b156115e35760405163b015b78360e01b815260040160405180910390fd5b6000805b828110156116ab57601986868381811061160357611603612c66565b90506020020160208101906116189190612cd3565b60ff16106116395760405163b015b78360e01b815260040160405180910390fd5b600086868381811061164d5761164d612c66565b90506020020160208101906116629190612cd3565b600160ff919091161b905082811663ffffffff16156116945760405163b015b78360e01b815260040160405180910390fd5b9190911790806116a381612c93565b9150506115e7565b506001600160401b0383166000908152600d6020908152604080832033845290915290205463ffffffff16156116f4576040516325b23b7360e01b815260040160405180910390fd5b6117088269152d02c7e14af6800000612c7c565b3410156117285760405163044044a560e21b815260040160405180910390fd5b34600061271061173a6101f484612c7c565b6117449190612c2b565b905060006127106117576101f485612c7c565b6117619190612c2b565b90506000816117708486612c3f565b61177a9190612c3f565b905060006117888783612c2b565b6002549091506117a1906001600160a01b0316856126c6565b82600460008282546117b39190612c02565b90915550506001600160401b0388166000818152600d602090815260408083203384528252808320805463ffffffff191663ffffffff8c16179055928252600a90529081208054849290611808908490612c02565b9091555061181b90506201518042612c2b565b6001600160401b0389166000908152600a60205260408120600301919091555b878110156119045760008b8b8381811061185757611857612c66565b905060200201602081019061186c9190612cd3565b6001600160401b038b166000908152600b6020908152604080832060ff851684529091528120805492935085929091906118a7908490612c02565b90915550506001600160401b038a166000908152600c6020908152604080832060ff851684528252808320338452909152812080548592906118ea908490612c02565b909155508291506118fc905081612c93565b91505061183b565b503360009081526013602052604081208054879290611924908490612c02565b90915550503360009081526015602052604081208054600192906119529084906001600160401b0316612cac565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550336001600160a01b0316886001600160401b03167f421a758eaaf4c544b77f05db29550e2e25946e6e9ec2d24da05e3304f08341718c8c89878a8a6040516119c396959493929190612cee565b60405180910390a350505050505050505050565b6001546001600160a01b03163314611a02576040516330cd747160e01b815260040160405180910390fd5b600154611a18906001600160a01b0316826126c6565b50565b600080611a2661277f565b9050804210611a3757600091505090565b611a414282612c3f565b91505090565b611abb60405180610180016040528060006001600160401b0316815260200160008152602001600081526020016000815260200160008152602001600015158152602001600015158152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b60025460008054600354600160a01b9093046001600160401b031692611ae19190612c02565b6001600160401b0383166000818152600a602090815260409182902082516101808101845293845260035491840191909152908201839052805460608301529192504291906080810184841015611b4157611b3c8486612c3f565b611b44565b60005b81528484106020820152600183015460ff61010082048116151560408401521660608201526002830154608082015260045460a082015260c001611b8661277f565b8152602001611b986201518085612c2b565b905295945050505050565b6000611bad6127a5565b6001600160401b0384166000908152600d602090815260408083206001600160a01b038716845290915281205463ffffffff1692505b60198160ff161015611c54576001600160401b0385166000908152600c6020908152604080832060ff85168085529083528184206001600160a01b03891685529092529091205490839060198110611c3d57611c3d612c66565b602002015280611c4c81612d50565b915050611be3565b509250929050565b611c646127a5565b60005b60198160ff161015611cc5576001600160401b0383166000908152600b6020908152604080832060ff851680855292529091205490839060198110611cae57611cae612c66565b602002015280611cbd81612d50565b915050611c67565b50919050565b60118181548110611cdb57600080fd5b600091825260209091206004909102018054600182015460028301546003909301549193506001600160a01b0316919084565b611d1661274b565b421015611d3657604051630818d73360e11b815260040160405180910390fd5b611d3e61274b565b60055410611d5f5760405163134a671f60e11b815260040160405180910390fd5b60065460ff16611d825760405163205e472d60e21b815260040160405180910390fd5b6000611d916201518042612c2b565b90506007548282604051602001611db2929190918252602082015260400190565b6040516020818303038152906040528051906020012014611de65760405163e1dcd59760e01b815260040160405180910390fd5b6006805460ff1916905560006007819055611e02600183612c3f565b600081815260106020908152604080832054600e90925290912042600555805492935090911580611e31575081155b80611e3c5750600454155b15611e8457827fa41e9a23919d382a9f89909cd4ee1f5bc2d00f6493f799e7eb66f5924faea263600454604051611e7591815260200190565b60405180910390a25050505050565b600085611e92600143612c3f565b6040805160208101939093529040908201524260608201526080810185905260a00160408051601f19818403018152919052805160209091012090506000611eda8483612c52565b905060008084600081548110611ef257611ef2612c66565b60009182526020822001546001600160a01b031691505b8554811015611fb257600f60008981526020019081526020016000206000878381548110611f3957611f39612c66565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611f689084612c02565b925082841015611fa057858181548110611f8457611f84612c66565b6000918252602090912001546001600160a01b03169150611fb2565b80611faa81612c93565b915050611f09565b50600480546000918290556001600160a01b0383168252601260205260408220805491928392611fe3908490612c02565b90915550506001600160a01b03821660009081526014602052604081208054839290612010908490612c02565b9091555050604080516080810182528981526001600160a01b03848116602080840182815284860187815242606087019081526011805460018101825560009190915296517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6860049098029788015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c69870180546001600160a01b031916919096161790945592517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a85015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b90930192909255885483518581529182015290918a917f6d86ad7a3e95676cdaa4903e8ee9d179b645e7bea42735ab1118eb81da192b3091016119c3565b6001600160401b0382166000908152600a602052604081206001810154610100900460ff16612172576000915050612221565b6001600160401b0384166000908152600c60209081526040808320600185015460ff16845282528083206001600160a01b0387168452909152812054908190036121c157600092505050612221565b6001600160401b0385166000908152600b60209081526040808320600186015460ff168452909152812054908190036122005760009350505050612221565b808284600201546122119190612c7c565b61221b9190612c2b565b93505050505b92915050565b6001546001600160a01b03163314612252576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166122795760405163e6c4247b60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517fe5693914d19c789bdee50a362998c0bc8d035a835f9871da5d51152f0582c34f90600090a250565b600e60205281600052604060002081815481106122df57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000818152600f602090815260408083206001600160a01b038616845282528083205484845260109092528220548115159281612339576000612350565b8161234684612710612c7c565b6123509190612c2b565b905092959194509250565b60115460609060008184116123705783612372565b815b90506000816001600160401b0381111561238e5761238e612d6f565b6040519080825280602002602001820160405280156123f357816020015b6123e060405180608001604052806000815260200160006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816123ac5790505b50905060005b828110156124a45760118161240e8587612c3f565b6124189190612c02565b8154811061242857612428612c66565b60009182526020918290206040805160808101825260049093029091018054835260018101546001600160a01b0316938301939093526002830154908201526003909101546060820152825183908390811061248657612486612c66565b6020026020010181905250808061249c90612c93565b9150506123f9565b50949350505050565b6001546001600160a01b031633146124d8576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166124ff5760405163e6c4247b60e01b815260040160405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314612586576040516330cd747160e01b815260040160405180910390fd5b600254600160a01b90046001600160401b031660008181526009602052604090205460ff16156125c9576040516317fd8aab60e31b815260040160405180910390fd5b6001600160401b03811660008181526008602090815260408083208690556009825291829020805460ff1916600117905590518481527fe792bca2581603ad4bfbd45ca36b38d47c208da62f2f74de32142f17594227099101611314565b60028054600160a01b90046001600160401b031690601461264783612d85565b82546101009290920a6001600160401b03818102199093169183160217909155426003819055600254600054600160a01b90910490921692507f57223c3e85f6b584c987fa7794717b0d5cee8dd663140e6b275ca2d5feec19ca916126ac9082612c02565b6040805192835260208301919091520160405180910390a2565b806000036126d2575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461271f576040519150601f19603f3d011682016040523d82523d6000602084013e612724565b606091505b5050905080612746576040516312171d8360e31b815260040160405180910390fd5b505050565b6000806201518061275c8142612c2b565b6127669190612c7c565b9050612775600c610e10612c7c565b611a419082612c02565b60008061278a61274b565b90508042106127a057611a416201518082612c02565b919050565b6040518061032001604052806019906020820280368337509192915050565b80356001600160a01b03811681146127a057600080fd5b6000602082840312156127ed57600080fd5b6127f6826127c4565b9392505050565b80356001600160401b03811681146127a057600080fd5b60006020828403121561282657600080fd5b6127f6826127fd565b60006020828403121561284157600080fd5b5035919050565b60008083601f84011261285a57600080fd5b5081356001600160401b0381111561287157600080fd5b6020830191508360208260051b850101111561288c57600080fd5b9250929050565b6000806000604084860312156128a857600080fd5b6128b1846127fd565b925060208401356001600160401b038111156128cc57600080fd5b6128d886828701612848565b9497909650939450505050565b815181526020808301516001600160a01b031690820152604080830151908201526060808301519082015260808101612221565b6000806020838503121561292c57600080fd5b82356001600160401b0381111561294257600080fd5b61294e85828601612848565b90969095509350505050565b81516001600160401b0316815261018081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a08301516129a760a084018215159052565b5060c08301516129bb60c084018215159052565b5060e08301516129d060e084018260ff169052565b5061010083810151908301526101208084015190830152610140808401519083015261016092830151929091019190915290565b60008060408385031215612a1757600080fd5b612a20836127fd565b9150612a2e602084016127c4565b90509250929050565b8060005b6019811015612a5a578151845260209384019390910190600101612a3b565b50505050565b63ffffffff8316815261034081016127f66020830184612a37565b61032081016122218284612a37565b60008060408385031215612a9d57600080fd5b82359150612a2e602084016127c4565b60008060408385031215612ac057600080fd5b50508035926020909101359150565b60008060408385031215612ae257600080fd5b612aeb836127c4565b946020939093013593505050565b803560ff811681146127a057600080fd5b600080600060608486031215612b1f57600080fd5b612b28846127fd565b9250612b3660208501612af9565b9150612b44604085016127c4565b90509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612bb657612ba3838551805182526020808201516001600160a01b03169083015260408082015190830152606090810151910152565b9284019260809290920191600101612b69565b50909695505050505050565b60008060408385031215612bd557600080fd5b612bde836127fd565b9150612a2e60208401612af9565b634e487b7160e01b600052601160045260246000fd5b8082018082111561222157612221612bec565b634e487b7160e01b600052601260045260246000fd5b600082612c3a57612c3a612c15565b500490565b8181038181111561222157612221612bec565b600082612c6157612c61612c15565b500690565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761222157612221612bec565b600060018201612ca557612ca5612bec565b5060010190565b6001600160401b03818116838216019080821115612ccc57612ccc612bec565b5092915050565b600060208284031215612ce557600080fd5b6127f682612af9565b60a0808252810186905260008760c08301825b89811015612d295760ff612d1484612af9565b16825260209283019290910190600101612d01565b50602084019790975250506040810193909352606083019190915260809091015292915050565b600060ff821660ff8103612d6657612d66612bec565b60010192915050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808316818103612da157612da1612bec565b600101939250505056fea201115eefe59ed4da6ac006c38f0ed40f3b400a8c53e7ef7fb5cdf39c8485daa26469706673582212201df58c5c610c23403cc5a2d1ce98e522a92ebde03b5931bcd56389b7953489f264736f6c63430008140033000000000000000000000000a36e78cc7ab25d599af787cfe4422e3264370e9b

Deployed ByteCode

0x60806040526004361061031e5760003560e01c80638da5cb5b116101ab578063c388b24d116100f7578063e050db9f11610095578063f2fde38b1161006f578063f2fde38b14610b44578063f7cb789a14610b64578063fa75251614610b7a578063ff852a2514610b9a57600080fd5b8063e050db9f14610a8c578063e65e8f5f14610adf578063f12234d414610b0c57600080fd5b8063d0b819f1116100d1578063d0b819f1146109fe578063d5e1a29f14610a2b578063dd4f8f7414610a61578063df5377c614610a7757600080fd5b8063c388b24d1461098a578063c415b95c146109a0578063ceb68b42146109c057600080fd5b8063a813532311610164578063b08817901161013e578063b08817901461089e578063b8348785146108e0578063bc3ac875146108f6578063bc75f0fa1461097457600080fd5b8063a813532314610846578063aa8e31d5146105e4578063ab7a17481461087e57600080fd5b80638da5cb5b146107425780638fcc6c5e1461077a578063902ebd041461079a5780639a80bd2f146107ba5780639cbe5efd146107e7578063a42dce801461082657600080fd5b80634e43603a1161026a5780636637e38c116102235780637fc4eda8116101fd5780637fc4eda81461068f578063843f8dac146106b6578063863e76db146106e35780638b31260f146106fa57600080fd5b80636637e38c14610629578063747dff421461063f5780637e9308661461066157600080fd5b80634e43603a1461050557806350d0e5ae146105a65780635312ea8e146105c4578063539aa77f146105e45780635609149b146105fa57806358602fa01461060f57600080fd5b806331d7a262116102d7578063372500ab116102b1578063372500ab146104905780633ff151be146104a5578063479f028f146104d25780634ba09ea0146104f257600080fd5b806331d7a2621461041657806331f872371461044357806336c92c3f1461047057600080fd5b80630282ca801461032a57806316f007af1461036a578063170456381461037f57806323418703146103bf5780632f383f70146103e157806330b8fe1c1461040157600080fd5b3661032557005b600080fd5b34801561033657600080fd5b506103576103453660046127db565b60136020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561037657600080fd5b50610357600c81565b34801561038b57600080fd5b506103af61039a366004612814565b60096020526000908152604090205460ff1681565b6040519015158152602001610361565b3480156103cb57600080fd5b506103df6103da36600461282f565b610bd0565b005b3480156103ed57600080fd5b506103df6103fc366004612893565b610eb8565b34801561040d57600080fd5b506103df611207565b34801561042257600080fd5b506103576104313660046127db565b60126020526000908152604090205481565b34801561044f57600080fd5b5061046361045e36600461282f565b611320565b60405161036191906128e5565b34801561047c57600080fd5b506103df61048b36600461282f565b6113b7565b34801561049c57600080fd5b506103df61144a565b3480156104b157600080fd5b506103576104c03660046127db565b60146020526000908152604090205481565b3480156104de57600080fd5b506103df6104ed36600461282f565b6114cd565b6103df610500366004612919565b611573565b34801561051157600080fd5b506105726105203660046127db565b6001600160a01b031660009081526012602090815260408083205460138352818420546014845282852054601585528386205460169095529290942054909491926001600160401b0390811692911690565b604080519586526020860194909452928401919091526001600160401b03908116606084015216608082015260a001610361565b3480156105b257600080fd5b5061035769152d02c7e14af680000081565b3480156105d057600080fd5b506103df6105df36600461282f565b6119d7565b3480156105f057600080fd5b506103576101f481565b34801561060657600080fd5b50610357611a1b565b34801561061b57600080fd5b506006546103af9060ff1681565b34801561063557600080fd5b5061035761271081565b34801561064b57600080fd5b50610654611a47565b604051610361919061295a565b34801561066d57600080fd5b5061068161067c366004612a04565b611ba3565b604051610361929190612a60565b34801561069b57600080fd5b506106a4601981565b60405160ff9091168152602001610361565b3480156106c257600080fd5b506106d66106d1366004612814565b611c5c565b6040516103619190612a7b565b3480156106ef57600080fd5b506103576201518081565b34801561070657600080fd5b5061071a61071536600461282f565b611ccb565b604080519485526001600160a01b039093166020850152918301526060820152608001610361565b34801561074e57600080fd5b50600154610762906001600160a01b031681565b6040516001600160a01b039091168152602001610361565b34801561078657600080fd5b506103df61079536600461282f565b611d0e565b3480156107a657600080fd5b506103576107b5366004612a04565b61213f565b3480156107c657600080fd5b506103576107d5366004612814565b60086020526000908152604090205481565b3480156107f357600080fd5b5060025461080e90600160a01b90046001600160401b031681565b6040516001600160401b039091168152602001610361565b34801561083257600080fd5b506103df6108413660046127db565b612227565b34801561085257600080fd5b50610357610861366004612a8a565b600f60209081526000928352604080842090915290825290205481565b34801561088a57600080fd5b50610762610899366004612aad565b6122c3565b3480156108aa57600080fd5b506108be6108b9366004612acf565b6122fb565b6040805194151585526020850193909352918301526060820152608001610361565b3480156108ec57600080fd5b5061035760055481565b34801561090257600080fd5b50610944610911366004612814565b600a602052600090815260409020805460018201546002830154600390930154919260ff80831693610100909304169185565b6040805195865260ff9094166020860152911515928401929092526060830191909152608082015260a001610361565b34801561098057600080fd5b5061035760075481565b34801561099657600080fd5b5061035760045481565b3480156109ac57600080fd5b50600254610762906001600160a01b031681565b3480156109cc57600080fd5b506103576109db366004612b0a565b600c60209081526000938452604080852082529284528284209052825290205481565b348015610a0a57600080fd5b50610a1e610a1936600461282f565b61235b565b6040516103619190612b4d565b348015610a3757600080fd5b5061080e610a463660046127db565b6015602052600090815260409020546001600160401b031681565b348015610a6d57600080fd5b5061035760035481565b348015610a8357600080fd5b50601154610357565b348015610a9857600080fd5b50610aca610aa7366004612a04565b600d60209081526000928352604080842090915290825290205463ffffffff1681565b60405163ffffffff9091168152602001610361565b348015610aeb57600080fd5b50610357610afa36600461282f565b60106020526000908152604090205481565b348015610b1857600080fd5b50610357610b27366004612bc2565b600b60209081526000928352604080842090915290825290205481565b348015610b5057600080fd5b506103df610b5f3660046127db565b6124ad565b348015610b7057600080fd5b5061035760005481565b348015610b8657600080fd5b506103df610b9536600461282f565b61255b565b348015610ba657600080fd5b5061080e610bb53660046127db565b6016602052600090815260409020546001600160401b031681565b600254600054600354600160a01b9092046001600160401b031691610bf59190612c02565b421015610c15576040516357ef8ef560e11b815260040160405180910390fd5b6001600160401b03811660009081526009602052604090205460ff16610c4e5760405163205e472d60e21b815260040160405180910390fd5b6001600160401b038116600090815260086020908152604091829020549151610c9191859185910191825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012014610cc55760405163e1dcd59760e01b815260040160405180910390fd5b6001600160401b0381166000908152600a6020526040902060018101805461ff001916610100179055610cfb6201518042612c2b565b600382015580546000819003610d5957610d13612627565b60038201546040805160008082526020820152908101919091526001600160401b03841690600080516020612dac8339815191529060600160405180910390a250505050565b600084610d67600143612c3f565b6040805160208082019490945291408282015242606083015260c087901b6001600160c01b03191660808301528051606881840301815260889092019052805191012090506000610db9601983612c52565b60018501805460ff191660ff83169081179091556001600160401b0387166000908152600b6020908152604080832093835292905290812054919250819003610e69578360046000828254610e0e9190612c02565b90915550610e1c9050612627565b60038501546040805160ff8516815260006020820152908101919091526001600160401b03871690600080516020612dac833981519152906060015b60405180910390a250505050505050565b60028501849055610e78612627565b60038501546040805160ff8516815260208101879052908101919091526001600160401b03871690600080516020612dac83398151915290606001610e58565b6001600160401b0383166000908152600a602052604090206001810154610100900460ff16610efa57604051632382430560e11b815260040160405180910390fd5b60018101546001600160401b0385166000908152600b6020908152604080832060ff9094168084529390915281205490819003610f3957505050505050565b600283015460038401546000908190815b888110156111b65760008a8a83818110610f6657610f66612c66565b9050602002016020810190610f7b91906127db565b6001600160401b038d166000908152600c6020908152604080832060ff8d16845282528083206001600160a01b0385168452909152812054919250819003610fc45750506111a4565b6001600160401b038d166000908152600c6020908152604080832060ff8d16845282528083206001600160a01b0386168452909152812081905588611009838a612c7c565b6110139190612c2b565b6001600160a01b038416600090815260126020526040812080549293508392909190611040908490612c02565b90915550506001600160a01b0383166000908152601460205260408120805483929061106d908490612c02565b9091555061107d90508188612c02565b96508561108981612c93565b6000878152600f602090815260408083206001600160a01b03891684529091528120549198500390506110ee576000858152600e602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790555b6000858152600f602090815260408083206001600160a01b03871684529091528120805460019290611121908490612c02565b90915550506000858152601060205260408120805460019290611145908490612c02565b90915550506001600160a01b038316600090815260166020526040812080546001929061117c9084906001600160401b0316612cac565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505050505b806111ae81612c93565b915050610f4a565b5060408051848152602081018490526001600160401b038c16917f08d3d47b87f40a45815ffcbabc28bca7ca12ebb77a75fc77b1e224bae120c0e1910160405180910390a250505050505050505050565b6001546001600160a01b03163314611232576040516330cd747160e01b815260040160405180910390fd5b600254600160a01b90046001600160401b03166000818152600a602052604090206001810154610100900460ff166112a85760018101805461ff0019166101001790556112826201518042612c2b565b60038201558054156112a8578054600480546000906112a2908490612c02565b90915550505b6001600160401b0382166000908152600960209081526040808320805460ff1916905560089091528120556112db612627565b60038101546040805160008082526020820152908101919091526001600160401b03831690600080516020612dac833981519152906060015b60405180910390a25050565b61135460405180608001604052806000815260200160006001600160a01b0316815260200160008152602001600081525090565b6011828154811061136757611367612c66565b60009182526020918290206040805160808101825260049093029091018054835260018101546001600160a01b031693830193909352600283015490820152600390910154606082015292915050565b6001546001600160a01b031633146113e2576040516330cd747160e01b815260040160405180910390fd5b603c81101580156113f55750610e108111155b6114455760405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d7573742062652036302d333630307300000000000000604482015260640160405180910390fd5b600055565b336000908152601260205260408120549081900361147b57604051630fec21fd60e21b815260040160405180910390fd5b3360008181526012602052604081205561149590826126c6565b60405181815233907f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f72419060200160405180910390a250565b6001546001600160a01b031633146114f8576040516330cd747160e01b815260040160405180910390fd5b60065460ff161561151c576040516317fd8aab60e31b815260040160405180910390fd5b60078190556006805460ff191660011790557f8882fc924e8b70043aeb7559caa6060027d5b0be574eb6d6aa05cb8cccae8b5b8161155861274b565b6040805192835260208301919091520160405180910390a150565b600254600054600354600160a01b9092046001600160401b0316916115989190612c02565b42106115b757604051633df07da560e01b815260040160405180910390fd5b818015806115c55750601981115b156115e35760405163b015b78360e01b815260040160405180910390fd5b6000805b828110156116ab57601986868381811061160357611603612c66565b90506020020160208101906116189190612cd3565b60ff16106116395760405163b015b78360e01b815260040160405180910390fd5b600086868381811061164d5761164d612c66565b90506020020160208101906116629190612cd3565b600160ff919091161b905082811663ffffffff16156116945760405163b015b78360e01b815260040160405180910390fd5b9190911790806116a381612c93565b9150506115e7565b506001600160401b0383166000908152600d6020908152604080832033845290915290205463ffffffff16156116f4576040516325b23b7360e01b815260040160405180910390fd5b6117088269152d02c7e14af6800000612c7c565b3410156117285760405163044044a560e21b815260040160405180910390fd5b34600061271061173a6101f484612c7c565b6117449190612c2b565b905060006127106117576101f485612c7c565b6117619190612c2b565b90506000816117708486612c3f565b61177a9190612c3f565b905060006117888783612c2b565b6002549091506117a1906001600160a01b0316856126c6565b82600460008282546117b39190612c02565b90915550506001600160401b0388166000818152600d602090815260408083203384528252808320805463ffffffff191663ffffffff8c16179055928252600a90529081208054849290611808908490612c02565b9091555061181b90506201518042612c2b565b6001600160401b0389166000908152600a60205260408120600301919091555b878110156119045760008b8b8381811061185757611857612c66565b905060200201602081019061186c9190612cd3565b6001600160401b038b166000908152600b6020908152604080832060ff851684529091528120805492935085929091906118a7908490612c02565b90915550506001600160401b038a166000908152600c6020908152604080832060ff851684528252808320338452909152812080548592906118ea908490612c02565b909155508291506118fc905081612c93565b91505061183b565b503360009081526013602052604081208054879290611924908490612c02565b90915550503360009081526015602052604081208054600192906119529084906001600160401b0316612cac565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550336001600160a01b0316886001600160401b03167f421a758eaaf4c544b77f05db29550e2e25946e6e9ec2d24da05e3304f08341718c8c89878a8a6040516119c396959493929190612cee565b60405180910390a350505050505050505050565b6001546001600160a01b03163314611a02576040516330cd747160e01b815260040160405180910390fd5b600154611a18906001600160a01b0316826126c6565b50565b600080611a2661277f565b9050804210611a3757600091505090565b611a414282612c3f565b91505090565b611abb60405180610180016040528060006001600160401b0316815260200160008152602001600081526020016000815260200160008152602001600015158152602001600015158152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b60025460008054600354600160a01b9093046001600160401b031692611ae19190612c02565b6001600160401b0383166000818152600a602090815260409182902082516101808101845293845260035491840191909152908201839052805460608301529192504291906080810184841015611b4157611b3c8486612c3f565b611b44565b60005b81528484106020820152600183015460ff61010082048116151560408401521660608201526002830154608082015260045460a082015260c001611b8661277f565b8152602001611b986201518085612c2b565b905295945050505050565b6000611bad6127a5565b6001600160401b0384166000908152600d602090815260408083206001600160a01b038716845290915281205463ffffffff1692505b60198160ff161015611c54576001600160401b0385166000908152600c6020908152604080832060ff85168085529083528184206001600160a01b03891685529092529091205490839060198110611c3d57611c3d612c66565b602002015280611c4c81612d50565b915050611be3565b509250929050565b611c646127a5565b60005b60198160ff161015611cc5576001600160401b0383166000908152600b6020908152604080832060ff851680855292529091205490839060198110611cae57611cae612c66565b602002015280611cbd81612d50565b915050611c67565b50919050565b60118181548110611cdb57600080fd5b600091825260209091206004909102018054600182015460028301546003909301549193506001600160a01b0316919084565b611d1661274b565b421015611d3657604051630818d73360e11b815260040160405180910390fd5b611d3e61274b565b60055410611d5f5760405163134a671f60e11b815260040160405180910390fd5b60065460ff16611d825760405163205e472d60e21b815260040160405180910390fd5b6000611d916201518042612c2b565b90506007548282604051602001611db2929190918252602082015260400190565b6040516020818303038152906040528051906020012014611de65760405163e1dcd59760e01b815260040160405180910390fd5b6006805460ff1916905560006007819055611e02600183612c3f565b600081815260106020908152604080832054600e90925290912042600555805492935090911580611e31575081155b80611e3c5750600454155b15611e8457827fa41e9a23919d382a9f89909cd4ee1f5bc2d00f6493f799e7eb66f5924faea263600454604051611e7591815260200190565b60405180910390a25050505050565b600085611e92600143612c3f565b6040805160208101939093529040908201524260608201526080810185905260a00160408051601f19818403018152919052805160209091012090506000611eda8483612c52565b905060008084600081548110611ef257611ef2612c66565b60009182526020822001546001600160a01b031691505b8554811015611fb257600f60008981526020019081526020016000206000878381548110611f3957611f39612c66565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611f689084612c02565b925082841015611fa057858181548110611f8457611f84612c66565b6000918252602090912001546001600160a01b03169150611fb2565b80611faa81612c93565b915050611f09565b50600480546000918290556001600160a01b0383168252601260205260408220805491928392611fe3908490612c02565b90915550506001600160a01b03821660009081526014602052604081208054839290612010908490612c02565b9091555050604080516080810182528981526001600160a01b03848116602080840182815284860187815242606087019081526011805460018101825560009190915296517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6860049098029788015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c69870180546001600160a01b031916919096161790945592517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a85015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b90930192909255885483518581529182015290918a917f6d86ad7a3e95676cdaa4903e8ee9d179b645e7bea42735ab1118eb81da192b3091016119c3565b6001600160401b0382166000908152600a602052604081206001810154610100900460ff16612172576000915050612221565b6001600160401b0384166000908152600c60209081526040808320600185015460ff16845282528083206001600160a01b0387168452909152812054908190036121c157600092505050612221565b6001600160401b0385166000908152600b60209081526040808320600186015460ff168452909152812054908190036122005760009350505050612221565b808284600201546122119190612c7c565b61221b9190612c2b565b93505050505b92915050565b6001546001600160a01b03163314612252576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166122795760405163e6c4247b60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517fe5693914d19c789bdee50a362998c0bc8d035a835f9871da5d51152f0582c34f90600090a250565b600e60205281600052604060002081815481106122df57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000818152600f602090815260408083206001600160a01b038616845282528083205484845260109092528220548115159281612339576000612350565b8161234684612710612c7c565b6123509190612c2b565b905092959194509250565b60115460609060008184116123705783612372565b815b90506000816001600160401b0381111561238e5761238e612d6f565b6040519080825280602002602001820160405280156123f357816020015b6123e060405180608001604052806000815260200160006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816123ac5790505b50905060005b828110156124a45760118161240e8587612c3f565b6124189190612c02565b8154811061242857612428612c66565b60009182526020918290206040805160808101825260049093029091018054835260018101546001600160a01b0316938301939093526002830154908201526003909101546060820152825183908390811061248657612486612c66565b6020026020010181905250808061249c90612c93565b9150506123f9565b50949350505050565b6001546001600160a01b031633146124d8576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166124ff5760405163e6c4247b60e01b815260040160405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314612586576040516330cd747160e01b815260040160405180910390fd5b600254600160a01b90046001600160401b031660008181526009602052604090205460ff16156125c9576040516317fd8aab60e31b815260040160405180910390fd5b6001600160401b03811660008181526008602090815260408083208690556009825291829020805460ff1916600117905590518481527fe792bca2581603ad4bfbd45ca36b38d47c208da62f2f74de32142f17594227099101611314565b60028054600160a01b90046001600160401b031690601461264783612d85565b82546101009290920a6001600160401b03818102199093169183160217909155426003819055600254600054600160a01b90910490921692507f57223c3e85f6b584c987fa7794717b0d5cee8dd663140e6b275ca2d5feec19ca916126ac9082612c02565b6040805192835260208301919091520160405180910390a2565b806000036126d2575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461271f576040519150601f19603f3d011682016040523d82523d6000602084013e612724565b606091505b5050905080612746576040516312171d8360e31b815260040160405180910390fd5b505050565b6000806201518061275c8142612c2b565b6127669190612c7c565b9050612775600c610e10612c7c565b611a419082612c02565b60008061278a61274b565b90508042106127a057611a416201518082612c02565b919050565b6040518061032001604052806019906020820280368337509192915050565b80356001600160a01b03811681146127a057600080fd5b6000602082840312156127ed57600080fd5b6127f6826127c4565b9392505050565b80356001600160401b03811681146127a057600080fd5b60006020828403121561282657600080fd5b6127f6826127fd565b60006020828403121561284157600080fd5b5035919050565b60008083601f84011261285a57600080fd5b5081356001600160401b0381111561287157600080fd5b6020830191508360208260051b850101111561288c57600080fd5b9250929050565b6000806000604084860312156128a857600080fd5b6128b1846127fd565b925060208401356001600160401b038111156128cc57600080fd5b6128d886828701612848565b9497909650939450505050565b815181526020808301516001600160a01b031690820152604080830151908201526060808301519082015260808101612221565b6000806020838503121561292c57600080fd5b82356001600160401b0381111561294257600080fd5b61294e85828601612848565b90969095509350505050565b81516001600160401b0316815261018081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a08301516129a760a084018215159052565b5060c08301516129bb60c084018215159052565b5060e08301516129d060e084018260ff169052565b5061010083810151908301526101208084015190830152610140808401519083015261016092830151929091019190915290565b60008060408385031215612a1757600080fd5b612a20836127fd565b9150612a2e602084016127c4565b90509250929050565b8060005b6019811015612a5a578151845260209384019390910190600101612a3b565b50505050565b63ffffffff8316815261034081016127f66020830184612a37565b61032081016122218284612a37565b60008060408385031215612a9d57600080fd5b82359150612a2e602084016127c4565b60008060408385031215612ac057600080fd5b50508035926020909101359150565b60008060408385031215612ae257600080fd5b612aeb836127c4565b946020939093013593505050565b803560ff811681146127a057600080fd5b600080600060608486031215612b1f57600080fd5b612b28846127fd565b9250612b3660208501612af9565b9150612b44604085016127c4565b90509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612bb657612ba3838551805182526020808201516001600160a01b03169083015260408082015190830152606090810151910152565b9284019260809290920191600101612b69565b50909695505050505050565b60008060408385031215612bd557600080fd5b612bde836127fd565b9150612a2e60208401612af9565b634e487b7160e01b600052601160045260246000fd5b8082018082111561222157612221612bec565b634e487b7160e01b600052601260045260246000fd5b600082612c3a57612c3a612c15565b500490565b8181038181111561222157612221612bec565b600082612c6157612c61612c15565b500690565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761222157612221612bec565b600060018201612ca557612ca5612bec565b5060010190565b6001600160401b03818116838216019080821115612ccc57612ccc612bec565b5092915050565b600060208284031215612ce557600080fd5b6127f682612af9565b60a0808252810186905260008760c08301825b89811015612d295760ff612d1484612af9565b16825260209283019290910190600101612d01565b50602084019790975250506040810193909352606083019190915260809091015292915050565b600060ff821660ff8103612d6657612d66612bec565b60010192915050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808316818103612da157612da1612bec565b600101939250505056fea201115eefe59ed4da6ac006c38f0ed40f3b400a8c53e7ef7fb5cdf39c8485daa26469706673582212201df58c5c610c23403cc5a2d1ce98e522a92ebde03b5931bcd56389b7953489f264736f6c63430008140033