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