// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {IQuiverCoordinator} from "./quiver/interfaces/IQuiverCoordinator.sol";
import {IQuiverConsumer} from "./quiver/interfaces/IQuiverConsumer.sol";
import {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IPea {
function mint(address to, uint256 amount) external;
function burn(uint256 amount) external;
function totalMinted() external view returns (uint256);
}
interface ITreasury {
function receiveVault() external payable;
}
// Two-step transfer, no renounce. Ownership here is the randomness liveness
contract GridMining is IQuiverConsumer, Ownable2Step, ReentrancyGuard {
// ============ Constants ============
uint256 public constant ROUND_DURATION = 60 seconds;
uint256 public constant MIN_DEPLOY = 0.0000025 ether;
uint256 public constant GRID_SIZE = 25;
uint256 public constant ADMIN_FEE_BPS = 100; // 1%
uint256 public constant VAULT_FEE_BPS = 1000; // 10%
uint256 public constant HARVESTING_FEE_BPS = 1000; // 10%
uint256 public constant BPS_DENOMINATOR = 10000;
uint256 public constant ONE_PEA = 1e18;
uint256 public constant MIN_PEAPOT_ACCUMULATION = ONE_PEA / 10;
uint256 public constant MAX_PEAPOT_ACCUMULATION = ONE_PEA;
uint256 public peapotAccumulation = ONE_PEA / 10;
uint256 public constant PEAPOT_CHANCE = 333;
uint256 public constant MAX_SUPPLY = 3_000_000 * ONE_PEA;
// ============ Randomness Config (Pyth-inherited commit-reveal) ============
/// @dev Both owner-settable. Ops rule:
/// rotating the PROVIDER mid-pending-request is safe (old request stays
/// mapped); rotating the COORDINATOR mid-pending requires timing — the callback gate
/// checks the current coordinator, so settle or emergency-reset first.
IQuiverCoordinator public quiver;
address public provider;
// ============ External Contracts ============
IPea public pea;
ITreasury public treasury;
address public feeCollector;
address public autoMiner;
// ============ Board State ============
uint64 public currentRoundId;
bool public gameStarted;
uint256 public maxMinersForSingleWinner = 2000;
// ============ Round State ============
struct Round {
uint256 startTime;
uint256 endTime;
uint256[25] deployed; // ETH per block
uint256 totalDeployed;
uint256 totalWinnings; // After fees, for winners to claim
uint256 winnersDeployed; // Amount on winning block
uint8 winningBlock;
address topMiner; // Single winner address, or address(0) if split
uint256 topMinerReward; // PEA reward amount
uint256 peapotAmount; // Peapot payout if triggered
uint256 topMinerSeed;
bool settled;
uint256 minerCount; // Number of unique deployers this round
}
/// @dev Quiver request state, kept out of the Round struct: the auto-generated
/// rounds() getter is prefix-decoded by AutoMiner and already near the
/// stack-depth limit. A separate single-slot record avoids both hazards.
struct RequestState {
address provider; // provider serving the active request
uint64 seq; // Quiver sequence number (per-provider, starts at 1)
bool pending;
}
struct FeeCalc {
uint256 adminFee;
uint256 vaultAmount;
uint256 totalWinnings;
}
mapping(uint64 => Round) public rounds;
/// @dev roundId => active randomness request for that round.
mapping(uint64 => RequestState) public roundRequests;
/// @dev keccak256(provider, seq) => roundId. Quiver sequence numbers are PER-PROVIDER
mapping(bytes32 => uint64) public requestToRound;
// ============ Miner State ============
struct Miner {
uint256 deployedMask; // Bitmask of blocks deployed to
uint256 amountPerBlock; // ETH per block
bool checkpointed;
}
// roundId => user => Miner
mapping(uint64 => mapping(address => Miner)) public miners;
// roundId => deployIndex => deployer address
mapping(uint64 => mapping(uint256 => address)) internal minerByIndex;
// ============ Global Rewards State ============
uint256 public peapotPool;
// Harvesting fee redistribution
uint256 public totalUnclaimed;
uint256 public accHarvestingPerUnclaimed;
mapping(address => uint256) public userHarvestingDebt;
mapping(address => uint256) public userUnclaimedPEA;
mapping(address => uint256) public userUnclaimedETH;
mapping(address => uint256) public userHarvestedPEA;
mapping(address => uint64) public userLastRound;
// ============ Events ============
event GameStarted(uint64 indexed roundId, uint256 startTime, uint256 endTime);
event Deployed(uint64 indexed roundId, address indexed user, uint256 amountPerBlock, uint256 blockMask, uint256 totalAmount);
event ResetRequested(
uint64 indexed roundId,
address indexed provider,
uint64 sequenceNumber,
bytes32 userRandom,
uint128 feePaid
);
event RoundSettled(
uint64 indexed roundId,
uint8 winningBlock,
address topMiner,
uint256 totalWinnings,
uint256 topMinerReward,
uint256 peapotAmount,
bool isSplit,
uint256 topMinerSeed,
uint256 winnersDeployed
);
event DeployedFor(
uint64 indexed roundId,
address indexed user,
address indexed executor,
uint256 amountPerBlock,
uint256 blockMask,
uint256 totalAmount
);
event AutoMinerUpdated(address indexed oldAutoMiner, address indexed newAutoMiner);
event Checkpointed(uint64 indexed roundId, address indexed user, uint256 ethReward, uint256 peaReward);
event ClaimedETH(address indexed user, uint256 amount);
event ClaimedPEA(address indexed user, uint256 minedPea, uint256 harvestedPea, uint256 fee, uint256 net);
event EmergencyVRFRequested(uint64 indexed roundId, uint64 oldSeq, uint64 newSeq, address indexed provider);
event PeapotAccumulationUpdated(uint256 oldValue, uint256 newValue);
event CoordinatorUpdated(address indexed oldCoordinator, address indexed newCoordinator);
event ProviderUpdated(address indexed oldProvider, address indexed newProvider);
// ============ Errors ============
error GameNotStarted();
error GameAlreadyStarted();
error RoundNotActive();
error RoundNotEnded();
error RoundAlreadySettled();
error RoundNotSettled();
error AlreadyCheckpointed();
error InvalidBlockId();
error InsufficientDeployAmount();
error NoBlocksSelected();
error AlreadyDeployedThisRound();
error NothingToClaim();
error TransferFailed();
error InvalidVRFRequest();
error MaxSupplyReached();
error VRFAlreadyRequested();
error NotAutoMiner();
error MinimumThresholdTooLow();
error EmergencyTooEarly();
error InvalidPeapotAccumulation();
error ZeroAddress();
error CallerNotCoordinator(address caller);
error InsufficientFeeAttached(uint256 provided, uint256 required);
error RenounceDisabled();
// ============ Constructor ============
constructor(
address _coordinator,
address _provider,
address _pea,
address _treasury,
address _feeCollector
) Ownable(msg.sender) {
if (_coordinator == address(0)) revert ZeroAddress();
if (_provider == address(0)) revert ZeroAddress();
if (_treasury == address(0)) revert ZeroAddress();
if (_feeCollector == address(0)) revert ZeroAddress();
if (_pea == address(0)) revert ZeroAddress();
quiver = IQuiverCoordinator(_coordinator);
provider = _provider;
pea = IPea(_pea);
treasury = ITreasury(_treasury);
feeCollector = _feeCollector;
}
// ============ Admin Functions ============
/// @notice Replace the Quiver coordinator.
/// @dev Do not rotate while a request is pending. The callback gate checks the
/// current coordinator, so the old one's delivery would revert.
function setCoordinator(address _coordinator) external onlyOwner {
if (_coordinator == address(0)) revert ZeroAddress();
address old = address(quiver);
quiver = IQuiverCoordinator(_coordinator);
emit CoordinatorUpdated(old, _coordinator);
}
/// @notice Replace the default randomness provider.
/// @dev Safe mid-pending: the in-flight request stays keyed to its own provider.
function setProvider(address _provider) external onlyOwner {
if (_provider == address(0)) revert ZeroAddress();
address old = provider;
provider = _provider;
emit ProviderUpdated(old, _provider);
}
/// @notice Disabled: ownership is the randomness liveness failover
function renounceOwnership() public view override onlyOwner {
revert RenounceDisabled();
}
function setFeeCollector(address _feeCollector) external onlyOwner {
if (_feeCollector == address(0)) revert ZeroAddress();
feeCollector = _feeCollector;
}
function setTreasury(address _treasury) external onlyOwner {
if (_treasury == address(0)) revert ZeroAddress();
treasury = ITreasury(_treasury);
}
function setAutoMiner(address _autoMiner) external onlyOwner {
address old = autoMiner;
autoMiner = _autoMiner;
emit AutoMinerUpdated(old, _autoMiner);
}
function setPeapotAccumulation(uint256 _accumulation) external onlyOwner {
if (_accumulation < MIN_PEAPOT_ACCUMULATION || _accumulation > MAX_PEAPOT_ACCUMULATION) {
revert InvalidPeapotAccumulation();
}
uint256 oldValue = peapotAccumulation;
peapotAccumulation = _accumulation;
emit PeapotAccumulationUpdated(oldValue, _accumulation);
}
function setMaxMinersForSingleWinner(uint256 _max) external onlyOwner {
if (_max < 500) revert MinimumThresholdTooLow();
maxMinersForSingleWinner = _max;
}
function startFirstRound() external onlyOwner {
// Coordinator + provider are constructor-guaranteed non-zero
if (gameStarted) revert GameAlreadyStarted();
gameStarted = true;
currentRoundId = 1;
Round storage round = rounds[1];
round.startTime = block.timestamp;
round.endTime = block.timestamp + ROUND_DURATION;
emit GameStarted(1, round.startTime, round.endTime);
}
// ============ Core Game Functions ============
/**
* @notice Deploy ETH to selected blocks in the current round
* @param blockIds Array of block IDs (0-24) to deploy to
* @dev Deploys msg.value / blockIds.length to each selected block
*/
function deploy(uint8[] calldata blockIds) external payable nonReentrant {
if (!gameStarted) revert GameNotStarted();
// Auto-checkpoint previous round
_autoCheckpointPrevious(msg.sender);
Round storage round = rounds[currentRoundId];
// Check round is active
if (block.timestamp >= round.endTime) revert RoundNotActive();
uint256 numBlocks = blockIds.length;
if (numBlocks == 0) revert NoBlocksSelected();
uint256 amountPerBlock = msg.value / numBlocks;
if (amountPerBlock < MIN_DEPLOY) revert InsufficientDeployAmount();
Miner storage miner = miners[currentRoundId][msg.sender];
// One deploy per round
if (miner.deployedMask != 0) revert AlreadyDeployedThisRound();
// Assign deploy index for lazy top miner resolution
minerByIndex[currentRoundId][round.minerCount] = msg.sender;
round.minerCount++;
uint256 blockMask;
uint256 totalAmount;
for (uint256 i; i < numBlocks; ) {
uint8 blockId = blockIds[i];
if (blockId >= GRID_SIZE) revert InvalidBlockId();
uint256 bit = 1 << blockId;
if ((blockMask & bit) != 0) revert InvalidBlockId();
blockMask |= bit;
uint256 currentDeployed = round.deployed[blockId];
round.deployed[blockId] = currentDeployed + amountPerBlock;
unchecked {
totalAmount += amountPerBlock;
++i;
}
}
// Write miner state
miner.deployedMask = blockMask;
miner.amountPerBlock = amountPerBlock;
round.totalDeployed += totalAmount;
// Track user's last played round
userLastRound[msg.sender] = currentRoundId;
emit Deployed(currentRoundId, msg.sender, amountPerBlock, blockMask, totalAmount);
}
/**
* @notice Deploy ETH to selected blocks on behalf of a user (AutoMiner only)
* @param user The address to credit deposits to
* @param blockIds Array of block IDs (0-24) to deploy to
* @dev Deploys msg.value / blockIds.length to each selected block
*/
function deployFor(address user, uint8[] calldata blockIds) external payable nonReentrant {
if (msg.sender != autoMiner) revert NotAutoMiner();
if (user == address(0)) revert ZeroAddress();
if (!gameStarted) revert GameNotStarted();
// Auto-checkpoint previous round for the USER
_autoCheckpointPrevious(user);
Round storage round = rounds[currentRoundId];
// Check round is active
if (block.timestamp >= round.endTime) revert RoundNotActive();
uint256 numBlocks = blockIds.length;
if (numBlocks == 0) revert NoBlocksSelected();
uint256 amountPerBlock = msg.value / numBlocks;
if (amountPerBlock < MIN_DEPLOY) revert InsufficientDeployAmount();
// Use USER's miner state
Miner storage miner = miners[currentRoundId][user];
// One deploy per round
if (miner.deployedMask != 0) revert AlreadyDeployedThisRound();
// Assign deploy index for lazy top miner resolution
minerByIndex[currentRoundId][round.minerCount] = user;
round.minerCount++;
uint256 blockMask;
uint256 totalAmount;
for (uint256 i; i < numBlocks; ) {
uint8 blockId = blockIds[i];
if (blockId >= GRID_SIZE) revert InvalidBlockId();
uint256 bit = 1 << blockId;
if ((blockMask & bit) != 0) revert InvalidBlockId();
blockMask |= bit;
uint256 currentDeployed = round.deployed[blockId];
round.deployed[blockId] = currentDeployed + amountPerBlock;
unchecked {
totalAmount += amountPerBlock;
++i;
}
}
// Write miner state
miner.deployedMask = blockMask;
miner.amountPerBlock = amountPerBlock;
round.totalDeployed += totalAmount;
// Track USER's last played round
userLastRound[user] = currentRoundId;
emit DeployedFor(currentRoundId, user, msg.sender, amountPerBlock, blockMask, totalAmount);
}
/**
* @notice End the current round and request settlement randomness from Quiver
* @dev Anyone can call this after round ends. Payable: attach getFee(provider)
* as msg.value. Exactly the fee is forwarded and any excess is refunded to the caller.
*/
function reset() external payable nonReentrant {
if (!gameStarted) revert GameNotStarted();
Round storage round = rounds[currentRoundId];
if (block.timestamp < round.endTime) revert RoundNotEnded();
if (round.settled) revert RoundAlreadySettled();
if (roundRequests[currentRoundId].pending) revert VRFAlreadyRequested();
// Handle empty round (no one deployed) — synchronous, no randomness needed.
// Refund any attached fee so it can't strand in the contract.
if (round.totalDeployed == 0) {
round.settled = true;
_startNextRound();
if (msg.value > 0) _safeTransferETH(msg.sender, msg.value);
return;
}
_requestSettlement(currentRoundId);
}
/// @dev Request settlement randomness from the current provider. The fee rides in
/// as msg.value: forward EXACTLY the fee (the coordinator refunds overpayment
/// to this contract, not the caller) and refund the excess here.
function _requestSettlement(uint64 roundId) internal {
bytes32 userRandom = keccak256(
abi.encode(
address(this), roundId, roundRequests[roundId].seq, block.timestamp, blockhash(block.number - 1), msg.sender, gasleft()
)
);
address provider_ = provider;
uint128 fee = quiver.getFee(provider_);
if (msg.value < fee) revert InsufficientFeeAttached(msg.value, fee);
uint64 seq = quiver.requestWithCallback{value: fee}(provider_, userRandom);
roundRequests[roundId] = RequestState({provider: provider_, seq: seq, pending: true});
requestToRound[_requestKey(provider_, seq)] = roundId;
emit ResetRequested(roundId, provider_, seq, userRandom, fee);
uint256 excess = msg.value - fee;
if (excess > 0) _safeTransferETH(msg.sender, excess);
}
/// @notice Quiver push-flow delivery point.
/// @dev Only the coordinator may call. Never reverts on stale/unknown sequences.
/// The emergency re-request path depends on silent drops.
function quiverCallback(uint64 sequenceNumber, address provider_, bytes32 randomNumber) external override {
if (msg.sender != address(quiver)) revert CallerNotCoordinator(msg.sender);
_fulfillRandomness(sequenceNumber, provider_, randomNumber);
}
function _fulfillRandomness(uint64 sequenceNumber, address provider_, bytes32 randomNumber) internal {
uint64 roundId = requestToRound[_requestKey(provider_, sequenceNumber)];
if (roundId == 0) return; // stale/unknown request = silent drop
Round storage round = rounds[roundId];
if (round.settled) return; // replay guard
// Expand single bytes32 into the 3 words to deliver
uint256[3] memory randomWords = deriveWords(randomNumber);
uint8 winningBlock = uint8(randomWords[0] % GRID_SIZE);
round.winningBlock = winningBlock;
round.winnersDeployed = round.deployed[winningBlock];
if (round.winnersDeployed == 0) {
roundRequests[roundId].pending = false;
_settleNoWinners(roundId, round, winningBlock);
return;
}
FeeCalc memory fees = _calculateSettlementFees(round.totalDeployed, round.winnersDeployed);
round.totalWinnings = fees.totalWinnings;
bool isSplit = _processMinting(round, randomWords);
round.settled = true;
roundRequests[roundId].pending = false;
_safeTransferETH(feeCollector, fees.adminFee);
treasury.receiveVault{value: fees.vaultAmount}();
_startNextRound();
emit RoundSettled(roundId, winningBlock, round.topMiner, round.totalWinnings, round.topMinerReward, round.peapotAmount, isSplit, round.topMinerSeed, round.winnersDeployed);
}
function deriveWords(bytes32 randomNumber) public pure returns (uint256[3] memory words) {
for (uint256 i = 0; i < 3; i++) {
words[i] = uint256(keccak256(abi.encode(randomNumber, i)));
}
}
/// @dev Deterministic key for a (provider, sequenceNumber) request.
function _requestKey(address provider_, uint64 sequenceNumber) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(provider_, sequenceNumber));
}
function _settleNoWinners(uint64 roundId, Round storage round, uint8 winningBlock) internal {
uint256 adminFee = (round.totalDeployed * ADMIN_FEE_BPS) / BPS_DENOMINATOR;
uint256 vaultAmount = round.totalDeployed - adminFee;
round.settled = true;
_safeTransferETH(feeCollector, adminFee);
treasury.receiveVault{value: vaultAmount}();
_startNextRound();
emit RoundSettled(roundId, winningBlock, address(0), 0, 0, 0, false, 0, 0);
}
function _calculateSettlementFees(uint256 totalDeployed, uint256 winnersDeployed) internal pure returns (FeeCalc memory) {
uint256 losersPool = totalDeployed - winnersDeployed;
uint256 adminFee = (totalDeployed * ADMIN_FEE_BPS) / BPS_DENOMINATOR;
uint256 losersAdminShare = (losersPool * ADMIN_FEE_BPS) / BPS_DENOMINATOR;
uint256 losersAfterAdmin = losersPool - losersAdminShare;
uint256 vaultAmount = (losersAfterAdmin * VAULT_FEE_BPS) / BPS_DENOMINATOR;
uint256 totalWinnings = losersAfterAdmin - vaultAmount;
return FeeCalc(adminFee, vaultAmount, totalWinnings);
}
function _processMinting(Round storage round, uint256[3] memory randomWords) internal returns (bool isSplit) {
isSplit = (randomWords[1] % 2 == 0);
// Cap combined mint to remaining supply. Avoid revert near MAX_SUPPLY
uint256 remaining = MAX_SUPPLY - pea.totalMinted();
uint256 mintAmount = ONE_PEA > remaining ? remaining : ONE_PEA;
remaining -= mintAmount;
uint256 peapotMint = peapotAccumulation > remaining ? remaining : peapotAccumulation;
round.topMinerSeed = randomWords[1];
round.topMinerReward = mintAmount;
round.topMiner = isSplit ? address(0) : address(1);
if (randomWords[2] % PEAPOT_CHANCE == 0 && peapotPool > 0) {
round.peapotAmount = peapotPool;
peapotPool = 0;
}
peapotPool += peapotMint;
uint256 totalMint = mintAmount + peapotMint;
if (totalMint > 0) {
pea.mint(address(this), totalMint);
}
}
function _checkpoint(uint64 roundId, address user) internal {
Round storage round = rounds[roundId];
Miner storage miner = miners[roundId][user];
// Skip if already checkpointed or round not settled
if (miner.checkpointed || !round.settled) return;
uint8 winningBlock = round.winningBlock;
// Bitmask check
uint256 userDeployed = (miner.deployedMask & (1 << winningBlock)) != 0
? miner.amountPerBlock
: 0;
// If user didn't deploy to winning block, mark as checkpointed and return
if (userDeployed == 0) {
miner.checkpointed = true;
emit Checkpointed(roundId, user, 0, 0);
return;
}
uint256 winnersDeployed = round.winnersDeployed;
// Calculate ETH rewards: proportional share of actual retained ETH
uint256 ethReward;
unchecked {
uint256 claimablePool = _getClaimablePool(round.totalDeployed, winnersDeployed);
ethReward = (claimablePool * userDeployed) / winnersDeployed;
}
// Calculate PEA rewards
uint256 peaReward;
if (round.topMiner == address(0)) {
peaReward = (round.topMinerReward * userDeployed) / winnersDeployed;
} else if (round.topMiner == address(1)) {
if (round.minerCount > maxMinersForSingleWinner) {
// Too many miners: force proportional split
round.topMiner = address(0);
peaReward = (round.topMinerReward * userDeployed) / winnersDeployed;
} else {
// Safe to iterate: resolve single winner
_resolveTopMiner(roundId, round);
if (round.topMiner == user) {
peaReward = round.topMinerReward;
}
}
} else if (round.topMiner == user) {
peaReward = round.topMinerReward;
}
if (round.peapotAmount != 0) {
peaReward += (round.peapotAmount * userDeployed) / winnersDeployed;
}
miner.checkpointed = true;
// Snapshot pending harvested rewards before modifying unclaimed or debt
// This converts the accumulator delta into userHarvestedPEA before debt is overwritten
_updateHarvestingRewards(user);
// Conditional unclaimed updates
if (ethReward != 0) {
userUnclaimedETH[user] += ethReward;
}
if (peaReward != 0) {
userUnclaimedPEA[user] += peaReward;
totalUnclaimed += peaReward;
}
// Update user's harvesting debt
userHarvestingDebt[user] = accHarvestingPerUnclaimed;
emit Checkpointed(roundId, user, ethReward, peaReward);
}
/**
* @notice Checkpoint rewards for a specific round
* @param roundId The round to checkpoint
*/
function checkpoint(uint64 roundId) external nonReentrant {
_checkpoint(roundId, msg.sender);
}
function _autoCheckpointPrevious(address user) internal {
uint64 lastRound = userLastRound[user];
if (lastRound == 0) return;
if (lastRound >= currentRoundId) return;
_checkpoint(lastRound, user);
}
/**
* @notice Claim accumulated ETH rewards
*/
function claimETH() external nonReentrant {
// Auto-checkpoint previous round
_autoCheckpointPrevious(msg.sender);
uint256 amount = userUnclaimedETH[msg.sender];
if (amount == 0) revert NothingToClaim();
// Safety net: cap at contract balance to prevent revert from rounding dust
uint256 balance = address(this).balance;
if (amount > balance) {
amount = balance;
}
userUnclaimedETH[msg.sender] = 0;
_safeTransferETH(msg.sender, amount);
emit ClaimedETH(msg.sender, amount);
}
/**
* @notice Claim accumulated PEA rewards with harvesting fee
*/
function claimPEA() external nonReentrant {
// Auto-checkpoint previous round
_autoCheckpointPrevious(msg.sender);
// First, update user's harvesting bonus
_updateHarvestingRewards(msg.sender);
uint256 minedPEA = userUnclaimedPEA[msg.sender];
uint256 harvestedPEA = userHarvestedPEA[msg.sender];
uint256 gross = minedPEA + harvestedPEA;
if (gross == 0) revert NothingToClaim();
// Calculate harvesting fee (only on mined, not on harvested bonus)
uint256 fee = 0;
if (minedPEA > 0 && totalUnclaimed > 0) {
fee = (minedPEA * HARVESTING_FEE_BPS) / BPS_DENOMINATOR;
// Distribute fee to remaining unclaimed holders
// Subtract user's unclaimed first since they're claiming
uint256 remainingUnclaimed = totalUnclaimed - minedPEA;
if (remainingUnclaimed > 0) {
accHarvestingPerUnclaimed += (fee * 1e18) / remainingUnclaimed;
} else {
// No other unclaimed holders: burn the fee instead of losing it
pea.burn(fee);
}
}
uint256 net = gross - fee;
// Safety net: cap at contract PEA balance to prevent revert from rounding dust
uint256 contractPeaBalance = IERC20(address(pea)).balanceOf(address(this));
if (net > contractPeaBalance) {
net = contractPeaBalance;
}
// Update state
totalUnclaimed -= minedPEA;
userUnclaimedPEA[msg.sender] = 0;
userHarvestedPEA[msg.sender] = 0;
userHarvestingDebt[msg.sender] = accHarvestingPerUnclaimed;
// Transfer PEA
require(IERC20(address(pea)).transfer(msg.sender, net), "Transfer failed");
emit ClaimedPEA(msg.sender, minedPEA, harvestedPEA, fee, net);
}
/**
* @notice Re-request VRF if the original request wasn't fulfilled within 1 hour
* @dev Anyone can call this after the timeout period
*/
function emergencyResetVRF() external payable nonReentrant {
if (!gameStarted) revert GameNotStarted();
Round storage round = rounds[currentRoundId];
RequestState storage req = roundRequests[currentRoundId];
// Must have a pending randomness request
if (!req.pending) revert InvalidVRFRequest();
// Must not be already settled
if (round.settled) revert RoundAlreadySettled();
// Must be at least 1 hour since round ended
if (block.timestamp < round.endTime + 1 hours) revert EmergencyTooEarly();
// Unmap the old request: if its reveal ever lands, _fulfillRandomness
// resolves roundId 0 and drops it silently. Note the old provider is used
// for the key, the owner may have rotated `provider` since the request.
uint64 oldSeq = req.seq;
delete requestToRound[_requestKey(req.provider, oldSeq)];
// Re-request from the CURRENT provider (owner rotates via setProvider if
// the original is dead/exhausted.
_requestSettlement(currentRoundId);
emit EmergencyVRFRequested(currentRoundId, oldSeq, req.seq, req.provider);
}
// ============ Internal Functions ============
function _startNextRound() internal {
currentRoundId += 1;
Round storage nextRound = rounds[currentRoundId];
nextRound.startTime = block.timestamp;
nextRound.endTime = block.timestamp + ROUND_DURATION;
emit GameStarted(currentRoundId, nextRound.startTime, nextRound.endTime);
}
function _getTopMinerSample(uint64 roundId) internal view returns (uint256) {
Round storage round = rounds[roundId];
return round.topMinerSeed % round.winnersDeployed;
}
/**
* @notice Resolve top miner by iterating deployers in index order
* @dev Called once per single-winner round on first checkpoint. Builds cumulative
* ranges on the fly for the winning block and finds whose range contains the sample.
*/
function _resolveTopMiner(uint64 roundId, Round storage round) internal {
uint8 winningBlock = round.winningBlock;
uint256 sample = round.topMinerSeed % round.winnersDeployed;
uint256 cumulative;
uint256 count = round.minerCount;
for (uint256 i; i < count; ) {
address addr = minerByIndex[roundId][i];
Miner storage m = miners[roundId][addr];
if ((m.deployedMask & (1 << winningBlock)) != 0) {
uint256 amt = m.amountPerBlock;
if (sample >= cumulative && sample < cumulative + amt) {
round.topMiner = addr;
return;
}
cumulative += amt;
}
unchecked { ++i; }
}
}
/// @dev View-only version of _resolveTopMiner for getTotalPendingRewards
function _viewResolveTopMiner(uint64 roundId, Round storage round) internal view returns (address) {
uint8 winningBlock = round.winningBlock;
uint256 sample = round.topMinerSeed % round.winnersDeployed;
uint256 cumulative;
uint256 count = round.minerCount;
for (uint256 i; i < count; ) {
address addr = minerByIndex[roundId][i];
Miner storage m = miners[roundId][addr];
if ((m.deployedMask & (1 << winningBlock)) != 0) {
uint256 amt = m.amountPerBlock;
if (sample >= cumulative && sample < cumulative + amt) {
return addr;
}
cumulative += amt;
}
unchecked { ++i; }
}
return address(0);
}
function _getClaimablePool(uint256 totalDeployed, uint256 winnersDeployed) internal pure returns (uint256) {
uint256 adminFee = (totalDeployed * ADMIN_FEE_BPS) / BPS_DENOMINATOR;
uint256 losersPool = totalDeployed - winnersDeployed;
uint256 losersAdminShare = (losersPool * ADMIN_FEE_BPS) / BPS_DENOMINATOR;
uint256 vaultAmount = ((losersPool - losersAdminShare) * VAULT_FEE_BPS) / BPS_DENOMINATOR;
return totalDeployed - adminFee - vaultAmount;
}
function _updateHarvestingRewards(address user) internal {
uint256 unclaimed = userUnclaimedPEA[user];
if (unclaimed == 0) return;
uint256 accumulatedPerToken = accHarvestingPerUnclaimed - userHarvestingDebt[user];
uint256 pending = (unclaimed * accumulatedPerToken) / 1e18;
userHarvestedPEA[user] += pending;
userHarvestingDebt[user] = accHarvestingPerUnclaimed;
}
function _safeTransferETH(address to, uint256 amount) internal {
(bool success, ) = to.call{value: amount}("");
if (!success) revert TransferFailed();
}
// ============ View Functions ============
function getRound(uint64 roundId) external view returns (
uint256 startTime,
uint256 endTime,
uint256 totalDeployed,
uint256 totalWinnings,
uint8 winningBlock,
address topMiner,
uint256 topMinerReward,
uint256 peapotAmount,
bool settled
) {
Round storage round = rounds[roundId];
return (
round.startTime,
round.endTime,
round.totalDeployed,
round.totalWinnings,
round.winningBlock,
round.topMiner,
round.topMinerReward,
round.peapotAmount,
round.settled
);
}
function getRoundDeployed(uint64 roundId) external view returns (uint256[25] memory) {
return rounds[roundId].deployed;
}
function getMinerInfo(uint64 roundId, address user) external view returns (
uint256 deployedMask,
uint256 amountPerBlock,
bool checkpointed
) {
Miner storage miner = miners[roundId][user];
return (miner.deployedMask, miner.amountPerBlock, miner.checkpointed);
}
function getPendingETH(address user) external view returns (uint256) {
return userUnclaimedETH[user];
}
function getPendingPEA(address user) external view returns (uint256 gross, uint256 fee, uint256 net) {
uint256 minedPEA = userUnclaimedPEA[user];
// Calculate pending harvesting bonus
uint256 accumulatedPerToken = accHarvestingPerUnclaimed - userHarvestingDebt[user];
uint256 pendingHarvested = (minedPEA * accumulatedPerToken) / 1e18;
uint256 harvestedPEA = userHarvestedPEA[user] + pendingHarvested;
gross = minedPEA + harvestedPEA;
// Fee only on mined
fee = (minedPEA * HARVESTING_FEE_BPS) / BPS_DENOMINATOR;
net = gross - fee;
}
function getTotalPendingRewards(address user) external view returns (
uint256 pendingETH,
uint256 pendingUnharvestedPEA,
uint256 pendingHarvestedPEA,
uint64 uncheckpointedRound
) {
// 1. Already checkpointed rewards
pendingETH = userUnclaimedETH[user];
pendingUnharvestedPEA = userUnclaimedPEA[user];
// 2. Harvesting bonus (stored + pending)
pendingHarvestedPEA = userHarvestedPEA[user]
+ (userUnclaimedPEA[user] * (accHarvestingPerUnclaimed - userHarvestingDebt[user])) / 1e18;
// 3. Check for uncheckpointed round
uint64 lastRound = userLastRound[user];
if (lastRound == 0) return (pendingETH, pendingUnharvestedPEA, pendingHarvestedPEA, 0);
Round storage round = rounds[lastRound];
Miner storage miner = miners[lastRound][user];
if (miner.checkpointed || !round.settled) {
return (pendingETH, pendingUnharvestedPEA, pendingHarvestedPEA, 0);
}
// 4. Calculate uncheckpointed rewards
{
uint8 winningBlock = round.winningBlock;
uint256 userDeployed = (miner.deployedMask & (1 << winningBlock)) != 0
? miner.amountPerBlock
: 0;
if (userDeployed == 0) {
return (pendingETH, pendingUnharvestedPEA, pendingHarvestedPEA, 0);
}
uncheckpointedRound = lastRound;
uint256 winnersDeployed = round.winnersDeployed;
// ETH: proportional share of actual retained ETH
pendingETH += (_getClaimablePool(round.totalDeployed, winnersDeployed) * userDeployed) / winnersDeployed;
// PEA (uncheckpointed goes to unharvested)
uint256 peaReward;
if (round.topMiner == address(0)) {
peaReward = (round.topMinerReward * userDeployed) / winnersDeployed;
} else if (round.topMiner == address(1)) {
if (round.minerCount > maxMinersForSingleWinner) {
// Over cap: would be forced to split on checkpoint
peaReward = (round.topMinerReward * userDeployed) / winnersDeployed;
} else {
// Unresolved single winner: iterate deployers to check
if (_viewResolveTopMiner(lastRound, round) == user) {
peaReward = round.topMinerReward;
}
}
} else if (round.topMiner == user) {
peaReward = round.topMinerReward;
}
if (round.peapotAmount != 0) {
peaReward += (round.peapotAmount * userDeployed) / winnersDeployed;
}
pendingUnharvestedPEA += peaReward;
}
}
function getCurrentRoundInfo() external view returns (
uint64 roundId,
uint256 startTime,
uint256 endTime,
uint256 totalDeployed,
uint256 timeRemaining,
bool isActive
) {
Round storage round = rounds[currentRoundId];
roundId = currentRoundId;
startTime = round.startTime;
endTime = round.endTime;
totalDeployed = round.totalDeployed;
timeRemaining = block.timestamp >= round.endTime ? 0 : round.endTime - block.timestamp;
isActive = gameStarted && block.timestamp < round.endTime && !round.settled;
}
// ============ Receive ============
receive() external payable {}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_coordinator",
"type": "address",
"internalType": "address"
},
{
"name": "_provider",
"type": "address",
"internalType": "address"
},
{
"name": "_pea",
"type": "address",
"internalType": "address"
},
{
"name": "_treasury",
"type": "address",
"internalType": "address"
},
{
"name": "_feeCollector",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyCheckpointed",
"type": "error",
"inputs": []
},
{
"name": "AlreadyDeployedThisRound",
"type": "error",
"inputs": []
},
{
"name": "CallerNotCoordinator",
"type": "error",
"inputs": [
{
"name": "caller",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "EmergencyTooEarly",
"type": "error",
"inputs": []
},
{
"name": "GameAlreadyStarted",
"type": "error",
"inputs": []
},
{
"name": "GameNotStarted",
"type": "error",
"inputs": []
},
{
"name": "InsufficientDeployAmount",
"type": "error",
"inputs": []
},
{
"name": "InsufficientFeeAttached",
"type": "error",
"inputs": [
{
"name": "provided",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "required",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InvalidBlockId",
"type": "error",
"inputs": []
},
{
"name": "InvalidPeapotAccumulation",
"type": "error",
"inputs": []
},
{
"name": "InvalidVRFRequest",
"type": "error",
"inputs": []
},
{
"name": "MaxSupplyReached",
"type": "error",
"inputs": []
},
{
"name": "MinimumThresholdTooLow",
"type": "error",
"inputs": []
},
{
"name": "NoBlocksSelected",
"type": "error",
"inputs": []
},
{
"name": "NotAutoMiner",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "RenounceDisabled",
"type": "error",
"inputs": []
},
{
"name": "RoundAlreadySettled",
"type": "error",
"inputs": []
},
{
"name": "RoundNotActive",
"type": "error",
"inputs": []
},
{
"name": "RoundNotEnded",
"type": "error",
"inputs": []
},
{
"name": "RoundNotSettled",
"type": "error",
"inputs": []
},
{
"name": "TransferFailed",
"type": "error",
"inputs": []
},
{
"name": "VRFAlreadyRequested",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "AutoMinerUpdated",
"type": "event",
"inputs": [
{
"name": "oldAutoMiner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newAutoMiner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Checkpointed",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethReward",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "peaReward",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ClaimedETH",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ClaimedPEA",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "minedPea",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "harvestedPea",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "net",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CoordinatorUpdated",
"type": "event",
"inputs": [
{
"name": "oldCoordinator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newCoordinator",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Deployed",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amountPerBlock",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "blockMask",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "totalAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "DeployedFor",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "executor",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amountPerBlock",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "blockMask",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "totalAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EmergencyVRFRequested",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "oldSeq",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "newSeq",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "provider",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "GameStarted",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "startTime",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "endTime",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PeapotAccumulationUpdated",
"type": "event",
"inputs": [
{
"name": "oldValue",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newValue",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ProviderUpdated",
"type": "event",
"inputs": [
{
"name": "oldProvider",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newProvider",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ResetRequested",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "provider",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "sequenceNumber",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "userRandom",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "feePaid",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "RoundSettled",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "winningBlock",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "topMiner",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "totalWinnings",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "topMinerReward",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "peapotAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "isSplit",
"type": "bool",
"indexed": false,
"internalType": "bool"
},
{
"name": "topMinerSeed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "winnersDeployed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ADMIN_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "BPS_DENOMINATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "GRID_SIZE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "HARVESTING_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_PEAPOT_ACCUMULATION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MIN_DEPLOY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MIN_PEAPOT_ACCUMULATION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "ONE_PEA",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "PEAPOT_CHANCE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "ROUND_DURATION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "VAULT_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "accHarvestingPerUnclaimed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "autoMiner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "checkpoint",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimETH",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimPEA",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "currentRoundId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "deploy",
"type": "function",
"inputs": [
{
"name": "blockIds",
"type": "uint8[]",
"internalType": "uint8[]"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "deployFor",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "blockIds",
"type": "uint8[]",
"internalType": "uint8[]"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "deriveWords",
"type": "function",
"inputs": [
{
"name": "randomNumber",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "words",
"type": "uint256[3]",
"internalType": "uint256[3]"
}
],
"stateMutability": "pure"
},
{
"name": "emergencyResetVRF",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "feeCollector",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "gameStarted",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "getCurrentRoundInfo",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "roundId",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "startTime",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "endTime",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "totalDeployed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "timeRemaining",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "isActive",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "getMinerInfo",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "deployedMask",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amountPerBlock",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "checkpointed",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "getPendingETH",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getPendingPEA",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "gross",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "net",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getRound",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [
{
"name": "startTime",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "endTime",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "totalDeployed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "totalWinnings",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "winningBlock",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "topMiner",
"type": "address",
"internalType": "address"
},
{
"name": "topMinerReward",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "peapotAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "settled",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "getRoundDeployed",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [
{
"name": "",
"type": "uint256[25]",
"internalType": "uint256[25]"
}
],
"stateMutability": "view"
},
{
"name": "getTotalPendingRewards",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "pendingETH",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "pendingUnharvestedPEA",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "pendingHarvestedPEA",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "uncheckpointedRound",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "maxMinersForSingleWinner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "miners",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "deployedMask",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amountPerBlock",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "checkpointed",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pea",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPea"
}
],
"stateMutability": "view"
},
{
"name": "peapotAccumulation",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "peapotPool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "provider",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "quiver",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IQuiverCoordinator"
}
],
"stateMutability": "view"
},
{
"name": "quiverCallback",
"type": "function",
"inputs": [
{
"name": "sequenceNumber",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "provider_",
"type": "address",
"internalType": "address"
},
{
"name": "randomNumber",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "view"
},
{
"name": "requestToRound",
"type": "function",
"inputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "reset",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "roundRequests",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [
{
"name": "provider",
"type": "address",
"internalType": "address"
},
{
"name": "seq",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "pending",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "rounds",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [
{
"name": "startTime",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "endTime",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "totalDeployed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "totalWinnings",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "winnersDeployed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "winningBlock",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "topMiner",
"type": "address",
"internalType": "address"
},
{
"name": "topMinerReward",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "peapotAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "topMinerSeed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "settled",
"type": "bool",
"internalType": "bool"
},
{
"name": "minerCount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setAutoMiner",
"type": "function",
"inputs": [
{
"name": "_autoMiner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setCoordinator",
"type": "function",
"inputs": [
{
"name": "_coordinator",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFeeCollector",
"type": "function",
"inputs": [
{
"name": "_feeCollector",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMaxMinersForSingleWinner",
"type": "function",
"inputs": [
{
"name": "_max",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPeapotAccumulation",
"type": "function",
"inputs": [
{
"name": "_accumulation",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setProvider",
"type": "function",
"inputs": [
{
"name": "_provider",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTreasury",
"type": "function",
"inputs": [
{
"name": "_treasury",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "startFirstRound",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "totalUnclaimed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ITreasury"
}
],
"stateMutability": "view"
},
{
"name": "userHarvestedPEA",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userHarvestingDebt",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userLastRound",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "userUnclaimedETH",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userUnclaimedPEA",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x6080604052610017600a670de0b6b3a764000061020e565b6003556107d0600a5534801561002b575f5ffd5b50604051613dc1380380613dc183398101604081905261004a91610248565b338061006f57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b610078816101a3565b5060016002556001600160a01b0385166100a55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0384166100cc5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0382166100f35760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03811661011a5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166101415760405163d92e233d60e01b815260040160405180910390fd5b600480546001600160a01b03199081166001600160a01b039788161790915560058054821695871695909517909455600680548516938616939093179092556007805484169185169190911790556008805490921692169190911790556102a9565b600180546001600160a01b03191690556101bc816101bf565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8261022857634e487b7160e01b5f52601260045260245ffd5b500490565b80516001600160a01b0381168114610243575f5ffd5b919050565b5f5f5f5f5f60a0868803121561025c575f5ffd5b6102658661022d565b94506102736020870161022d565b93506102816040870161022d565b925061028f6060870161022d565b915061029d6080870161022d565b90509295509295909350565b613b0b806102b65f395ff3fe6080604052600436106103ab575f3560e01c80637e930866116101e9578063c415b95c11610108578063e30c39781161009d578063f2fde38b1161006d578063f2fde38b14610d39578063f4bdfd92146104e1578063f9ec0c3014610d58578063fa397d6214610d8c575f5ffd5b8063e30c397814610ca7578063e3dcd71414610cc4578063eb6ab39714610cef578063f0f4426014610d1a575f5ffd5b8063cfd8d6c0116100d8578063cfd8d6c014610c57578063d17c65f914610c76578063d826f88f14610c8a578063e1a4521814610c92575f5ffd5b8063c415b95c14610beb578063c7f4c73014610c0a578063c96f14b814610c29578063ce67763714610c3e575f5ffd5b8063a42dce801161017e578063b8a907d71161014e578063b8a907d714610aab578063bc3ac87514610ac0578063bfb8de6714610bab578063c36234bf14610bd6575f5ffd5b8063a42dce8014610a04578063a8c478ba14610a23578063abedb4e414610a6b578063ac25625614610a97575f5ffd5b80638da5cb5b116101b95780638da5cb5b1461096c5780638ea98117146109885780639cbe5efd146109a7578063a14a09e8146109e5575f5ffd5b80637e930866146108cf5780637fc4eda81461092e578063888f2e4d146109425780638c65aa5314610957575f5ffd5b80634e17c155116102d55780636d532be01161026a57806376ff194a1161023a57806376ff194a1461085d57806378570c9c1461087c57806379ba5097146108a75780637c40d057146108bb575f5ffd5b80636d532be0146107c8578063715018a6146107e7578063747dff42146107fb578063757b4d3c14610848575f5ffd5b806361d027b3116102a557806361d027b3146107625780636641ea081461078157806367272999146107955780636729cde2146107a9575f5ffd5b80634e17c15514610674578063583581e7146106935780635e123ce4146106cd5780635eed82b3146106fd575f5ffd5b80632d588b181161034b578063472bd5fc1161031b578063472bd5fc1461051e57806349c36ca1146106015780634ba09ea01461062d5780634c6f7c7714610640575f5ffd5b80632d588b181461054657806332cb6b0c146105655780633aa6773b146105795780633afedcfc146105f9575f5ffd5b806321bfb16e1161038657806321bfb16e146104e157806324294b1f1461050a578063290b792c1461051e5780632929831414610533575f5ffd5b8063085d4883146103b6578063144d0229146103f25780631af6f852146104c0575f5ffd5b366103b257005b5f5ffd5b3480156103c1575f5ffd5b506005546103d5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103fd575f5ffd5b5061046f61040c36600461371b565b6001600160401b03165f908152600b6020908152604090912080546001820154601b830154601c840154601e850154601f86015496860154602290960154949793969295919460ff808316956101009093046001600160a01b0316949392911690565b60408051998a5260208a019890985296880195909552606087019390935260ff90911660808601526001600160a01b031660a085015260c084015260e08301521515610100820152610120016103e9565b3480156104cb575f5ffd5b506104df6104da36600461373d565b610dc0565b005b3480156104ec575f5ffd5b506104fc670de0b6b3a764000081565b6040519081526020016103e9565b348015610515575f5ffd5b506104df610e52565b348015610529575f5ffd5b506104fc6103e881565b6104df6105413660046137b6565b610f2d565b348015610551575f5ffd5b506104df61056036600461371b565b6112a3565b348015610570575f5ffd5b506104fc6112c2565b348015610584575f5ffd5b506105ca61059336600461371b565b600c6020525f90815260409020546001600160a01b03811690600160a01b81046001600160401b031690600160e01b900460ff1683565b604080516001600160a01b0390941684526001600160401b0390921660208401521515908201526060016103e9565b6104df6112da565b34801561060c575f5ffd5b5061062061061b36600461371b565b61148e565b6040516103e99190613804565b6104df61063b366004613835565b6114e7565b34801561064b575f5ffd5b506104fc61065a366004613873565b6001600160a01b03165f9081526015602052604090205490565b34801561067f575f5ffd5b506004546103d5906001600160a01b031681565b34801561069e575f5ffd5b506106b26106ad366004613873565b6117ee565b604080519384526020840192909252908201526060016103e9565b3480156106d8575f5ffd5b506009546106ed90600160e01b900460ff1681565b60405190151581526020016103e9565b348015610708575f5ffd5b5061074561071736600461388c565b600e60209081525f928352604080842090915290825290208054600182015460029092015490919060ff1683565b6040805193845260208401929092521515908201526060016103e9565b34801561076d575f5ffd5b506007546103d5906001600160a01b031681565b34801561078c575f5ffd5b506104fc603c81565b3480156107a0575f5ffd5b506104df6118ab565b3480156107b4575f5ffd5b506009546103d5906001600160a01b031681565b3480156107d3575f5ffd5b506104df6107e236600461373d565b611953565b3480156107f2575f5ffd5b506104df611983565b348015610806575f5ffd5b5061080f6119a4565b604080516001600160401b03909716875260208701959095529385019290925260608401526080830152151560a082015260c0016103e9565b348015610853575f5ffd5b506104fc60105481565b348015610868575f5ffd5b506006546103d5906001600160a01b031681565b348015610887575f5ffd5b506104fc610896366004613873565b60156020525f908152604090205481565b3480156108b2575f5ffd5b506104df611a30565b3480156108c6575f5ffd5b506104fc611a76565b3480156108da575f5ffd5b506107456108e936600461388c565b6001600160401b0382165f908152600e602090815260408083206001600160a01b038516845290915290208054600182015460029092015490919060ff169250925092565b348015610939575f5ffd5b506104fc601981565b34801561094d575f5ffd5b506104fc600a5481565b348015610962575f5ffd5b506104fc60035481565b348015610977575f5ffd5b505f546001600160a01b03166103d5565b348015610993575f5ffd5b506104df6109a2366004613873565b611a89565b3480156109b2575f5ffd5b506009546109cd90600160a01b90046001600160401b031681565b6040516001600160401b0390911681526020016103e9565b3480156109f0575f5ffd5b506104df6109ff366004613873565b611b09565b348015610a0f575f5ffd5b506104df610a1e366004613873565b611b62565b348015610a2e575f5ffd5b50610a42610a3d366004613873565b611bb3565b604080519485526020850193909352918301526001600160401b031660608201526080016103e9565b348015610a76575f5ffd5b50610a8a610a8536600461373d565b611e68565b6040516103e991906138bf565b348015610aa2575f5ffd5b506104fc606481565b348015610ab6575f5ffd5b506104fc61014d81565b348015610acb575f5ffd5b50610b45610ada36600461371b565b600b60209081525f918252604090912080546001820154601b830154601c840154601d850154601e860154601f87015497870154602188015460228901546023909901549799969895979496939560ff808516966101009095046001600160a01b031695949116908c565b604080519c8d5260208d019b909b52998b019890985260608a0196909652608089019490945260ff90921660a08801526001600160a01b031660c087015260e08601526101008501526101208401521515610140830152610160820152610180016103e9565b348015610bb6575f5ffd5b506104fc610bc5366004613873565b60166020525f908152604090205481565b348015610be1575f5ffd5b506104fc60125481565b348015610bf6575f5ffd5b506008546103d5906001600160a01b031681565b348015610c15575f5ffd5b506104df610c243660046138e6565b611ecc565b348015610c34575f5ffd5b506104fc60115481565b348015610c49575f5ffd5b506104fc650246139ca80081565b348015610c62575f5ffd5b506104df610c71366004613873565b611f04565b348015610c81575f5ffd5b506104df611f84565b6104df612294565b348015610c9d575f5ffd5b506104fc61271081565b348015610cb2575f5ffd5b506001546001600160a01b03166103d5565b348015610ccf575f5ffd5b506104fc610cde366004613873565b60136020525f908152604090205481565b348015610cfa575f5ffd5b506104fc610d09366004613873565b60146020525f908152604090205481565b348015610d25575f5ffd5b506104df610d34366004613873565b6123da565b348015610d44575f5ffd5b506104df610d53366004613873565b61242b565b348015610d63575f5ffd5b506109cd610d7236600461373d565b600d6020525f90815260409020546001600160401b031681565b348015610d97575f5ffd5b506109cd610da6366004613873565b60176020525f90815260409020546001600160401b031681565b610dc861249b565b610ddb600a670de0b6b3a764000061394a565b811080610def5750670de0b6b3a764000081115b15610e0d57604051633a7a24ff60e11b815260040160405180910390fd5b600380549082905560408051828152602081018490527f288b81dd2e10c3c5491b61fcca05e3125e8bb66e40cb46cd9e61e09e50f45ac5910160405180910390a15050565b610e5a61249b565b600954600160e01b900460ff1615610e855760405163ba26162b60e01b815260040160405180910390fd5b6009805468ffffffffffffffffff60a01b19166801000000000000000160a01b17905560015f52600b602052427f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf81815590610ee390603c9061395d565b6001828101829055825460408051918252602082019390935290917f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee91015b60405180910390a250565b610f356124c7565b6009546001600160a01b03163314610f605760405163c477fb5960e01b815260040160405180910390fd5b6001600160a01b038316610f875760405163d92e233d60e01b815260040160405180910390fd5b600954600160e01b900460ff16610fb157604051633a5f7b5760e01b815260040160405180910390fd5b610fba836124ef565b600954600160a01b90046001600160401b03165f908152600b6020526040902060018101544210610ffe57604051633df07da560e01b815260040160405180910390fd5b815f8190036110205760405163634538d760e11b815260040160405180910390fd5b5f61102b823461394a565b9050650246139ca80081101561105457604051631d1e083760e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600e602090815260408083206001600160a01b038a16845290915290208054156110a8576040516325b23b7360e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600f6020908152604080832060238801805485529252822080546001600160a01b0319166001600160a01b038b161790558054916110fc83613970565b91905055505f5f5f5b858110156111d7575f89898381811061112057611120613988565b9050602002016020810190611135919061399c565b905060198160ff161061115b5760405163037a804f60e41b815260040160405180910390fd5b600160ff82161b848116156111835760405163037a804f60e41b815260040160405180910390fd5b938417935f60028a0160ff8416601981106111a0576111a0613988565b015490506111ae888261395d565b8a6002018460ff16601981106111c6576111c6613988565b015550505090840190600101611105565b5081835560018301849055601b860180548291905f906111f890849061395d565b9091555050600980546001600160a01b038b165f81815260176020908152604091829020805467ffffffffffffffff19166001600160401b03600160a01b96879004811691909117909155945482518a815291820188905291810186905233949293909104909116907f3fd6d4655cbd51052f061eca2dbd0ba129aeb42238e9fa7ebd70aad5e5ce74a09060600160405180910390a450505050505061129e6001600255565b505050565b6112ab6124c7565b6112b58133612543565b6112bf6001600255565b50565b6112d7670de0b6b3a7640000622dc6c06139bc565b81565b6112e26124c7565b600954600160e01b900460ff1661130c57604051633a5f7b5760e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600b60209081526040808320600c9092529091208054600160e01b900460ff1661136057604051638043166d60e01b815260040160405180910390fd5b602282015460ff1615611386576040516308d4975360e11b815260040160405180910390fd5b600182015461139790610e1061395d565b4210156113b75760405163f7a44a2d60e01b815260040160405180910390fd5b80546001600160401b03600160a01b82041690600d905f906113e2906001600160a01b031684612874565b815260208101919091526040015f20805467ffffffffffffffff1916905560095461141c90600160a01b90046001600160401b03166128c8565b8154600954604080516001600160401b038581168252600160a01b808604821660208401526001600160a01b0390951694909304909216917f7e4e75b78cea80eabf352c359e9beecd6e5c7cfb8a0c56d000a1eda22ff7449b910160405180910390a350505061148c6001600255565b565b6114966136ca565b6001600160401b0382165f908152600b6020526040908190208151610320810190925260020160198282826020028201915b8154815260200190600101908083116114c85750505050509050919050565b6114ef6124c7565b600954600160e01b900460ff1661151957604051633a5f7b5760e01b815260040160405180910390fd5b611522336124ef565b600954600160a01b90046001600160401b03165f908152600b602052604090206001810154421061156657604051633df07da560e01b815260040160405180910390fd5b815f8190036115885760405163634538d760e11b815260040160405180910390fd5b5f611593823461394a565b9050650246139ca8008110156115bc57604051631d1e083760e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600e602090815260408083203384529091529020805415611607576040516325b23b7360e01b815260040160405180910390fd5b6009546001600160401b03600160a01b909104165f908152600f6020908152604080832060238801805485529252822080546001600160a01b0319163317905580549161165383613970565b91905055505f5f5f5b8581101561172e575f89898381811061167757611677613988565b905060200201602081019061168c919061399c565b905060198160ff16106116b25760405163037a804f60e41b815260040160405180910390fd5b600160ff82161b848116156116da5760405163037a804f60e41b815260040160405180910390fd5b938417935f60028a0160ff8416601981106116f7576116f7613988565b01549050611705888261395d565b8a6002018460ff166019811061171d5761171d613988565b01555050509084019060010161165c565b5081835560018301849055601b860180548291905f9061174f90849061395d565b909155505060098054335f81815260176020908152604091829020805467ffffffffffffffff19166001600160401b03600160a01b96879004811691909117909155945482518a81529182018890529181018690529193929004909116907f53f785e510cb7ac398694df2c027c73935e2518c3b1cd4dba93f8bb62a8bbee09060600160405180910390a35050505050506117ea6001600255565b5050565b6001600160a01b0381165f9081526014602090815260408083205460139092528220546012548392839290918391611825916139d3565b90505f670de0b6b3a764000061183b83856139bc565b611845919061394a565b6001600160a01b0388165f908152601660205260408120549192509061186c90839061395d565b9050611878818561395d565b96506127106118896103e8866139bc565b611893919061394a565b955061189f86886139d3565b96989597505050505050565b6118b36124c7565b6118bc336124ef565b335f90815260156020526040812054908190036118ec576040516312d37ee560e31b815260040160405180910390fd5b47808211156118f9578091505b335f818152601560205260408120556119129083612bdd565b60405182815233907f9f413f0f451c24edeec8f50838056a8d47c9d8ea0226e5a536392f677a310ad59060200160405180910390a2505061148c6001600255565b61195b61249b565b6101f481101561197e57604051639728086160e01b815260040160405180910390fd5b600a55565b61198b61249b565b604051638905116560e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f818152600b6020526040812080546001820154601b830154919390928190428511156119f3574281600101546119ee91906139d3565b6119f5565b5f5b600954909350600160e01b900460ff168015611a145750806001015442105b8015611a255750602281015460ff16155b915050909192939495565b60015433906001600160a01b03168114611a6d5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6112bf81612c4d565b6112d7600a670de0b6b3a764000061394a565b611a9161249b565b6001600160a01b038116611ab85760405163d92e233d60e01b815260040160405180910390fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fe73ccba5c53e91a1e91298739cd456da0ef0db1a3548dcd4561ea86f413ec8a9905f90a35050565b611b1161249b565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fbc664a4a5fa107eb6ca045678e16092e2f335cdd8d9ef3e64d8f79a32014d9a5905f90a35050565b611b6a61249b565b6001600160a01b038116611b915760405163d92e233d60e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381165f9081526015602090815260408083205460148352818420546013909352908320546012549193918291670de0b6b3a764000091611bfb91906139d3565b6001600160a01b0387165f90815260146020526040902054611c1d91906139bc565b611c27919061394a565b6001600160a01b0386165f90815260166020526040902054611c49919061395d565b6001600160a01b0386165f908152601760205260408120549193506001600160401b0390911690819003611c8057505f9050611e61565b6001600160401b0381165f908152600b60209081526040808320600e83528184206001600160a01b038b168552909252909120600281015460ff1680611ccb5750602282015460ff16155b15611cdc57505f9250611e61915050565b601e820154815460ff909116905f906001831b168103611cfc575f611d02565b82600101545b9050805f03611d1957505f9450611e619350505050565b8495505f84601d015490508082611d3487601b015484612c66565b611d3e91906139bc565b611d48919061394a565b611d52908b61395d565b601e860154909a505f9061010090046001600160a01b0316611d9057818387601f0154611d7f91906139bc565b611d89919061394a565b9050611e1b565b601e8601545f196101009091046001600160a01b031601611df857600a5486602301541115611dca57818387601f0154611d7f91906139bc565b8b6001600160a01b0316611dde8888612cf1565b6001600160a01b031603611df35750601f8501545b611e1b565b601e8601546001600160a01b03808e166101009092041603611e1b5750601f8501545b602086015415611e4d5781838760200154611e3691906139bc565b611e40919061394a565b611e4a908261395d565b90505b611e57818b61395d565b9950505050505050505b9193509193565b611e706136e9565b5f5b6003811015611ec6576040805160208101859052908101829052606001604051602081830303815290604052805190602001205f1c828260038110611eb957611eb9613988565b6020020152600101611e72565b50919050565b6004546001600160a01b03163314611ef9576040516356b3678560e01b8152336004820152602401611a64565b61129e838383612dcd565b611f0c61249b565b6001600160a01b038116611f335760405163d92e233d60e01b815260040160405180910390fd5b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fa4652513510d8a8ef70d7c10761c2fd3d3f582d2e903ac7f7a74c3075331f53f905f90a35050565b611f8c6124c7565b611f95336124ef565b611f9e3361302b565b335f9081526014602090815260408083205460169092528220549091611fc4828461395d565b9050805f03611fe6576040516312d37ee560e31b815260040160405180910390fd5b5f8315801590611ff757505f601154115b156120c25761271061200b6103e8866139bc565b612015919061394a565b90505f8460115461202691906139d3565b90508015612066578061204183670de0b6b3a76400006139bc565b61204b919061394a565b60125f82825461205b919061395d565b909155506120c09050565b600654604051630852cd8d60e31b8152600481018490526001600160a01b03909116906342966c68906024015f604051808303815f87803b1580156120a9575f5ffd5b505af11580156120bb573d5f5f3e3d5ffd5b505050505b505b5f6120cd82846139d3565b6006546040516370a0823160e01b81523060048201529192505f916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612118573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213c91906139e6565b90508082111561214a578091505b8560115f82825461215b91906139d3565b9091555050335f8181526014602090815260408083208390556016825280832083905560125460139092529182902055600654905163a9059cbb60e01b81526004810192909252602482018490526001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc91906139fd565b61223a5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401611a64565b60408051878152602081018790529081018490526060810183905233907fd4bdb3a49e6ee1927e5f6ddfb99bae8139ef81210a3daba695433daf13b32d139060800160405180910390a250505050505061148c6001600255565b61229c6124c7565b600954600160e01b900460ff166122c657604051633a5f7b5760e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600b60205260409020600181015442101561230b57604051636218b96960e11b815260040160405180910390fd5b602281015460ff1615612331576040516308d4975360e11b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600c6020526040902054600160e01b900460ff161561237a5760405163029c583d60e01b815260040160405180910390fd5b80601b01545f036123b25760228101805460ff1916600117905561239c6130e9565b34156123ac576123ac3334612bdd565b506123d0565b6009546123ce90600160a01b90046001600160401b03166128c8565b505b61148c6001600255565b6123e261249b565b6001600160a01b0381166124095760405163d92e233d60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b61243361249b565b600180546001600160a01b0383166001600160a01b031990911681179091556124635f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b0316331461148c5760405163118cdaa760e01b8152336004820152602401611a64565b60028054036124e957604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b6001600160a01b0381165f908152601760205260408120546001600160401b03169081900361251c575050565b6009546001600160401b03600160a01b90910481169082161061253d575050565b6117ea81835b6001600160401b0382165f908152600b60209081526040808320600e83528184206001600160a01b0386168552909252909120600281015460ff168061258e5750602282015460ff16155b156125995750505050565b601e820154815460ff909116905f906001831b1681036125b9575f6125bf565b82600101545b9050805f0361262d5760028301805460ff19166001179055604080515f80825260208201526001600160a01b038716916001600160401b038916917f6c43ab65cd0ebdd66d111a711fedd4b61c1eb8c18b791217bead63294658b1c6910160405180910390a3505050505050565b5f84601d015490505f5f61264587601b015484612c66565b9050828482028161265857612658613922565b601e89015491900492505f915061010090046001600160a01b031661269957828488601f015461268891906139bc565b612692919061394a565b905061273c565b601e8701545f196101009091046001600160a01b03160161271957600a54876023015411156126e757601e87018054610100600160a81b0319169055601f87015483906126889086906139bc565b6126f189886131ae565b601e8701546001600160a01b03808a1661010090920416036127145750601f8601545b61273c565b601e8701546001600160a01b03808a16610100909204160361273c5750601f8601545b60208701541561276e578284886020015461275791906139bc565b612761919061394a565b61276b908261395d565b90505b60028601805460ff191660011790556127868861302b565b81156127b9576001600160a01b0388165f90815260156020526040812080548492906127b390849061395d565b90915550505b8015612804576001600160a01b0388165f90815260146020526040812080548392906127e690849061395d565b925050819055508060115f8282546127fe919061395d565b90915550505b6012546001600160a01b0389165f8181526013602090815260409182902093909355805185815292830184905290916001600160401b038c16917f6c43ab65cd0ebdd66d111a711fedd4b61c1eb8c18b791217bead63294658b1c6910160405180910390a3505050505050505050565b6040516bffffffffffffffffffffffff19606084901b1660208201526001600160c01b031960c083901b1660348201525f90603c016040516020818303038152906040528051906020012090505b92915050565b6001600160401b038082165f908152600c6020526040812054909130918491600160a01b90910416426128fc6001436139d3565b40335a604080516001600160a01b0398891660208201526001600160401b0397881691810191909152949095166060850152608084019290925260a083015290921660c083015260e08201526101000160408051808303601f1901815290829052805160209091012060055460048054631711922960e31b85526001600160a01b03928316918501829052929450925f92919091169063b88c914890602401602060405180830381865afa1580156129b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129da9190613a1c565b9050806001600160801b0316341015612a175760405163058fd01160e11b81523460048201526001600160801b0382166024820152604401611a64565b600480546040516319cb825f60e01b81526001600160a01b0385811693820193909352602481018690525f92909116906319cb825f906001600160801b0385169060440160206040518083038185885af1158015612a77573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612a9c9190613a42565b604080516060810182526001600160a01b0380871682526001600160401b03808516602080850191825260018587019081528c84165f908152600c90925295812094518554925196511515600160e01b0260ff60e01b1997909416600160a01b026001600160e01b031990931694169390931717939093169290921790559091508590600d90612b2c8685612874565b815260208082019290925260409081015f20805467ffffffffffffffff19166001600160401b03948516179055805184841681529182018790526001600160801b038516908201526001600160a01b038516918716907f16e62717d11d80b60c5f2fca3c3e381a0d22d6555d9c0b2d081f6f7d9fab22719060600160405180910390a35f612bc36001600160801b038416346139d3565b90508015612bd557612bd53382612bdd565b505050505050565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612c26576040519150601f19603f3d011682016040523d82523d5f602084013e612c2b565b606091505b505090508061129e576040516312171d8360e31b815260040160405180910390fd5b600180546001600160a01b03191690556112bf816132a0565b5f80612710612c766064866139bc565b612c80919061394a565b90505f612c8d84866139d3565b90505f612710612c9e6064846139bc565b612ca8919061394a565b90505f6127106103e8612cbb84866139d3565b612cc591906139bc565b612ccf919061394a565b905080612cdc85896139d3565b612ce691906139d3565b979650505050505050565b601e810154601d82015460218301545f9260ff16918391612d129190613a5d565b60238501549091505f90815b81811015612dc0576001600160401b0388165f818152600f60209081526040808320858452825280832054938352600e82528083206001600160a01b039094168084529390915290208054600160ff89161b1615612db6576001810154858710801590612d935750612d90818761395d565b87105b15612da85782985050505050505050506128c2565b612db2818761395d565b9550505b5050600101612d1e565b505f979650505050505050565b5f600d5f612ddb8587612874565b815260208101919091526040015f908120546001600160401b03169150819003612e055750505050565b6001600160401b0381165f908152600b60205260409020602281015460ff1615612e30575050505050565b5f612e3a84611e68565b80519091505f90612e4d90601990613a5d565b601e8401805460ff191660ff8316908117909155909150600284019060198110612e7957612e79613988565b0154601d84018190555f03612ebe576001600160401b0384165f908152600c60205260409020805460ff60e01b19169055612eb58484836132ef565b50505050505050565b5f612ed184601b015485601d015461340b565b6040810151601c86015590505f612ee885856134cb565b60228601805460ff191660011790556001600160401b0387165f908152600c60205260409020805460ff60e01b191690556008548351919250612f36916001600160a01b0390911690612bdd565b60075f9054906101000a90046001600160a01b03166001600160a01b031663f690727583602001516040518263ffffffff1660e01b81526004015f604051808303818588803b158015612f87575f5ffd5b505af1158015612f99573d5f5f3e3d5ffd5b5050505050612fa66130e9565b856001600160401b03167fe6572cd534fc4ba30405faf386eb235e01c8877062954147fad1f880b9fcf74b8487601e0160019054906101000a90046001600160a01b031688601c015489601f01548a60200154878c602101548d601d0154604051613018989796959493929190613a70565b60405180910390a2505050505050505050565b6001600160a01b0381165f908152601460205260408120549081900361304f575050565b6001600160a01b0382165f9081526013602052604081205460125461307491906139d3565b90505f670de0b6b3a764000061308a83856139bc565b613094919061394a565b6001600160a01b0385165f908152601660205260408120805492935083929091906130c090849061395d565b90915550506012546001600160a01b039094165f90815260136020526040902093909355505050565b6001600960148282829054906101000a90046001600160401b031661310e9190613ab6565b82546101009290920a6001600160401b03818102199093169183160217909155600954600160a01b9004165f908152600b602052604090204280825590915061315990603c9061395d565b600182018190556009548254604080519182526020820193909352600160a01b9091046001600160401b0316917f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee9101610f22565b601e810154601d820154602183015460ff909216915f916131ce91613a5d565b60238401549091505f90815b81811015612eb5576001600160401b0387165f818152600f60209081526040808320858452825280832054938352600e82528083206001600160a01b039094168084529390915290208054600160ff89161b161561329657600181015485871080159061324f575061324c818761395d565b87105b15613288575050601e90960180546001600160a01b0390971661010002610100600160a81b031990971696909617909555505050505050565b613292818761395d565b9550505b50506001016131da565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f612710606484601b015461330491906139bc565b61330e919061394a565b90505f8184601b015461332191906139d3565b60228501805460ff19166001179055600854909150613349906001600160a01b031683612bdd565b60075f9054906101000a90046001600160a01b03166001600160a01b031663f6907275826040518263ffffffff1660e01b81526004015f604051808303818588803b158015613396575f5ffd5b505af11580156133a8573d5f5f3e3d5ffd5b50505050506133b56130e9565b846001600160401b03167fe6572cd534fc4ba30405faf386eb235e01c8877062954147fad1f880b9fcf74b845f5f5f5f5f5f5f6040516133fc989796959493929190613a70565b60405180910390a25050505050565b61342c60405180606001604052805f81526020015f81526020015f81525090565b5f61343783856139d3565b90505f6127106134486064876139bc565b613452919061394a565b90505f6127106134636064856139bc565b61346d919061394a565b90505f61347a82856139d3565b90505f61271061348c6103e8846139bc565b613496919061394a565b90505f6134a382846139d3565b6040805160608101825296875260208701939093529185019190915250919695505050505050565b60208101515f906134de90600290613a5d565b5f1490505f60065f9054906101000a90046001600160a01b03166001600160a01b031663a2309ff86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613533573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061355791906139e6565b61356c670de0b6b3a7640000622dc6c06139bc565b61357691906139d3565b90505f81670de0b6b3a76400001161359657670de0b6b3a7640000613598565b815b90506135a481836139d3565b91505f82600354116135b8576003546135ba565b825b60208601516021880155601f87018390559050836135d95760016135db565b5f5b601e870180546001600160a01b039290921661010002610100600160a81b031990921691909117905560408501516136169061014d90613a5d565b15801561362457505f601054115b15613636576010805460208801555f90555b8060105f828254613647919061395d565b909155505f9050613658828461395d565b905080156136c0576006546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f19906044015f604051808303815f87803b1580156136a9575f5ffd5b505af11580156136bb573d5f5f3e3d5ffd5b505050505b5050505092915050565b6040518061032001604052806019906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6001600160401b03811681146112bf575f5ffd5b5f6020828403121561372b575f5ffd5b813561373681613707565b9392505050565b5f6020828403121561374d575f5ffd5b5035919050565b80356001600160a01b038116811461376a575f5ffd5b919050565b5f5f83601f84011261377f575f5ffd5b5081356001600160401b03811115613795575f5ffd5b6020830191508360208260051b85010111156137af575f5ffd5b9250929050565b5f5f5f604084860312156137c8575f5ffd5b6137d184613754565b925060208401356001600160401b038111156137eb575f5ffd5b6137f78682870161376f565b9497909650939450505050565b610320810181835f5b601981101561382c57815183526020928301929091019060010161380d565b50505092915050565b5f5f60208385031215613846575f5ffd5b82356001600160401b0381111561385b575f5ffd5b6138678582860161376f565b90969095509350505050565b5f60208284031215613883575f5ffd5b61373682613754565b5f5f6040838503121561389d575f5ffd5b82356138a881613707565b91506138b660208401613754565b90509250929050565b6060810181835f5b600381101561382c5781518352602092830192909101906001016138c7565b5f5f5f606084860312156138f8575f5ffd5b833561390381613707565b925061391160208501613754565b929592945050506040919091013590565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261395857613958613922565b500490565b808201808211156128c2576128c2613936565b5f6001820161398157613981613936565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156139ac575f5ffd5b813560ff81168114613736575f5ffd5b80820281158282048414176128c2576128c2613936565b818103818111156128c2576128c2613936565b5f602082840312156139f6575f5ffd5b5051919050565b5f60208284031215613a0d575f5ffd5b81518015158114613736575f5ffd5b5f60208284031215613a2c575f5ffd5b81516001600160801b0381168114613736575f5ffd5b5f60208284031215613a52575f5ffd5b815161373681613707565b5f82613a6b57613a6b613922565b500690565b60ff9890981688526001600160a01b03969096166020880152604087019490945260608601929092526080850152151560a084015260c083015260e08201526101000190565b6001600160401b0381811683821601908111156128c2576128c261393656fea264697066735822122063f5e986e9e415a975c9c16c369162dc4275e0c72db4118a8d03e0b61b524c0d64736f6c634300081c003300000000000000000000000050e94d9f31285b03ed7797b5283f54da04fb9175000000000000000000000000643f7e5569069415ecc12d309008a290266d9c38000000000000000000000000fe177128df8d336caf99f787b72183d1e68ff9c200000000000000000000000078df583557baa1b9c8b8839becaae2ed665bd7e60000000000000000000000002c2352c43f17e22abe61efea4e0fe478658c4eb3
0x6080604052600436106103ab575f3560e01c80637e930866116101e9578063c415b95c11610108578063e30c39781161009d578063f2fde38b1161006d578063f2fde38b14610d39578063f4bdfd92146104e1578063f9ec0c3014610d58578063fa397d6214610d8c575f5ffd5b8063e30c397814610ca7578063e3dcd71414610cc4578063eb6ab39714610cef578063f0f4426014610d1a575f5ffd5b8063cfd8d6c0116100d8578063cfd8d6c014610c57578063d17c65f914610c76578063d826f88f14610c8a578063e1a4521814610c92575f5ffd5b8063c415b95c14610beb578063c7f4c73014610c0a578063c96f14b814610c29578063ce67763714610c3e575f5ffd5b8063a42dce801161017e578063b8a907d71161014e578063b8a907d714610aab578063bc3ac87514610ac0578063bfb8de6714610bab578063c36234bf14610bd6575f5ffd5b8063a42dce8014610a04578063a8c478ba14610a23578063abedb4e414610a6b578063ac25625614610a97575f5ffd5b80638da5cb5b116101b95780638da5cb5b1461096c5780638ea98117146109885780639cbe5efd146109a7578063a14a09e8146109e5575f5ffd5b80637e930866146108cf5780637fc4eda81461092e578063888f2e4d146109425780638c65aa5314610957575f5ffd5b80634e17c155116102d55780636d532be01161026a57806376ff194a1161023a57806376ff194a1461085d57806378570c9c1461087c57806379ba5097146108a75780637c40d057146108bb575f5ffd5b80636d532be0146107c8578063715018a6146107e7578063747dff42146107fb578063757b4d3c14610848575f5ffd5b806361d027b3116102a557806361d027b3146107625780636641ea081461078157806367272999146107955780636729cde2146107a9575f5ffd5b80634e17c15514610674578063583581e7146106935780635e123ce4146106cd5780635eed82b3146106fd575f5ffd5b80632d588b181161034b578063472bd5fc1161031b578063472bd5fc1461051e57806349c36ca1146106015780634ba09ea01461062d5780634c6f7c7714610640575f5ffd5b80632d588b181461054657806332cb6b0c146105655780633aa6773b146105795780633afedcfc146105f9575f5ffd5b806321bfb16e1161038657806321bfb16e146104e157806324294b1f1461050a578063290b792c1461051e5780632929831414610533575f5ffd5b8063085d4883146103b6578063144d0229146103f25780631af6f852146104c0575f5ffd5b366103b257005b5f5ffd5b3480156103c1575f5ffd5b506005546103d5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103fd575f5ffd5b5061046f61040c36600461371b565b6001600160401b03165f908152600b6020908152604090912080546001820154601b830154601c840154601e850154601f86015496860154602290960154949793969295919460ff808316956101009093046001600160a01b0316949392911690565b60408051998a5260208a019890985296880195909552606087019390935260ff90911660808601526001600160a01b031660a085015260c084015260e08301521515610100820152610120016103e9565b3480156104cb575f5ffd5b506104df6104da36600461373d565b610dc0565b005b3480156104ec575f5ffd5b506104fc670de0b6b3a764000081565b6040519081526020016103e9565b348015610515575f5ffd5b506104df610e52565b348015610529575f5ffd5b506104fc6103e881565b6104df6105413660046137b6565b610f2d565b348015610551575f5ffd5b506104df61056036600461371b565b6112a3565b348015610570575f5ffd5b506104fc6112c2565b348015610584575f5ffd5b506105ca61059336600461371b565b600c6020525f90815260409020546001600160a01b03811690600160a01b81046001600160401b031690600160e01b900460ff1683565b604080516001600160a01b0390941684526001600160401b0390921660208401521515908201526060016103e9565b6104df6112da565b34801561060c575f5ffd5b5061062061061b36600461371b565b61148e565b6040516103e99190613804565b6104df61063b366004613835565b6114e7565b34801561064b575f5ffd5b506104fc61065a366004613873565b6001600160a01b03165f9081526015602052604090205490565b34801561067f575f5ffd5b506004546103d5906001600160a01b031681565b34801561069e575f5ffd5b506106b26106ad366004613873565b6117ee565b604080519384526020840192909252908201526060016103e9565b3480156106d8575f5ffd5b506009546106ed90600160e01b900460ff1681565b60405190151581526020016103e9565b348015610708575f5ffd5b5061074561071736600461388c565b600e60209081525f928352604080842090915290825290208054600182015460029092015490919060ff1683565b6040805193845260208401929092521515908201526060016103e9565b34801561076d575f5ffd5b506007546103d5906001600160a01b031681565b34801561078c575f5ffd5b506104fc603c81565b3480156107a0575f5ffd5b506104df6118ab565b3480156107b4575f5ffd5b506009546103d5906001600160a01b031681565b3480156107d3575f5ffd5b506104df6107e236600461373d565b611953565b3480156107f2575f5ffd5b506104df611983565b348015610806575f5ffd5b5061080f6119a4565b604080516001600160401b03909716875260208701959095529385019290925260608401526080830152151560a082015260c0016103e9565b348015610853575f5ffd5b506104fc60105481565b348015610868575f5ffd5b506006546103d5906001600160a01b031681565b348015610887575f5ffd5b506104fc610896366004613873565b60156020525f908152604090205481565b3480156108b2575f5ffd5b506104df611a30565b3480156108c6575f5ffd5b506104fc611a76565b3480156108da575f5ffd5b506107456108e936600461388c565b6001600160401b0382165f908152600e602090815260408083206001600160a01b038516845290915290208054600182015460029092015490919060ff169250925092565b348015610939575f5ffd5b506104fc601981565b34801561094d575f5ffd5b506104fc600a5481565b348015610962575f5ffd5b506104fc60035481565b348015610977575f5ffd5b505f546001600160a01b03166103d5565b348015610993575f5ffd5b506104df6109a2366004613873565b611a89565b3480156109b2575f5ffd5b506009546109cd90600160a01b90046001600160401b031681565b6040516001600160401b0390911681526020016103e9565b3480156109f0575f5ffd5b506104df6109ff366004613873565b611b09565b348015610a0f575f5ffd5b506104df610a1e366004613873565b611b62565b348015610a2e575f5ffd5b50610a42610a3d366004613873565b611bb3565b604080519485526020850193909352918301526001600160401b031660608201526080016103e9565b348015610a76575f5ffd5b50610a8a610a8536600461373d565b611e68565b6040516103e991906138bf565b348015610aa2575f5ffd5b506104fc606481565b348015610ab6575f5ffd5b506104fc61014d81565b348015610acb575f5ffd5b50610b45610ada36600461371b565b600b60209081525f918252604090912080546001820154601b830154601c840154601d850154601e860154601f87015497870154602188015460228901546023909901549799969895979496939560ff808516966101009095046001600160a01b031695949116908c565b604080519c8d5260208d019b909b52998b019890985260608a0196909652608089019490945260ff90921660a08801526001600160a01b031660c087015260e08601526101008501526101208401521515610140830152610160820152610180016103e9565b348015610bb6575f5ffd5b506104fc610bc5366004613873565b60166020525f908152604090205481565b348015610be1575f5ffd5b506104fc60125481565b348015610bf6575f5ffd5b506008546103d5906001600160a01b031681565b348015610c15575f5ffd5b506104df610c243660046138e6565b611ecc565b348015610c34575f5ffd5b506104fc60115481565b348015610c49575f5ffd5b506104fc650246139ca80081565b348015610c62575f5ffd5b506104df610c71366004613873565b611f04565b348015610c81575f5ffd5b506104df611f84565b6104df612294565b348015610c9d575f5ffd5b506104fc61271081565b348015610cb2575f5ffd5b506001546001600160a01b03166103d5565b348015610ccf575f5ffd5b506104fc610cde366004613873565b60136020525f908152604090205481565b348015610cfa575f5ffd5b506104fc610d09366004613873565b60146020525f908152604090205481565b348015610d25575f5ffd5b506104df610d34366004613873565b6123da565b348015610d44575f5ffd5b506104df610d53366004613873565b61242b565b348015610d63575f5ffd5b506109cd610d7236600461373d565b600d6020525f90815260409020546001600160401b031681565b348015610d97575f5ffd5b506109cd610da6366004613873565b60176020525f90815260409020546001600160401b031681565b610dc861249b565b610ddb600a670de0b6b3a764000061394a565b811080610def5750670de0b6b3a764000081115b15610e0d57604051633a7a24ff60e11b815260040160405180910390fd5b600380549082905560408051828152602081018490527f288b81dd2e10c3c5491b61fcca05e3125e8bb66e40cb46cd9e61e09e50f45ac5910160405180910390a15050565b610e5a61249b565b600954600160e01b900460ff1615610e855760405163ba26162b60e01b815260040160405180910390fd5b6009805468ffffffffffffffffff60a01b19166801000000000000000160a01b17905560015f52600b602052427f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf81815590610ee390603c9061395d565b6001828101829055825460408051918252602082019390935290917f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee91015b60405180910390a250565b610f356124c7565b6009546001600160a01b03163314610f605760405163c477fb5960e01b815260040160405180910390fd5b6001600160a01b038316610f875760405163d92e233d60e01b815260040160405180910390fd5b600954600160e01b900460ff16610fb157604051633a5f7b5760e01b815260040160405180910390fd5b610fba836124ef565b600954600160a01b90046001600160401b03165f908152600b6020526040902060018101544210610ffe57604051633df07da560e01b815260040160405180910390fd5b815f8190036110205760405163634538d760e11b815260040160405180910390fd5b5f61102b823461394a565b9050650246139ca80081101561105457604051631d1e083760e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600e602090815260408083206001600160a01b038a16845290915290208054156110a8576040516325b23b7360e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600f6020908152604080832060238801805485529252822080546001600160a01b0319166001600160a01b038b161790558054916110fc83613970565b91905055505f5f5f5b858110156111d7575f89898381811061112057611120613988565b9050602002016020810190611135919061399c565b905060198160ff161061115b5760405163037a804f60e41b815260040160405180910390fd5b600160ff82161b848116156111835760405163037a804f60e41b815260040160405180910390fd5b938417935f60028a0160ff8416601981106111a0576111a0613988565b015490506111ae888261395d565b8a6002018460ff16601981106111c6576111c6613988565b015550505090840190600101611105565b5081835560018301849055601b860180548291905f906111f890849061395d565b9091555050600980546001600160a01b038b165f81815260176020908152604091829020805467ffffffffffffffff19166001600160401b03600160a01b96879004811691909117909155945482518a815291820188905291810186905233949293909104909116907f3fd6d4655cbd51052f061eca2dbd0ba129aeb42238e9fa7ebd70aad5e5ce74a09060600160405180910390a450505050505061129e6001600255565b505050565b6112ab6124c7565b6112b58133612543565b6112bf6001600255565b50565b6112d7670de0b6b3a7640000622dc6c06139bc565b81565b6112e26124c7565b600954600160e01b900460ff1661130c57604051633a5f7b5760e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600b60209081526040808320600c9092529091208054600160e01b900460ff1661136057604051638043166d60e01b815260040160405180910390fd5b602282015460ff1615611386576040516308d4975360e11b815260040160405180910390fd5b600182015461139790610e1061395d565b4210156113b75760405163f7a44a2d60e01b815260040160405180910390fd5b80546001600160401b03600160a01b82041690600d905f906113e2906001600160a01b031684612874565b815260208101919091526040015f20805467ffffffffffffffff1916905560095461141c90600160a01b90046001600160401b03166128c8565b8154600954604080516001600160401b038581168252600160a01b808604821660208401526001600160a01b0390951694909304909216917f7e4e75b78cea80eabf352c359e9beecd6e5c7cfb8a0c56d000a1eda22ff7449b910160405180910390a350505061148c6001600255565b565b6114966136ca565b6001600160401b0382165f908152600b6020526040908190208151610320810190925260020160198282826020028201915b8154815260200190600101908083116114c85750505050509050919050565b6114ef6124c7565b600954600160e01b900460ff1661151957604051633a5f7b5760e01b815260040160405180910390fd5b611522336124ef565b600954600160a01b90046001600160401b03165f908152600b602052604090206001810154421061156657604051633df07da560e01b815260040160405180910390fd5b815f8190036115885760405163634538d760e11b815260040160405180910390fd5b5f611593823461394a565b9050650246139ca8008110156115bc57604051631d1e083760e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600e602090815260408083203384529091529020805415611607576040516325b23b7360e01b815260040160405180910390fd5b6009546001600160401b03600160a01b909104165f908152600f6020908152604080832060238801805485529252822080546001600160a01b0319163317905580549161165383613970565b91905055505f5f5f5b8581101561172e575f89898381811061167757611677613988565b905060200201602081019061168c919061399c565b905060198160ff16106116b25760405163037a804f60e41b815260040160405180910390fd5b600160ff82161b848116156116da5760405163037a804f60e41b815260040160405180910390fd5b938417935f60028a0160ff8416601981106116f7576116f7613988565b01549050611705888261395d565b8a6002018460ff166019811061171d5761171d613988565b01555050509084019060010161165c565b5081835560018301849055601b860180548291905f9061174f90849061395d565b909155505060098054335f81815260176020908152604091829020805467ffffffffffffffff19166001600160401b03600160a01b96879004811691909117909155945482518a81529182018890529181018690529193929004909116907f53f785e510cb7ac398694df2c027c73935e2518c3b1cd4dba93f8bb62a8bbee09060600160405180910390a35050505050506117ea6001600255565b5050565b6001600160a01b0381165f9081526014602090815260408083205460139092528220546012548392839290918391611825916139d3565b90505f670de0b6b3a764000061183b83856139bc565b611845919061394a565b6001600160a01b0388165f908152601660205260408120549192509061186c90839061395d565b9050611878818561395d565b96506127106118896103e8866139bc565b611893919061394a565b955061189f86886139d3565b96989597505050505050565b6118b36124c7565b6118bc336124ef565b335f90815260156020526040812054908190036118ec576040516312d37ee560e31b815260040160405180910390fd5b47808211156118f9578091505b335f818152601560205260408120556119129083612bdd565b60405182815233907f9f413f0f451c24edeec8f50838056a8d47c9d8ea0226e5a536392f677a310ad59060200160405180910390a2505061148c6001600255565b61195b61249b565b6101f481101561197e57604051639728086160e01b815260040160405180910390fd5b600a55565b61198b61249b565b604051638905116560e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f818152600b6020526040812080546001820154601b830154919390928190428511156119f3574281600101546119ee91906139d3565b6119f5565b5f5b600954909350600160e01b900460ff168015611a145750806001015442105b8015611a255750602281015460ff16155b915050909192939495565b60015433906001600160a01b03168114611a6d5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6112bf81612c4d565b6112d7600a670de0b6b3a764000061394a565b611a9161249b565b6001600160a01b038116611ab85760405163d92e233d60e01b815260040160405180910390fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fe73ccba5c53e91a1e91298739cd456da0ef0db1a3548dcd4561ea86f413ec8a9905f90a35050565b611b1161249b565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fbc664a4a5fa107eb6ca045678e16092e2f335cdd8d9ef3e64d8f79a32014d9a5905f90a35050565b611b6a61249b565b6001600160a01b038116611b915760405163d92e233d60e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381165f9081526015602090815260408083205460148352818420546013909352908320546012549193918291670de0b6b3a764000091611bfb91906139d3565b6001600160a01b0387165f90815260146020526040902054611c1d91906139bc565b611c27919061394a565b6001600160a01b0386165f90815260166020526040902054611c49919061395d565b6001600160a01b0386165f908152601760205260408120549193506001600160401b0390911690819003611c8057505f9050611e61565b6001600160401b0381165f908152600b60209081526040808320600e83528184206001600160a01b038b168552909252909120600281015460ff1680611ccb5750602282015460ff16155b15611cdc57505f9250611e61915050565b601e820154815460ff909116905f906001831b168103611cfc575f611d02565b82600101545b9050805f03611d1957505f9450611e619350505050565b8495505f84601d015490508082611d3487601b015484612c66565b611d3e91906139bc565b611d48919061394a565b611d52908b61395d565b601e860154909a505f9061010090046001600160a01b0316611d9057818387601f0154611d7f91906139bc565b611d89919061394a565b9050611e1b565b601e8601545f196101009091046001600160a01b031601611df857600a5486602301541115611dca57818387601f0154611d7f91906139bc565b8b6001600160a01b0316611dde8888612cf1565b6001600160a01b031603611df35750601f8501545b611e1b565b601e8601546001600160a01b03808e166101009092041603611e1b5750601f8501545b602086015415611e4d5781838760200154611e3691906139bc565b611e40919061394a565b611e4a908261395d565b90505b611e57818b61395d565b9950505050505050505b9193509193565b611e706136e9565b5f5b6003811015611ec6576040805160208101859052908101829052606001604051602081830303815290604052805190602001205f1c828260038110611eb957611eb9613988565b6020020152600101611e72565b50919050565b6004546001600160a01b03163314611ef9576040516356b3678560e01b8152336004820152602401611a64565b61129e838383612dcd565b611f0c61249b565b6001600160a01b038116611f335760405163d92e233d60e01b815260040160405180910390fd5b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fa4652513510d8a8ef70d7c10761c2fd3d3f582d2e903ac7f7a74c3075331f53f905f90a35050565b611f8c6124c7565b611f95336124ef565b611f9e3361302b565b335f9081526014602090815260408083205460169092528220549091611fc4828461395d565b9050805f03611fe6576040516312d37ee560e31b815260040160405180910390fd5b5f8315801590611ff757505f601154115b156120c25761271061200b6103e8866139bc565b612015919061394a565b90505f8460115461202691906139d3565b90508015612066578061204183670de0b6b3a76400006139bc565b61204b919061394a565b60125f82825461205b919061395d565b909155506120c09050565b600654604051630852cd8d60e31b8152600481018490526001600160a01b03909116906342966c68906024015f604051808303815f87803b1580156120a9575f5ffd5b505af11580156120bb573d5f5f3e3d5ffd5b505050505b505b5f6120cd82846139d3565b6006546040516370a0823160e01b81523060048201529192505f916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612118573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213c91906139e6565b90508082111561214a578091505b8560115f82825461215b91906139d3565b9091555050335f8181526014602090815260408083208390556016825280832083905560125460139092529182902055600654905163a9059cbb60e01b81526004810192909252602482018490526001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc91906139fd565b61223a5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401611a64565b60408051878152602081018790529081018490526060810183905233907fd4bdb3a49e6ee1927e5f6ddfb99bae8139ef81210a3daba695433daf13b32d139060800160405180910390a250505050505061148c6001600255565b61229c6124c7565b600954600160e01b900460ff166122c657604051633a5f7b5760e01b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600b60205260409020600181015442101561230b57604051636218b96960e11b815260040160405180910390fd5b602281015460ff1615612331576040516308d4975360e11b815260040160405180910390fd5b600954600160a01b90046001600160401b03165f908152600c6020526040902054600160e01b900460ff161561237a5760405163029c583d60e01b815260040160405180910390fd5b80601b01545f036123b25760228101805460ff1916600117905561239c6130e9565b34156123ac576123ac3334612bdd565b506123d0565b6009546123ce90600160a01b90046001600160401b03166128c8565b505b61148c6001600255565b6123e261249b565b6001600160a01b0381166124095760405163d92e233d60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b61243361249b565b600180546001600160a01b0383166001600160a01b031990911681179091556124635f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b0316331461148c5760405163118cdaa760e01b8152336004820152602401611a64565b60028054036124e957604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b6001600160a01b0381165f908152601760205260408120546001600160401b03169081900361251c575050565b6009546001600160401b03600160a01b90910481169082161061253d575050565b6117ea81835b6001600160401b0382165f908152600b60209081526040808320600e83528184206001600160a01b0386168552909252909120600281015460ff168061258e5750602282015460ff16155b156125995750505050565b601e820154815460ff909116905f906001831b1681036125b9575f6125bf565b82600101545b9050805f0361262d5760028301805460ff19166001179055604080515f80825260208201526001600160a01b038716916001600160401b038916917f6c43ab65cd0ebdd66d111a711fedd4b61c1eb8c18b791217bead63294658b1c6910160405180910390a3505050505050565b5f84601d015490505f5f61264587601b015484612c66565b9050828482028161265857612658613922565b601e89015491900492505f915061010090046001600160a01b031661269957828488601f015461268891906139bc565b612692919061394a565b905061273c565b601e8701545f196101009091046001600160a01b03160161271957600a54876023015411156126e757601e87018054610100600160a81b0319169055601f87015483906126889086906139bc565b6126f189886131ae565b601e8701546001600160a01b03808a1661010090920416036127145750601f8601545b61273c565b601e8701546001600160a01b03808a16610100909204160361273c5750601f8601545b60208701541561276e578284886020015461275791906139bc565b612761919061394a565b61276b908261395d565b90505b60028601805460ff191660011790556127868861302b565b81156127b9576001600160a01b0388165f90815260156020526040812080548492906127b390849061395d565b90915550505b8015612804576001600160a01b0388165f90815260146020526040812080548392906127e690849061395d565b925050819055508060115f8282546127fe919061395d565b90915550505b6012546001600160a01b0389165f8181526013602090815260409182902093909355805185815292830184905290916001600160401b038c16917f6c43ab65cd0ebdd66d111a711fedd4b61c1eb8c18b791217bead63294658b1c6910160405180910390a3505050505050505050565b6040516bffffffffffffffffffffffff19606084901b1660208201526001600160c01b031960c083901b1660348201525f90603c016040516020818303038152906040528051906020012090505b92915050565b6001600160401b038082165f908152600c6020526040812054909130918491600160a01b90910416426128fc6001436139d3565b40335a604080516001600160a01b0398891660208201526001600160401b0397881691810191909152949095166060850152608084019290925260a083015290921660c083015260e08201526101000160408051808303601f1901815290829052805160209091012060055460048054631711922960e31b85526001600160a01b03928316918501829052929450925f92919091169063b88c914890602401602060405180830381865afa1580156129b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129da9190613a1c565b9050806001600160801b0316341015612a175760405163058fd01160e11b81523460048201526001600160801b0382166024820152604401611a64565b600480546040516319cb825f60e01b81526001600160a01b0385811693820193909352602481018690525f92909116906319cb825f906001600160801b0385169060440160206040518083038185885af1158015612a77573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612a9c9190613a42565b604080516060810182526001600160a01b0380871682526001600160401b03808516602080850191825260018587019081528c84165f908152600c90925295812094518554925196511515600160e01b0260ff60e01b1997909416600160a01b026001600160e01b031990931694169390931717939093169290921790559091508590600d90612b2c8685612874565b815260208082019290925260409081015f20805467ffffffffffffffff19166001600160401b03948516179055805184841681529182018790526001600160801b038516908201526001600160a01b038516918716907f16e62717d11d80b60c5f2fca3c3e381a0d22d6555d9c0b2d081f6f7d9fab22719060600160405180910390a35f612bc36001600160801b038416346139d3565b90508015612bd557612bd53382612bdd565b505050505050565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612c26576040519150601f19603f3d011682016040523d82523d5f602084013e612c2b565b606091505b505090508061129e576040516312171d8360e31b815260040160405180910390fd5b600180546001600160a01b03191690556112bf816132a0565b5f80612710612c766064866139bc565b612c80919061394a565b90505f612c8d84866139d3565b90505f612710612c9e6064846139bc565b612ca8919061394a565b90505f6127106103e8612cbb84866139d3565b612cc591906139bc565b612ccf919061394a565b905080612cdc85896139d3565b612ce691906139d3565b979650505050505050565b601e810154601d82015460218301545f9260ff16918391612d129190613a5d565b60238501549091505f90815b81811015612dc0576001600160401b0388165f818152600f60209081526040808320858452825280832054938352600e82528083206001600160a01b039094168084529390915290208054600160ff89161b1615612db6576001810154858710801590612d935750612d90818761395d565b87105b15612da85782985050505050505050506128c2565b612db2818761395d565b9550505b5050600101612d1e565b505f979650505050505050565b5f600d5f612ddb8587612874565b815260208101919091526040015f908120546001600160401b03169150819003612e055750505050565b6001600160401b0381165f908152600b60205260409020602281015460ff1615612e30575050505050565b5f612e3a84611e68565b80519091505f90612e4d90601990613a5d565b601e8401805460ff191660ff8316908117909155909150600284019060198110612e7957612e79613988565b0154601d84018190555f03612ebe576001600160401b0384165f908152600c60205260409020805460ff60e01b19169055612eb58484836132ef565b50505050505050565b5f612ed184601b015485601d015461340b565b6040810151601c86015590505f612ee885856134cb565b60228601805460ff191660011790556001600160401b0387165f908152600c60205260409020805460ff60e01b191690556008548351919250612f36916001600160a01b0390911690612bdd565b60075f9054906101000a90046001600160a01b03166001600160a01b031663f690727583602001516040518263ffffffff1660e01b81526004015f604051808303818588803b158015612f87575f5ffd5b505af1158015612f99573d5f5f3e3d5ffd5b5050505050612fa66130e9565b856001600160401b03167fe6572cd534fc4ba30405faf386eb235e01c8877062954147fad1f880b9fcf74b8487601e0160019054906101000a90046001600160a01b031688601c015489601f01548a60200154878c602101548d601d0154604051613018989796959493929190613a70565b60405180910390a2505050505050505050565b6001600160a01b0381165f908152601460205260408120549081900361304f575050565b6001600160a01b0382165f9081526013602052604081205460125461307491906139d3565b90505f670de0b6b3a764000061308a83856139bc565b613094919061394a565b6001600160a01b0385165f908152601660205260408120805492935083929091906130c090849061395d565b90915550506012546001600160a01b039094165f90815260136020526040902093909355505050565b6001600960148282829054906101000a90046001600160401b031661310e9190613ab6565b82546101009290920a6001600160401b03818102199093169183160217909155600954600160a01b9004165f908152600b602052604090204280825590915061315990603c9061395d565b600182018190556009548254604080519182526020820193909352600160a01b9091046001600160401b0316917f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee9101610f22565b601e810154601d820154602183015460ff909216915f916131ce91613a5d565b60238401549091505f90815b81811015612eb5576001600160401b0387165f818152600f60209081526040808320858452825280832054938352600e82528083206001600160a01b039094168084529390915290208054600160ff89161b161561329657600181015485871080159061324f575061324c818761395d565b87105b15613288575050601e90960180546001600160a01b0390971661010002610100600160a81b031990971696909617909555505050505050565b613292818761395d565b9550505b50506001016131da565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f612710606484601b015461330491906139bc565b61330e919061394a565b90505f8184601b015461332191906139d3565b60228501805460ff19166001179055600854909150613349906001600160a01b031683612bdd565b60075f9054906101000a90046001600160a01b03166001600160a01b031663f6907275826040518263ffffffff1660e01b81526004015f604051808303818588803b158015613396575f5ffd5b505af11580156133a8573d5f5f3e3d5ffd5b50505050506133b56130e9565b846001600160401b03167fe6572cd534fc4ba30405faf386eb235e01c8877062954147fad1f880b9fcf74b845f5f5f5f5f5f5f6040516133fc989796959493929190613a70565b60405180910390a25050505050565b61342c60405180606001604052805f81526020015f81526020015f81525090565b5f61343783856139d3565b90505f6127106134486064876139bc565b613452919061394a565b90505f6127106134636064856139bc565b61346d919061394a565b90505f61347a82856139d3565b90505f61271061348c6103e8846139bc565b613496919061394a565b90505f6134a382846139d3565b6040805160608101825296875260208701939093529185019190915250919695505050505050565b60208101515f906134de90600290613a5d565b5f1490505f60065f9054906101000a90046001600160a01b03166001600160a01b031663a2309ff86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613533573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061355791906139e6565b61356c670de0b6b3a7640000622dc6c06139bc565b61357691906139d3565b90505f81670de0b6b3a76400001161359657670de0b6b3a7640000613598565b815b90506135a481836139d3565b91505f82600354116135b8576003546135ba565b825b60208601516021880155601f87018390559050836135d95760016135db565b5f5b601e870180546001600160a01b039290921661010002610100600160a81b031990921691909117905560408501516136169061014d90613a5d565b15801561362457505f601054115b15613636576010805460208801555f90555b8060105f828254613647919061395d565b909155505f9050613658828461395d565b905080156136c0576006546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f19906044015f604051808303815f87803b1580156136a9575f5ffd5b505af11580156136bb573d5f5f3e3d5ffd5b505050505b5050505092915050565b6040518061032001604052806019906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6001600160401b03811681146112bf575f5ffd5b5f6020828403121561372b575f5ffd5b813561373681613707565b9392505050565b5f6020828403121561374d575f5ffd5b5035919050565b80356001600160a01b038116811461376a575f5ffd5b919050565b5f5f83601f84011261377f575f5ffd5b5081356001600160401b03811115613795575f5ffd5b6020830191508360208260051b85010111156137af575f5ffd5b9250929050565b5f5f5f604084860312156137c8575f5ffd5b6137d184613754565b925060208401356001600160401b038111156137eb575f5ffd5b6137f78682870161376f565b9497909650939450505050565b610320810181835f5b601981101561382c57815183526020928301929091019060010161380d565b50505092915050565b5f5f60208385031215613846575f5ffd5b82356001600160401b0381111561385b575f5ffd5b6138678582860161376f565b90969095509350505050565b5f60208284031215613883575f5ffd5b61373682613754565b5f5f6040838503121561389d575f5ffd5b82356138a881613707565b91506138b660208401613754565b90509250929050565b6060810181835f5b600381101561382c5781518352602092830192909101906001016138c7565b5f5f5f606084860312156138f8575f5ffd5b833561390381613707565b925061391160208501613754565b929592945050506040919091013590565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261395857613958613922565b500490565b808201808211156128c2576128c2613936565b5f6001820161398157613981613936565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156139ac575f5ffd5b813560ff81168114613736575f5ffd5b80820281158282048414176128c2576128c2613936565b818103818111156128c2576128c2613936565b5f602082840312156139f6575f5ffd5b5051919050565b5f60208284031215613a0d575f5ffd5b81518015158114613736575f5ffd5b5f60208284031215613a2c575f5ffd5b81516001600160801b0381168114613736575f5ffd5b5f60208284031215613a52575f5ffd5b815161373681613707565b5f82613a6b57613a6b613922565b500690565b60ff9890981688526001600160a01b03969096166020880152604087019490945260608601929092526080850152151560a084015260c083015260e08201526101000190565b6001600160401b0381811683821601908111156128c2576128c261393656fea264697066735822122063f5e986e9e415a975c9c16c369162dc4275e0c72db4118a8d03e0b61b524c0d64736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| Wrapped Ether (WETH) | WETH | 1 | $1,903.74 | $1,903.74 |
| DIH | 2 | $0.0000102 | $0 | |
| PEA | 4,518.576805 | — | — | |
| Frong By Virtuals (FRONG) | FRONG | 25 | — | — |
| Bag Hood (BAGHOOD) | BAGHOOD | 15 | — | — |
| Penguin wif bag (Tao Tao) | Tao Tao | 15 | — | — |
| Hood Game (HOODGAME) | HOODGAME | 10 | — | — |
| Don't Blink (BLINK) | BLINK | 10 | — | — |
| World Usdg (WORLD) | WORLD | 10 | — | — |
| Popo (POPO) | POPO | 10 | — | — |
| USD Global Zero (USDG0) | USDG0 | 2 | — | — |
| ViralHOOD (ViralHOOD) | ViralHOOD | 0.000000 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x6c05a0…a7ab7e | deploy | 39,220,619 | 11 secs agoMon, 17 Aug 2026 23:09:53 UTC | 0x8499…4184 | IN | GridMining | $3.100.00162 ETH | 0.00000663 | |
| 0x6f00c0…d94600 | deploy | 39,220,616 | 11 secs agoMon, 17 Aug 2026 23:09:53 UTC | 0xf006…3349 | IN | GridMining | $3.120.00164 ETH | 0.00000656 | |
| 0xc6afda…f0b0c4 | deploy | 39,220,564 | 16 secs agoMon, 17 Aug 2026 23:09:48 UTC | 0x587a…7db3 | IN | GridMining | $1.450.00076 ETH | 0.00000669 | |
| 0x45104e…3bb0cb | deploy | 39,220,561 | 16 secs agoMon, 17 Aug 2026 23:09:48 UTC | 0xa3fc…dc57 | IN | GridMining | $5.800.00304 ETH | 0.00001715 | |
| 0x5c6b53…9236d6 | reset | 39,220,247 | 48 secs agoMon, 17 Aug 2026 23:09:16 UTC | 0x2c23…4eb3 | IN | GridMining | $0.000 ETH | 0.00000407 | |
| 0xf91c87…d738fa | deploy | 39,219,963 | 1 min agoMon, 17 Aug 2026 23:08:47 UTC | 0x8499…4184 | IN | GridMining | $3.100.00162 ETH | 0.00000653 | |
| 0x3c1a05…22d21d | deploy | 39,219,948 | 1 min agoMon, 17 Aug 2026 23:08:46 UTC | 0xf006…3349 | IN | GridMining | $3.120.00164 ETH | 0.00000650 | |
| 0x90556b…306e28 | deploy | 39,219,933 | 1 min agoMon, 17 Aug 2026 23:08:44 UTC | 0xa3fc…dc57 | IN | GridMining | $5.800.00304 ETH | 0.00000653 | |
| 0x3900f8…1c8c49 | deploy | 39,219,883 | 1 min agoMon, 17 Aug 2026 23:08:39 UTC | 0x587a…7db3 | IN | GridMining | $1.450.00076 ETH | 0.00001596 | |
| 0x264212…4e9bec | reset | 39,219,596 | 1 min agoMon, 17 Aug 2026 23:08:10 UTC | 0x2c23…4eb3 | IN | GridMining | $0.000 ETH | 0.00000413 | |
| 0xc73322…1ac46f | deploy | 39,219,333 | 2 mins agoMon, 17 Aug 2026 23:07:44 UTC | 0xf006…3349 | IN | GridMining | $3.120.00164 ETH | 0.00000650 | |
| 0x34404d…ea1d5a | deploy | 39,219,308 | 2 mins agoMon, 17 Aug 2026 23:07:41 UTC | 0xa3fc…dc57 | IN | GridMining | $5.800.00304 ETH | 0.00000634 | |
| 0x49ea32…e978a0 | deploy | 39,219,264 | 2 mins agoMon, 17 Aug 2026 23:07:37 UTC | 0x8499…4184 | IN | GridMining | $3.100.00162 ETH | 0.00000633 | |
| 0x5e7f27…470005 | deploy | 39,219,260 | 2 mins agoMon, 17 Aug 2026 23:07:37 UTC | 0x587a…7db3 | IN | GridMining | $1.450.00076 ETH | 0.00001624 | |
| 0x9c562c…11d7ae | reset | 39,218,951 | 2 mins agoMon, 17 Aug 2026 23:07:05 UTC | 0x2c23…4eb3 | IN | GridMining | $0.000 ETH | 0.00000411 | |
| 0x48de2e…f6b4db | deploy | 39,218,680 | 3 mins agoMon, 17 Aug 2026 23:06:38 UTC | 0xf006…3349 | IN | GridMining | $3.120.00164 ETH | 0.00000634 | |
| 0xd13304…f5381a | deploy | 39,218,636 | 3 mins agoMon, 17 Aug 2026 23:06:34 UTC | 0x8499…4184 | IN | GridMining | $3.100.00162 ETH | 0.00000649 | |
| 0x69306b…11eb41 | deploy | 39,218,633 | 3 mins agoMon, 17 Aug 2026 23:06:33 UTC | 0x587a…7db3 | IN | GridMining | $1.450.00076 ETH | 0.00000643 | |
| 0xd20dcf…974ab8 | deploy | 39,218,591 | 3 mins agoMon, 17 Aug 2026 23:06:29 UTC | 0xa3fc…dc57 | IN | GridMining | $5.800.00304 ETH | 0.00001616 | |
| 0x796920…d5e978 | reset | 39,218,293 | 4 mins agoMon, 17 Aug 2026 23:06:01 UTC | 0x2c23…4eb3 | IN | GridMining | $0.000 ETH | 0.00000409 | |
| 0xdd4e3f…9a3a18 | deploy | 39,218,001 | 4 mins agoMon, 17 Aug 2026 23:05:32 UTC | 0xa3fc…dc57 | IN | GridMining | $5.800.00304 ETH | 0.00000659 | |
| 0x77ec15…8238f8 | deploy | 39,217,938 | 4 mins agoMon, 17 Aug 2026 23:05:25 UTC | 0x587a…7db3 | IN | GridMining | $1.450.00076 ETH | 0.00000667 | |
| 0xa5725c…1ca9b5 | deploy | 39,217,935 | 4 mins agoMon, 17 Aug 2026 23:05:25 UTC | 0xf006…3349 | IN | GridMining | $3.120.00164 ETH | 0.00000633 | |
| 0x6ece7f…094e6b | deploy | 39,217,925 | 4 mins agoMon, 17 Aug 2026 23:05:24 UTC | 0x8499…4184 | IN | GridMining | $3.100.00162 ETH | 0.00001637 | |
| 0x8790ef…adeed0 | reset | 39,217,641 | 5 mins agoMon, 17 Aug 2026 23:04:55 UTC | 0x2c23…4eb3 | IN | GridMining | $0.000 ETH | 0.00000425 |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x6c05a0…a7ab7e | 12 secs agoMon, 17 Aug 2026 23:09:53 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008925 [1] 0x000000000000…f78c4184 data: 0x000000000000000000…e42a4da5 |
| 0x6c05a0…a7ab7e | 12 secs agoMon, 17 Aug 2026 23:09:53 UTC | 0x6c43ab…b1c6 | [0] 0x000000000000…00008924 [1] 0x000000000000…f78c4184 data: 0x000000000000000000…f37da78f |
| 0x6f00c0…d94600 | 12 secs agoMon, 17 Aug 2026 23:09:53 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008925 [1] 0x000000000000…072c3349 data: 0x000000000000000000…b3a16fe7 |
| 0x6f00c0…d94600 | 12 secs agoMon, 17 Aug 2026 23:09:53 UTC | 0x6c43ab…b1c6 | [0] 0x000000000000…00008924 [1] 0x000000000000…072c3349 data: 0x000000000000000000…bc455c34 |
| 0xc6afda…f0b0c4 | 17 secs agoMon, 17 Aug 2026 23:09:48 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008925 [1] 0x000000000000…4b2b7db3 data: 0x000000000000000000…a0dec6c6 |
| 0xc6afda…f0b0c4 | 17 secs agoMon, 17 Aug 2026 23:09:48 UTC | 0x6c43ab…b1c6 | [0] 0x000000000000…00008924 [1] 0x000000000000…4b2b7db3 data: 0x000000000000000000…ef8a126d |
| 0x45104e…3bb0cb | 17 secs agoMon, 17 Aug 2026 23:09:48 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008925 [1] 0x000000000000…c878dc57 data: 0x000000000000000000…d86d0da5 |
| 0x45104e…3bb0cb | 17 secs agoMon, 17 Aug 2026 23:09:48 UTC | 0x6c43ab…b1c6 | [0] 0x000000000000…00008924 [1] 0x000000000000…c878dc57 data: 0x000000000000000000…0816e9ce |
| 0x24c77f…243fc4 | 45 secs agoMon, 17 Aug 2026 23:09:20 UTC | 0xe6572c…f74b | [0] 0x000000000000…00008924 data: 0x000000000000000000…ec342490 |
| 0x24c77f…243fc4 | 45 secs agoMon, 17 Aug 2026 23:09:20 UTC | 0x21a3f9…bfee | [0] 0x000000000000…00008925 data: 0x000000000000000000…6a8394dc |
| 0x5c6b53…9236d6 | 49 secs agoMon, 17 Aug 2026 23:09:16 UTC | 0x16e627…2271 | [0] 0x000000000000…00008924 [1] 0x000000000000…266d9c38 data: 0x000000000000000000…00000000 |
| 0xf91c87…d738fa | 1 min agoMon, 17 Aug 2026 23:08:47 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008924 [1] 0x000000000000…f78c4184 data: 0x000000000000000000…e42a4da5 |
| 0xf91c87…d738fa | 1 min agoMon, 17 Aug 2026 23:08:47 UTC | 0x6c43ab…b1c6 | [0] 0x000000000000…00008923 [1] 0x000000000000…f78c4184 data: 0x000000000000000000…191fa178 |
| 0x3c1a05…22d21d | 1 min agoMon, 17 Aug 2026 23:08:46 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008924 [1] 0x000000000000…072c3349 data: 0x000000000000000000…0dabac84 |
| 0x3c1a05…22d21d | 1 min agoMon, 17 Aug 2026 23:08:46 UTC | 0x6c43ab…b1c6 | [0] 0x000000000000…00008923 [1] 0x000000000000…072c3349 data: 0x000000000000000000…bc455c34 |
| 0x90556b…306e28 | 1 min agoMon, 17 Aug 2026 23:08:44 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008924 [1] 0x000000000000…c878dc57 data: 0x000000000000000000…8c8186c6 |
| 0x90556b…306e28 | 1 min agoMon, 17 Aug 2026 23:08:44 UTC | 0x6c43ab…b1c6 | [0] 0x000000000000…00008923 [1] 0x000000000000…c878dc57 data: 0x000000000000000000…535acfd4 |
| 0x3900f8…1c8c49 | 1 min agoMon, 17 Aug 2026 23:08:39 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008924 [1] 0x000000000000…4b2b7db3 data: 0x000000000000000000…92c01121 |
| 0x3900f8…1c8c49 | 1 min agoMon, 17 Aug 2026 23:08:39 UTC | 0x6c43ab…b1c6 | [0] 0x000000000000…00008923 [1] 0x000000000000…4b2b7db3 data: 0x000000000000000000…7ea4327f |
| 0x5f97d8…612347 | 1 min agoMon, 17 Aug 2026 23:08:15 UTC | 0xe6572c…f74b | [0] 0x000000000000…00008923 data: 0x000000000000000000…ec342490 |
| 0x5f97d8…612347 | 1 min agoMon, 17 Aug 2026 23:08:15 UTC | 0x21a3f9…bfee | [0] 0x000000000000…00008924 data: 0x000000000000000000…6a83949b |
| 0x264212…4e9bec | 1 min agoMon, 17 Aug 2026 23:08:10 UTC | 0x16e627…2271 | [0] 0x000000000000…00008923 [1] 0x000000000000…266d9c38 data: 0x000000000000000000…00000000 |
| 0xc73322…1ac46f | 2 mins agoMon, 17 Aug 2026 23:07:44 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008923 [1] 0x000000000000…072c3349 data: 0x000000000000000000…0dabac84 |
| 0xc73322…1ac46f | 2 mins agoMon, 17 Aug 2026 23:07:44 UTC | 0x6c43ab…b1c6 | [0] 0x000000000000…00008922 [1] 0x000000000000…072c3349 data: 0x000000000000000000…a7640000 |
| 0x34404d…ea1d5a | 2 mins agoMon, 17 Aug 2026 23:07:41 UTC | 0x53f785…bee0 | [0] 0x000000000000…00008923 [1] 0x000000000000…c878dc57 data: 0x000000000000000000…4095ffe7 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 39,220,292 | 46 secs agoMon, 17 Aug 2026 23:09:20 UTC | 0x24c77f…243fc4 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,220,292 | 46 secs agoMon, 17 Aug 2026 23:09:20 UTC | 0x24c77f…243fc4 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,219,641 | 1 min agoMon, 17 Aug 2026 23:08:15 UTC | 0x5f97d8…612347 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,219,641 | 1 min agoMon, 17 Aug 2026 23:08:15 UTC | 0x5f97d8…612347 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,218,996 | 2 mins agoMon, 17 Aug 2026 23:07:10 UTC | 0xf414ba…53b1a5 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,218,996 | 2 mins agoMon, 17 Aug 2026 23:07:10 UTC | 0xf414ba…53b1a5 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,218,338 | 4 mins agoMon, 17 Aug 2026 23:06:05 UTC | 0x8c202c…6380fb | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,218,338 | 4 mins agoMon, 17 Aug 2026 23:06:05 UTC | 0x8c202c…6380fb | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,217,686 | 5 mins agoMon, 17 Aug 2026 23:05:00 UTC | 0xe6d28e…f2eb10 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,217,686 | 5 mins agoMon, 17 Aug 2026 23:05:00 UTC | 0xe6d28e…f2eb10 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,217,031 | 6 mins agoMon, 17 Aug 2026 23:03:54 UTC | 0xde0db2…f9c710 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,217,031 | 6 mins agoMon, 17 Aug 2026 23:03:54 UTC | 0xde0db2…f9c710 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,216,380 | 7 mins agoMon, 17 Aug 2026 23:02:49 UTC | 0x88b20f…caa86a | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,216,380 | 7 mins agoMon, 17 Aug 2026 23:02:49 UTC | 0x88b20f…caa86a | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,215,727 | 8 mins agoMon, 17 Aug 2026 23:01:43 UTC | 0x6e09d4…fd7919 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,215,727 | 8 mins agoMon, 17 Aug 2026 23:01:43 UTC | 0x6e09d4…fd7919 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,215,085 | 9 mins agoMon, 17 Aug 2026 23:00:38 UTC | 0xbc2367…9c736f | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,215,085 | 9 mins agoMon, 17 Aug 2026 23:00:38 UTC | 0xbc2367…9c736f | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,214,417 | 10 mins agoMon, 17 Aug 2026 22:59:33 UTC | 0xdd7014…e62db2 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,214,417 | 10 mins agoMon, 17 Aug 2026 22:59:33 UTC | 0xdd7014…e62db2 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,213,774 | 11 mins agoMon, 17 Aug 2026 22:58:28 UTC | 0x476eb9…a5cd98 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,213,774 | 11 mins agoMon, 17 Aug 2026 22:58:28 UTC | 0x476eb9…a5cd98 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,213,121 | 12 mins agoMon, 17 Aug 2026 22:57:23 UTC | 0x0576ab…fa18ec | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| 39,213,121 | 12 mins agoMon, 17 Aug 2026 22:57:23 UTC | 0x0576ab…fa18ec | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x2c23…4eb3 | 0.00007 ETH |
| 39,212,467 | 13 mins agoMon, 17 Aug 2026 22:56:17 UTC | 0xfe3c1b…a17c59 | CALL | revealWithCallback | 0x46d5…11ce | OUT | 0x78df…d7e6 | 0.00067 ETH |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x24c77fb0…243fc4 | Transfer | 39,220,292 | 46 secs agoMon, 17 Aug 2026 23:09:20 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x5f97d8d2…612347 | Transfer | 39,219,641 | 1 min agoMon, 17 Aug 2026 23:08:15 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xf414ba4e…53b1a5 | Transfer | 39,218,996 | 2 mins agoMon, 17 Aug 2026 23:07:10 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x8c202c04…6380fb | Transfer | 39,218,338 | 4 mins agoMon, 17 Aug 2026 23:06:05 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xe6d28e0c…f2eb10 | Transfer | 39,217,686 | 5 mins agoMon, 17 Aug 2026 23:05:00 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xde0db28c…f9c710 | Transfer | 39,217,031 | 6 mins agoMon, 17 Aug 2026 23:03:54 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x88b20f32…caa86a | Transfer | 39,216,380 | 7 mins agoMon, 17 Aug 2026 23:02:49 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x6e09d48a…fd7919 | Transfer | 39,215,727 | 8 mins agoMon, 17 Aug 2026 23:01:43 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xbc236753…9c736f | Transfer | 39,215,085 | 9 mins agoMon, 17 Aug 2026 23:00:38 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xdd701453…e62db2 | Transfer | 39,214,417 | 10 mins agoMon, 17 Aug 2026 22:59:33 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x476eb91e…a5cd98 | Transfer | 39,213,774 | 11 mins agoMon, 17 Aug 2026 22:58:28 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x0576ab0a…fa18ec | Transfer | 39,213,121 | 12 mins agoMon, 17 Aug 2026 22:57:23 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xfe3c1bc1…a17c59 | Transfer | 39,212,467 | 13 mins agoMon, 17 Aug 2026 22:56:17 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xd92a234c…c92c67 | Transfer | 39,211,826 | 14 mins agoMon, 17 Aug 2026 22:55:12 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xb9e3fd12…1bcf0d | Transfer | 39,211,173 | 15 mins agoMon, 17 Aug 2026 22:54:07 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xbc275430…2d580d | Transfer | 39,210,503 | 17 mins agoMon, 17 Aug 2026 22:53:01 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xc28bc752…20dcc5 | Transfer | 39,209,860 | 18 mins agoMon, 17 Aug 2026 22:51:56 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x8b4f4171…dc3f16 | Transfer | 39,209,206 | 19 mins agoMon, 17 Aug 2026 22:50:51 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x5914c355…fdbd7a | Transfer | 39,208,553 | 20 mins agoMon, 17 Aug 2026 22:49:45 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xfbf0a44c…f43ffe | Transfer | 39,207,912 | 21 mins agoMon, 17 Aug 2026 22:48:40 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x799f7eb8…45fcd5 | Transfer | 39,207,262 | 22 mins agoMon, 17 Aug 2026 22:47:35 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x1364fdf9…10f709 | Transfer | 39,206,596 | 23 mins agoMon, 17 Aug 2026 22:46:30 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xa81e2ca4…2cab7d | Transfer | 39,205,942 | 24 mins agoMon, 17 Aug 2026 22:45:24 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0x2bbb2955…ca8913 | Transfer | 39,205,300 | 25 mins agoMon, 17 Aug 2026 22:44:19 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA | ||
| 0xa2cfc8a9…aada87 | Transfer | 39,204,649 | 26 mins agoMon, 17 Aug 2026 22:43:14 UTC | 0x0000…0000 | IN | 0x46d5…11ce | 1.1 PEA |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||