// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IOil} from "./interfaces/IOil.sol";
import {ITreasury} from "./interfaces/ITreasury.sol";
import {IAuctionMiningStart} from "./interfaces/ILinkedMining.sol";
import {IStakingRewards} from "./interfaces/ISwapRouter.sol";
import {IRewardsLedger, REWARDS_LANE_GRID} from "./interfaces/IRewardsLedger.sol";
import {IReferralRegistry} from "./interfaces/IReferralRegistry.sol";
import {IOilMotherlode} from "./interfaces/IOilMotherlode.sol";
import {ITeamVesting} from "./interfaces/ITeamVesting.sol";
import {IRandomnessProvider} from "./interfaces/IRandomnessProvider.sol";
import {MiningConfig} from "./MiningConfig.sol";
import {Constants} from "./libraries/Constants.sol";
contract GridMining is Initializable, Ownable2StepUpgradeable, ReentrancyGuardUpgradeable, UUPSUpgradeable {
using SafeERC20 for IERC20;
struct Round {
uint256 startTime;
uint256 endTime;
uint256 totalDeployed;
uint256 totalWinnings;
uint256 winnersDeployed;
uint256 topMinerReward;
uint256 motherlodeAmount;
bytes32 randomnessValue;
bytes32 randomnessId;
uint64 requestedAt;
uint256 topMinerSeed;
uint8 winningBlock;
address topMiner;
bool settled;
bool splitReward;
uint256 minerCount;
uint256[25] deployed;
}
struct MinerRound {
uint256 deployedMask;
uint256 amountPerBlock;
bool checkpointed;
}
struct PoolMember {
uint64 roundId;
uint256 totalDeployed;
uint256[25] deployed;
}
struct PoolRound {
uint256 totalDeployed;
uint256[25] deployed;
}
IOil public oil;
IRandomnessProvider public randomnessProvider;
address public treasury;
/// @dev Stake — receives 4% of each round's loser pot.
address public staking;
/// @dev Linked AuctionMining (boot + motherlode auth).
address public auctionMining;
uint256 public oilPerRound;
uint256 public motherlodeDenominator;
bool public gameStarted;
uint64 public currentRoundId;
mapping(uint64 => Round) public rounds;
mapping(uint64 => mapping(address => MinerRound)) public miners;
mapping(uint64 => mapping(uint256 => address)) public roundMinerAtIndex;
mapping(address => PoolMember) public poolMembers;
mapping(uint64 => PoolRound) public poolRounds;
mapping(address => uint64) public userLastRound;
/// @dev Shared claim ledger (grid lane credits / payouts).
/// @dev UUPS: only append new state before `__gap`; never insert above existing vars.
address public rewards;
/// @dev Shared referral bind + referral claim balances.
address public referralRegistry;
/// @dev Receives 8% of each round's winner OIL mint (permanent ve lock).
address public teamVesting;
/// @dev Tunable emissions / ETH splits (prefer over local oilPerRound when set).
address public miningConfig;
/// @dev Standalone OilMotherlode — ETH/OIL jackpot pools.
address public motherlode;
/// @dev OilAutominer — may deploy / claim-ETH-into-plan for users.
address public oilAutominer;
/// @dev Per-square stake for variable-amount deploys (OilAutominer). 0 → use MinerRound.amountPerBlock.
mapping(uint64 => mapping(address => mapping(uint8 => uint256))) public minerAmountOnSquare;
/// @dev Owner freeze — blocks new deploys / round reset; claims + checkpoints still work.
bool public paused;
/// @dev Miners on each square this round — settle samples only this list (gas-bounded vs all miners).
mapping(uint64 => mapping(uint8 => mapping(uint256 => address))) public squareMinerAtIndex;
mapping(uint64 => mapping(uint8 => uint256)) public squareMinerCount;
/// @dev Extra seconds past round end before the pinned drand beacon may unlock (sequencer skew).
uint64 public revealSafetyBuffer = 6;
uint64 public constant MIN_REVEAL_SAFETY_BUFFER = 3;
uint64 public constant MAX_REVEAL_SAFETY_BUFFER = 60;
/// @dev Earliest request window: seconds before round end when `requestResolve` opens.
uint64 public earliestRequestTimeBeforeEnd = 2;
/// @dev If unresolved after request, anyone may re-pin to a fresh future beacon.
uint64 public constant RESOLUTION_TIMEOUT = 5 minutes;
/// @dev Reserved for future storage layout growth (shrink when appending vars).
uint256[44] private __gap;
error InsufficientOilReserves();
error InsufficientEthReserves();
error GameAlreadyStarted();
error GameNotStarted();
error RoundNotActive();
error RoundNotEnded();
error RoundAlreadySettled();
error RoundNotSettled();
error AlreadyDeployed();
error NoBlocksSelected();
error InvalidBlockId();
error InsufficientDeploy();
error RandomnessNotConfigured();
error TooEarlyToRequest();
error AlreadyRequested();
error TooEarlyToReRequest();
error NotRequested();
error RandomnessNotSettled();
error InvalidRevealBuffer();
error NothingToClaim();
error TransferFailed();
error ZeroAddress();
error AlreadyCheckpointed();
error PoolCapExceeded();
error NotCheckpointed();
error InvalidAmount();
error Unauthorized();
error RewardsNotSet();
error ReferralRegistryNotSet();
error OilMotherlodeNotSet();
error BadArrays();
error ValueNotSum();
error Paused();
event GameStarted(uint64 indexed roundId, uint256 startTime, uint256 endTime);
event PauseUpdated(bool paused);
event OilMotherlodeUpdated(address motherlode);
event OilAutominerUpdated(address oilAutominer);
event RandomnessProviderUpdated(address provider);
event RevealSafetyBufferUpdated(uint64 oldValue, uint64 newValue);
event EarliestRequestTimeBeforeEndUpdated(uint64 oldValue, uint64 newValue);
event RandomnessRequested(uint64 indexed roundId, bytes32 randomnessId);
event RandomnessReRequested(uint64 indexed roundId, bytes32 randomnessId);
event Deployed(
uint64 indexed roundId,
address indexed user,
uint256 amountPerBlock,
uint256 blockMask,
uint256 totalAmount,
bool isPooled
);
event RoundSettled(
uint64 indexed roundId,
uint8 winningBlock,
address topMiner,
uint256 totalWinnings,
uint256 topMinerReward,
uint256 motherlodeAmount,
bool isSplit,
uint256 winnersDeployed
);
event Checkpointed(uint64 indexed roundId, address indexed user, uint256 ethReward, uint256 oilReward);
event ClaimedETH(address indexed user, uint256 amount);
event ClaimedOIL(address indexed user, uint256 amount);
event ConfigUpdated();
event MiningConfigUpdated(address miningConfig);
event RewardsUpdated(address rewards);
event ReferralRegistryUpdated(address referralRegistry);
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize(address oil_, address randomnessProvider_, address treasury_, address owner_)
external
initializer
{
if (
oil_ == address(0) || randomnessProvider_ == address(0) || treasury_ == address(0)
|| owner_ == address(0)
) {
revert ZeroAddress();
}
__Ownable_init(owner_);
__Ownable2Step_init();
__ReentrancyGuard_init();
__UUPSUpgradeable_init();
oil = IOil(oil_);
randomnessProvider = IRandomnessProvider(randomnessProvider_);
treasury = treasury_;
oilPerRound = Constants.DEFAULT_OIL_PER_ROUND;
motherlodeDenominator = Constants.DEFAULT_MOTHERLODE_DENOMINATOR;
}
function _authorizeUpgrade(address) internal override onlyOwner {}
receive() external payable {}
/// @notice Local fallback oil/round (used only when `miningConfig` is unset).
/// @dev Prefer `MiningConfig.setGridEmissions` once config is wired.
function setOilPerRound(uint256 amount) external onlyOwner {
require(amount > 0 && amount <= Constants.MAX_OIL_PER_ROUND, "oil/round");
oilPerRound = amount;
emit ConfigUpdated();
}
/// @notice Local fallback motherlode denom (used only when `miningConfig` is unset).
function setOilMotherlodeDenominator(uint256 denom) external onlyOwner {
require(denom > 0, "denom");
motherlodeDenominator = denom;
emit ConfigUpdated();
}
function setMiningConfig(address miningConfig_) external onlyOwner {
if (miningConfig_ == address(0)) revert ZeroAddress();
miningConfig = miningConfig_;
emit MiningConfigUpdated(miningConfig_);
}
function setTreasury(address a) external onlyOwner {
if (a == address(0)) revert ZeroAddress();
treasury = a;
}
function setStaking(address a) external onlyOwner {
if (a == address(0)) revert ZeroAddress();
staking = a;
}
function setTeamVesting(address a) external onlyOwner {
if (a == address(0)) revert ZeroAddress();
teamVesting = a;
}
/// @notice Bind AuctionMining (boot linkage + motherlode auth).
function setAuctionMining(address auction_) external onlyOwner {
if (auction_ == address(0)) revert ZeroAddress();
auctionMining = auction_;
}
function setRewards(address rewards_) external onlyOwner {
if (rewards_ == address(0)) revert ZeroAddress();
rewards = rewards_;
emit RewardsUpdated(rewards_);
}
function setReferralRegistry(address registry_) external onlyOwner {
if (registry_ == address(0)) revert ZeroAddress();
referralRegistry = registry_;
emit ReferralRegistryUpdated(registry_);
}
function setOilMotherlode(address motherlode_) external onlyOwner {
if (motherlode_ == address(0)) revert ZeroAddress();
motherlode = motherlode_;
emit OilMotherlodeUpdated(motherlode_);
}
function setOilAutominer(address autominer_) external onlyOwner {
if (autominer_ == address(0)) revert ZeroAddress();
oilAutominer = autominer_;
emit OilAutominerUpdated(autominer_);
}
/// @notice Freeze / unfreeze new mining activity (deploys + round reset). Claims stay open.
function setPaused(bool paused_) external onlyOwner {
paused = paused_;
emit PauseUpdated(paused_);
}
function setRandomnessProvider(address provider_) external onlyOwner {
if (provider_ == address(0)) revert ZeroAddress();
randomnessProvider = IRandomnessProvider(provider_);
emit RandomnessProviderUpdated(provider_);
}
function setRevealSafetyBuffer(uint64 newBuffer) external onlyOwner {
if (newBuffer < MIN_REVEAL_SAFETY_BUFFER || newBuffer > MAX_REVEAL_SAFETY_BUFFER) {
revert InvalidRevealBuffer();
}
uint64 old = revealSafetyBuffer;
revealSafetyBuffer = newBuffer;
emit RevealSafetyBufferUpdated(old, newBuffer);
}
function setEarliestRequestTimeBeforeEnd(uint64 newValue) external onlyOwner {
if (newValue > Constants.ROUND_DURATION) revert InvalidAmount();
uint64 old = earliestRequestTimeBeforeEnd;
earliestRequestTimeBeforeEnd = newValue;
emit EarliestRequestTimeBeforeEndUpdated(old, newValue);
}
function _requireNotPaused() internal view {
if (paused) revert Paused();
}
/// @notice Open round 1. Owner or linked AuctionMining may call.
/// @dev If `auctionMining` is set, also starts the auction so both go live together.
function startFirstRound() external {
if (msg.sender != owner() && msg.sender != auctionMining) revert Unauthorized();
_requireNotPaused();
if (!gameStarted) {
if (address(randomnessProvider) == address(0)) revert RandomnessNotConfigured();
gameStarted = true;
currentRoundId = 1;
Round storage r = rounds[1];
r.startTime = block.timestamp;
// Waiting for first deploy before the mining window starts.
r.endTime = Constants.ROUND_WAITING;
emit GameStarted(1, r.startTime, r.endTime);
} else if (msg.sender != auctionMining) {
revert GameAlreadyStarted();
}
// Boot auction in the same transaction when linked.
if (auctionMining != address(0) && !IAuctionMiningStart(auctionMining).started()) {
IAuctionMiningStart(auctionMining).start();
}
}
// -------------------------------------------------------------------------
// OilAutominer
// -------------------------------------------------------------------------
/// @dev True if user already has grid activity.
function _localAlreadyMined(address user) internal view returns (bool) {
return userLastRound[user] != 0;
}
/// @dev Bind only on first mine activity via ReferralRegistry.
function _firstMineBind(address user, address referrer) internal {
address registry = referralRegistry;
if (registry == address(0)) revert ReferralRegistryNotSet();
IReferralRegistry(registry).bindOnFirstMine(user, referrer, _localAlreadyMined(user));
}
/// @notice OilAutominer: deploy squares with explicit per-square amounts for `beneficiary`.
function deployFor(
address beneficiary,
uint8[] calldata squares,
uint256[] calldata amounts,
bool isPooled
) external payable nonReentrant {
_requireNotPaused();
if (msg.sender != oilAutominer) revert Unauthorized();
if (beneficiary == address(0)) revert ZeroAddress();
if (!gameStarted) revert GameNotStarted();
if (squares.length == 0 || squares.length != amounts.length) revert BadArrays();
Round storage round = rounds[currentRoundId];
if (round.settled) revert RoundNotActive();
if (round.endTime != Constants.ROUND_WAITING && block.timestamp >= round.endTime) {
revert RoundNotActive();
}
MinerRound storage m = miners[currentRoundId][beneficiary];
if (m.deployedMask != 0) revert AlreadyDeployed();
uint256 sum;
uint256 mask;
for (uint256 i; i < squares.length; ++i) {
uint8 b = squares[i];
if (b >= Constants.GRID_SIZE) revert InvalidBlockId();
uint256 bit = uint256(1) << b;
if (mask & bit != 0) revert InvalidBlockId();
mask |= bit;
uint256 a = amounts[i];
if (a == 0) revert InsufficientDeploy();
sum += a;
}
if (msg.value != sum) revert ValueNotSum();
if (isPooled && sum > Constants.MAX_POOL_DEPLOY) revert PoolCapExceeded();
_ensurePriorCheckpoint(beneficiary);
_firstMineBind(beneficiary, address(0));
_maybeArmRound(round);
uint64 roundId = currentRoundId;
uint256 firstAmt = amounts[0];
bool uniform = true;
for (uint256 i; i < squares.length; ++i) {
uint8 b = squares[i];
uint256 a = amounts[i];
round.deployed[b] += a;
minerAmountOnSquare[roundId][beneficiary][b] = a;
if (a != firstAmt) uniform = false;
}
m.deployedMask = mask;
m.amountPerBlock = uniform ? firstAmt : 0;
round.totalDeployed += sum;
uint256 idx = round.minerCount;
roundMinerAtIndex[roundId][idx] = beneficiary;
round.minerCount = idx + 1;
userLastRound[beneficiary] = roundId;
_indexSquareMiners(roundId, beneficiary, mask);
if (isPooled) {
_recordPoolDeployAmounts(beneficiary, roundId, squares, amounts);
}
emit Deployed(roundId, beneficiary, uniform ? firstAmt : sum, mask, sum, isPooled);
}
/// @notice OilAutominer: checkpoint then pay grid-lane ETH to the autominer (recycle into plan).
function claimETHForOilAutominer(address user) external nonReentrant returns (uint256 payout) {
if (msg.sender != oilAutominer) revert Unauthorized();
if (user == address(0)) revert ZeroAddress();
_autoCheckpoint(user);
address ledger = rewards;
if (ledger == address(0)) revert RewardsNotSet();
payout = IRewardsLedger(ledger).payoutGridETH(user, msg.sender);
}
function _popcount(uint256 mask) internal pure returns (uint256 n) {
for (uint256 i; i < Constants.GRID_SIZE; ++i) {
if (mask & (uint256(1) << i) != 0) {
unchecked {
++n;
}
}
}
}
// -------------------------------------------------------------------------
// Deploy
// -------------------------------------------------------------------------
function deploy(uint8[] calldata blockIds, bool isPooled) external payable nonReentrant {
_deployFromSender(blockIds, isPooled, address(0));
}
/// @notice Same as `deploy`, and bind `referrer` once if the caller has none yet.
function deploy(uint8[] calldata blockIds, bool isPooled, address referrer)
external
payable
nonReentrant
{
_deployFromSender(blockIds, isPooled, referrer);
}
function _deployFromSender(uint8[] calldata blockIds, bool isPooled, address referrer) internal {
_requireNotPaused();
if (!gameStarted) revert GameNotStarted();
Round storage round = rounds[currentRoundId];
if (round.settled) revert RoundNotActive();
// Waiting rounds (endTime == ROUND_WAITING) accept deploys; armed rounds end at endTime.
if (round.endTime != Constants.ROUND_WAITING && block.timestamp >= round.endTime) {
revert RoundNotActive();
}
if (blockIds.length == 0) revert NoBlocksSelected();
MinerRound storage m = miners[currentRoundId][msg.sender];
if (m.deployedMask != 0) revert AlreadyDeployed();
_ensurePriorCheckpoint(msg.sender);
uint256 deployValue = msg.value;
uint256 amountPerBlock = deployValue / blockIds.length;
if (amountPerBlock == 0) revert InsufficientDeploy();
uint256 mask;
for (uint256 i; i < blockIds.length; ++i) {
uint8 b = blockIds[i];
if (b >= Constants.GRID_SIZE) revert InvalidBlockId();
uint256 bit = uint256(1) << b;
if (mask & bit != 0) revert InvalidBlockId();
mask |= bit;
}
uint256 totalAmount = amountPerBlock * blockIds.length;
uint256 dust = deployValue - totalAmount;
if (dust > 0) {
(bool ok,) = msg.sender.call{value: dust}("");
if (!ok) revert TransferFailed();
}
// Bind before `_deploy` sets `userLastRound` (used by `_alreadyMined` backfill).
_firstMineBind(msg.sender, referrer);
_maybeArmRound(round);
_deploy(msg.sender, amountPerBlock, mask, isPooled);
}
function _deploy(address miner, uint256 amountPerBlock, uint256 mask, bool isPooled) internal {
uint64 roundId = currentRoundId;
Round storage round = rounds[roundId];
MinerRound storage m = miners[roundId][miner];
uint256 squareCount = _popcount(mask);
uint256 totalAmount = amountPerBlock * squareCount;
for (uint256 i; i < Constants.GRID_SIZE; ++i) {
if (mask & (uint256(1) << i) == 0) continue;
round.deployed[i] += amountPerBlock;
}
m.deployedMask = mask;
m.amountPerBlock = amountPerBlock;
round.totalDeployed += totalAmount;
uint256 idx = round.minerCount;
roundMinerAtIndex[roundId][idx] = miner;
round.minerCount = idx + 1;
userLastRound[miner] = roundId;
_indexSquareMiners(roundId, miner, mask);
if (isPooled) {
_recordPoolDeploy(miner, roundId, mask, amountPerBlock);
}
emit Deployed(roundId, miner, amountPerBlock, mask, totalAmount, isPooled);
}
/// @dev Append miner to each selected square's list for O(winners) top-miner sampling.
function _indexSquareMiners(uint64 roundId, address miner, uint256 mask) internal {
for (uint256 i; i < Constants.GRID_SIZE; ++i) {
if (mask & (uint256(1) << i) == 0) continue;
uint8 square = uint8(i);
uint256 n = squareMinerCount[roundId][square];
squareMinerAtIndex[roundId][square][n] = miner;
squareMinerCount[roundId][square] = n + 1;
}
}
function _recordPoolDeploy(address miner, uint64 roundId, uint256 mask, uint256 amountPerBlock) internal {
PoolMember storage member = poolMembers[miner];
if (member.roundId != roundId) {
// Reset for new round (clear array by rewriting touched slots + totals)
if (member.roundId != 0) {
for (uint256 i; i < Constants.GRID_SIZE; ++i) {
member.deployed[i] = 0;
}
}
member.roundId = roundId;
member.totalDeployed = 0;
}
PoolRound storage pr = poolRounds[roundId];
for (uint256 i; i < Constants.GRID_SIZE; ++i) {
if (mask & (uint256(1) << i) == 0) continue;
member.deployed[i] += amountPerBlock;
pr.deployed[i] += amountPerBlock;
}
uint256 add = amountPerBlock * _popcount(mask);
member.totalDeployed += add;
pr.totalDeployed += add;
if (member.totalDeployed > Constants.MAX_POOL_DEPLOY) revert PoolCapExceeded();
}
/// @dev OilAutominer path — supports non-uniform per-square amounts.
function _recordPoolDeployAmounts(
address miner,
uint64 roundId,
uint8[] calldata squares,
uint256[] calldata amounts
) internal {
PoolMember storage member = poolMembers[miner];
if (member.roundId != roundId) {
if (member.roundId != 0) {
for (uint256 i; i < Constants.GRID_SIZE; ++i) {
member.deployed[i] = 0;
}
}
member.roundId = roundId;
member.totalDeployed = 0;
}
PoolRound storage pr = poolRounds[roundId];
uint256 add;
for (uint256 i; i < squares.length; ++i) {
uint8 b = squares[i];
uint256 a = amounts[i];
member.deployed[b] += a;
pr.deployed[b] += a;
add += a;
}
member.totalDeployed += add;
pr.totalDeployed += add;
if (member.totalDeployed > Constants.MAX_POOL_DEPLOY) revert PoolCapExceeded();
}
// -------------------------------------------------------------------------
// Round lifecycle
// -------------------------------------------------------------------------
/// @notice Pin a future drand beacon for the current round (after deploy window closes).
function requestResolve() external nonReentrant {
_requireNotPaused();
if (!gameStarted) revert GameNotStarted();
Round storage round = rounds[currentRoundId];
if (round.endTime == Constants.ROUND_WAITING) revert RoundNotEnded();
if (round.settled) revert RoundAlreadySettled();
if (round.requestedAt != 0) revert AlreadyRequested();
uint256 closeTime = round.endTime;
if (
earliestRequestTimeBeforeEnd > 0
&& block.timestamp < closeTime - earliestRequestTimeBeforeEnd
) {
revert TooEarlyToRequest();
}
bytes32 rid = keccak256(abi.encode(address(this), uint256(currentRoundId), round.totalDeployed));
round.randomnessId = rid;
round.requestedAt = uint64(block.timestamp);
uint256 unlockTime = closeTime + revealSafetyBuffer;
uint256 timeUntilUnlock = unlockTime > block.timestamp ? unlockTime - block.timestamp : 0;
randomnessProvider.requestRandomness(rid, address(this), abi.encode(timeUntilUnlock));
emit RandomnessRequested(currentRoundId, rid);
}
/// @notice Re-pin randomness if the prior request was never settled within `RESOLUTION_TIMEOUT`.
function reRequestResolve() external nonReentrant {
_requireNotPaused();
if (!gameStarted) revert GameNotStarted();
Round storage round = rounds[currentRoundId];
if (round.settled || round.requestedAt == 0) revert NotRequested();
if (block.timestamp < uint256(round.requestedAt) + RESOLUTION_TIMEOUT) revert TooEarlyToReRequest();
round.requestedAt = uint64(block.timestamp);
randomnessProvider.requestRandomness(round.randomnessId, address(this), abi.encode(uint256(0)));
emit RandomnessReRequested(currentRoundId, round.randomnessId);
}
/// @notice Verify beacon + close the round after intermission.
/// @param updateData Provider settle payload (`abi.encode(round, signature)` for drand).
function settle(bytes calldata updateData) external nonReentrant {
_closeRound(updateData);
}
function _closeRound(bytes calldata updateData) internal {
_requireNotPaused();
if (!gameStarted) revert GameNotStarted();
Round storage round = rounds[currentRoundId];
// Still waiting for first deploy — nothing to settle.
if (round.endTime == Constants.ROUND_WAITING) revert RoundNotEnded();
if (block.timestamp < round.endTime + Constants.INTERMISSION) revert RoundNotEnded();
if (round.settled) revert RoundAlreadySettled();
if (round.requestedAt == 0) revert NotRequested();
randomnessProvider.settleRandomness(round.randomnessId, updateData);
(uint256 rngWord, uint256 settledAt) = randomnessProvider.getRandomness(round.randomnessId);
if (settledAt == 0) revert RandomnessNotSettled();
round.randomnessValue = bytes32(rngWord);
if (round.totalDeployed == 0) {
round.settled = true;
emit RoundSettled(currentRoundId, 0, address(0), 0, 0, 0, false, 0);
_openNextRound();
return;
}
_settle(currentRoundId, round, rngWord);
}
function _settle(uint64 roundId, Round storage round, uint256 rng) internal {
uint8 winningBlock = uint8(rng % Constants.GRID_SIZE);
round.winningBlock = winningBlock;
round.settled = true;
uint256 totalDeployed = round.totalDeployed;
uint256 winnersDeployed = round.deployed[winningBlock];
round.winnersDeployed = winnersDeployed;
if (winnersDeployed == 0) {
// Empty square: all ETH rolls into OilMotherlode.
_sendOilMotherlodeEth(totalDeployed);
emit RoundSettled(roundId, winningBlock, address(0), 0, 0, 0, false, 0);
_openNextRound();
return;
}
(
uint256 oilRound,
uint256 motherDenom,
address lpWallet_,
uint256 winnersBps_,
uint256 stakeBps_,
uint256 buybackBps_,
uint256 lpBps_
) = _gridSettleParams();
// Loser pot split from MiningConfig (or Constants fallback). Remainder → OilMotherlode.
{
uint256 losers = totalDeployed - winnersDeployed;
uint256 toWinners = (losers * winnersBps_) / Constants.BPS_DENOMINATOR;
uint256 toStake = (losers * stakeBps_) / Constants.BPS_DENOMINATOR;
uint256 toBuyback = (losers * buybackBps_) / Constants.BPS_DENOMINATOR;
uint256 toLp = (losers * lpBps_) / Constants.BPS_DENOMINATOR;
uint256 toMother = losers - toWinners - toStake - toBuyback - toLp;
round.totalWinnings = toWinners;
if (toBuyback > 0) {
ITreasury(treasury).notifyMiningBuyback{value: toBuyback}(Constants.TREASURY_SRC_GRID_BUYBACK);
}
if (toLp > 0) {
_send(lpWallet_, toLp);
}
_notifyStake(toStake);
_sendOilMotherlodeEth(toMother);
}
// 1% of winning-square stake → ETH motherlode.
{
uint256 winnerMother =
(winnersDeployed * Constants.ROUND_WINNER_MOTHERLODE_BPS) / Constants.BPS_DENOMINATOR;
if (winnerMother > 0) {
_sendOilMotherlodeEth(winnerMother);
}
}
bool isSplit = _isSplit(rng);
round.splitReward = isSplit;
uint256 mintAmount = _mintCapped(oilRound);
_accrueOilMotherlodeOil(oilRound / motherDenom);
round.topMinerReward = mintAmount;
(uint256 ethBonus, uint256 motherPayout) = _applyOilMotherlode(rng, roundId, winnersDeployed);
if (ethBonus > 0) {
round.totalWinnings += ethBonus;
}
round.motherlodeAmount = motherPayout;
address topMiner;
if (!isSplit) {
uint256 sample = uint256(rng >> 128) % winnersDeployed;
topMiner = _sampleTopMiner(roundId, winningBlock, sample);
round.topMinerSeed = sample;
// If sampled miner pooled on winning square this round → share OIL among pool
if (topMiner != address(0)) {
PoolMember storage pm = poolMembers[topMiner];
if (pm.roundId == roundId && pm.deployed[winningBlock] > 0) {
topMiner = Constants.POOL_ADDRESS;
}
}
round.topMiner = topMiner;
}
emit RoundSettled(
roundId, winningBlock, topMiner, round.totalWinnings, mintAmount, motherPayout, isSplit, winnersDeployed
);
_openNextRound();
}
function _applyOilMotherlode(uint256 rng, uint64 roundId, uint256 winnersDeployed)
internal
returns (uint256 ethBonus, uint256 oilBonus)
{
address m = motherlode;
if (m == address(0)) return (0, 0);
return IOilMotherlode(m).checkAndApply(rng, roundId, winnersDeployed);
}
/// @dev Send ETH to OilMotherlode, capped to contract balance.
function _sendOilMotherlodeEth(uint256 amount) internal {
if (amount == 0) return;
address m = motherlode;
if (m == address(0)) revert OilMotherlodeNotSet();
uint256 free = address(this).balance;
if (amount > free) amount = free;
if (amount == 0) return;
IOilMotherlode(m).notifyMotherlodeETH{value: amount}();
}
/// @dev Mint OIL into OilMotherlode and credit its pool.
function _accrueOilMotherlodeOil(uint256 amount) internal {
if (amount == 0) return;
address m = motherlode;
if (m == address(0)) revert OilMotherlodeNotSet();
uint256 minted = _mintCappedTo(m, amount);
if (minted > 0) {
IOilMotherlode(m).creditOil(minted);
}
}
function _notifyStake(uint256 amount) internal {
if (amount == 0) return;
if (staking == address(0)) revert ZeroAddress();
IStakingRewards(staking).notifyRewardETH{value: amount}();
}
function _sampleTopMiner(uint64 roundId, uint8 winningBlock, uint256 sample) internal view returns (address) {
uint256 cursor;
uint256 count = squareMinerCount[roundId][winningBlock];
for (uint256 i; i < count; ++i) {
address user = squareMinerAtIndex[roundId][winningBlock][i];
MinerRound storage m = miners[roundId][user];
uint256 stake = _minerStakeOnSquare(roundId, user, winningBlock, m);
uint256 next = cursor + stake;
if (sample >= cursor && sample < next) return user;
cursor = next;
}
return address(0);
}
function _minerStakeOnSquare(uint64 roundId, address user, uint8 square, MinerRound storage m)
internal
view
returns (uint256)
{
uint256 keyed = minerAmountOnSquare[roundId][user][square];
if (keyed > 0) return keyed;
return m.amountPerBlock;
}
function _openNextRound() internal {
uint64 nextId = currentRoundId + 1;
currentRoundId = nextId;
Round storage n = rounds[nextId];
n.startTime = block.timestamp;
// Idle until first deploy arms the mining window.
n.endTime = Constants.ROUND_WAITING;
emit GameStarted(nextId, n.startTime, n.endTime);
}
/// @dev First deploy of a waiting round starts the clock.
function _maybeArmRound(Round storage round) internal {
if (round.endTime != Constants.ROUND_WAITING) return;
round.startTime = block.timestamp;
round.endTime = round.startTime + Constants.ROUND_DURATION;
emit GameStarted(currentRoundId, round.startTime, round.endTime);
}
function _isSplit(uint256 rng) internal pure returns (bool) {
return (uint16(rng) ^ uint16(rng >> 16) ^ uint16(rng >> 32) ^ uint16(rng >> 48)) % 2 == 0;
}
function _mintCapped(uint256 amount) internal returns (uint256 minted) {
// Winner / miner mint — 8% team side-mint via TeamVesting.
return _mintCappedTo(address(this), amount, true);
}
/// @dev Motherlode accruals mint without a team cut (team is miner-mint only).
function _mintCappedTo(address to, uint256 amount) internal returns (uint256 minted) {
return _mintCappedTo(to, amount, false);
}
function _mintCappedTo(address to, uint256 amount, bool teamShare) internal returns (uint256 minted) {
if (amount == 0 || to == address(0)) return 0;
uint256 supply = oil.totalSupply();
uint256 room = oil.MAX_SUPPLY() - supply;
if (room == 0) return 0;
minted = amount > room ? room : amount;
if (minted > 0) {
oil.mint(to, minted);
if (teamShare) {
address tv = teamVesting;
if (tv != address(0)) {
// Team share lives on TeamVesting — never brick settle if vesting reverts.
try ITeamVesting(tv).onEmission(minted) {} catch {}
}
}
}
}
// -------------------------------------------------------------------------
// Checkpoint / claim
// -------------------------------------------------------------------------
function checkpoint(uint64 roundId) external nonReentrant {
_checkpoint(roundId, msg.sender, msg.sender);
}
function checkpointFor(address user, uint64 roundId) external nonReentrant {
_checkpoint(roundId, user, msg.sender);
}
/// @dev Before playing a new round, the prior played round must be checkpointed.
/// Auto-checkpoints when settled (or forfeits after ROUND_EXPIRY); otherwise reverts.
function _ensurePriorCheckpoint(address user) internal {
uint64 last = userLastRound[user];
if (last == 0 || last == currentRoundId) return;
MinerRound storage m = miners[last][user];
if (m.checkpointed) return;
if (!rounds[last].settled) revert NotCheckpointed();
_checkpoint(last, user, msg.sender);
if (!m.checkpointed) revert NotCheckpointed();
}
function _autoCheckpoint(address user) internal {
uint64 last = userLastRound[user];
if (last == 0 || last == currentRoundId) return;
MinerRound storage m = miners[last][user];
if (m.checkpointed) return;
if (!rounds[last].settled) return;
_checkpoint(last, user, msg.sender);
}
function _checkpoint(uint64 roundId, address user, address /* caller */) internal {
Round storage round = rounds[roundId];
if (!round.settled) revert RoundNotSettled();
MinerRound storage m = miners[roundId][user];
if (m.checkpointed) revert AlreadyCheckpointed();
if (m.deployedMask == 0) {
m.checkpointed = true;
return;
}
// After expiry, advance checkpoint with no rewards (forfeit).
if (block.timestamp >= round.endTime + Constants.ROUND_EXPIRY) {
m.checkpointed = true;
emit Checkpointed(roundId, user, 0, 0);
return;
}
m.checkpointed = true;
uint256 ethReward;
uint256 oilReward;
uint8 win = round.winningBlock;
bool onWin = (m.deployedMask & (1 << win)) != 0;
uint256 stake = _minerStakeOnSquare(roundId, user, win, m);
if (onWin && stake > 0 && round.winnersDeployed > 0) {
// 1% of winner principal already sent to ETH motherlode at settle; return 99% + loser share.
uint256 winnerFee =
(stake * Constants.ROUND_WINNER_MOTHERLODE_BPS) / Constants.BPS_DENOMINATOR;
ethReward = (stake - winnerFee) + (round.totalWinnings * stake) / round.winnersDeployed;
if (round.splitReward) {
oilReward = (round.topMinerReward * stake) / round.winnersDeployed;
} else if (round.topMiner == Constants.POOL_ADDRESS) {
PoolMember storage pm = poolMembers[user];
if (pm.roundId == roundId && pm.deployed[win] > 0) {
uint256 poolOnWin = poolRounds[roundId].deployed[win];
if (poolOnWin > 0) {
oilReward = (round.topMinerReward * pm.deployed[win]) / poolOnWin;
}
}
} else if (user == round.topMiner) {
oilReward = round.topMinerReward;
}
if (round.motherlodeAmount > 0) {
oilReward += (round.motherlodeAmount * stake) / round.winnersDeployed;
}
}
address ledger = rewards;
if (ledger == address(0)) revert RewardsNotSet();
if (ethReward > 0) {
// Cap to balance. Rounding across winners can otherwise over-assign by dust.
uint256 free = address(this).balance;
if (ethReward > free) ethReward = free;
if (ethReward > 0) {
IRewardsLedger(ledger).creditEth{value: ethReward}(REWARDS_LANE_GRID, user);
}
}
if (oilReward > 0) {
IERC20(address(oil)).forceApprove(ledger, oilReward);
IRewardsLedger(ledger).creditOil(REWARDS_LANE_GRID, user, oilReward);
}
emit Checkpointed(roundId, user, ethReward, oilReward);
}
/// @notice Checkpoint then claim grid ETH via RewardsLedger (does not include referral balances).
function claimETH() external nonReentrant {
_autoCheckpoint(msg.sender);
address ledger = rewards;
if (ledger == address(0)) revert RewardsNotSet();
uint256 payout = IRewardsLedger(ledger).payoutGridETH(msg.sender, msg.sender);
if (payout == 0) revert NothingToClaim();
emit ClaimedETH(msg.sender, payout);
}
/// @notice Checkpoint then claim grid OIL via RewardsLedger.
function claimOIL() external nonReentrant {
_autoCheckpoint(msg.sender);
address ledger = rewards;
if (ledger == address(0)) revert RewardsNotSet();
if (!IRewardsLedger(ledger).payoutGridOIL(msg.sender)) revert NothingToClaim();
emit ClaimedOIL(msg.sender, 0);
}
/// @notice Claim mining ETH and OIL in a single transaction (does not include referral balances).
function claimAll() external nonReentrant {
_autoCheckpoint(msg.sender);
address ledger = rewards;
if (ledger == address(0)) revert RewardsNotSet();
uint256 ethPayout = IRewardsLedger(ledger).payoutGridETH(msg.sender, msg.sender);
bool oilOk = IRewardsLedger(ledger).payoutGridOIL(msg.sender);
if (ethPayout == 0 && !oilOk) revert NothingToClaim();
if (ethPayout > 0) emit ClaimedETH(msg.sender, ethPayout);
if (oilOk) emit ClaimedOIL(msg.sender, 0);
}
/// @dev Live params from MiningConfig when set; else local storage / Constants (migrate window).
function _gridSettleParams()
internal
view
returns (
uint256 oilRound,
uint256 motherDenom,
address lpWallet_,
uint256 winnersBps_,
uint256 stakeBps_,
uint256 buybackBps_,
uint256 lpBps_
)
{
address cfgAddr = miningConfig;
if (cfgAddr != address(0)) {
MiningConfig cfg = MiningConfig(cfgAddr);
oilRound = cfg.gridOilPerRound();
motherDenom = cfg.gridOilMotherlodeDenominator();
lpWallet_ = cfg.lpWallet();
MiningConfig.LoserSplit memory s = cfg.gridLoserSplit();
winnersBps_ = s.winnersBps;
stakeBps_ = s.stakeBps;
buybackBps_ = s.buybackBps;
lpBps_ = s.lpBps;
return (oilRound, motherDenom, lpWallet_, winnersBps_, stakeBps_, buybackBps_, lpBps_);
}
return (
oilPerRound,
motherlodeDenominator,
Constants.LP_WALLET,
Constants.ROUND_WINNERS_BPS,
Constants.ROUND_STAKE_BPS,
Constants.ROUND_BUYBACK_BPS,
Constants.ROUND_LP_BPS
);
}
function _send(address to, uint256 amount) internal {
if (amount == 0) return;
(bool ok,) = to.call{value: amount}("");
if (!ok) revert TransferFailed();
}
/// @dev Escrow ETH payout.
function _payoutEth(address to, uint256 amount) internal {
if (amount == 0) return;
if (address(this).balance < amount) revert InsufficientEthReserves();
_send(to, amount);
}
// -------------------------------------------------------------------------
// Views
// -------------------------------------------------------------------------
/// @notice Convenience: OilMotherlode OIL pool (0 if unset).
function motherlodeOilPool() external view returns (uint256) {
address m = motherlode;
return m == address(0) ? 0 : IOilMotherlode(m).oilPool();
}
/// @notice Convenience: OilMotherlode ETH pool (0 if unset).
function motherlodeEthPool() external view returns (uint256) {
address m = motherlode;
return m == address(0) ? 0 : IOilMotherlode(m).ethPool();
}
function getCurrentRoundInfo()
external
view
returns (
uint64 roundId,
uint256 startTime,
uint256 endTime,
uint256 totalDeployed,
uint256 timeRemaining,
bool isActive
)
{
roundId = currentRoundId;
Round storage r = rounds[roundId];
startTime = r.startTime;
endTime = r.endTime;
totalDeployed = r.totalDeployed;
if (r.endTime == Constants.ROUND_WAITING || block.timestamp >= r.endTime) {
timeRemaining = 0;
} else {
timeRemaining = r.endTime - block.timestamp;
}
isActive = gameStarted && !r.settled && r.endTime != Constants.ROUND_WAITING
&& block.timestamp >= r.startTime && block.timestamp < r.endTime;
}
function getRoundDeployed(uint64 roundId) external view returns (uint256[25] memory) {
return rounds[roundId].deployed;
}
function getPoolRoundDeployed(uint64 roundId) external view returns (uint256[25] memory) {
return poolRounds[roundId].deployed;
}
function getPoolMemberDeployed(address user) external view returns (uint256[25] memory) {
return poolMembers[user].deployed;
}
function getMinerInfo(uint64 roundId, address user)
external
view
returns (uint256 deployedMask, uint256 amountPerBlock, bool checkpointed)
{
MinerRound storage m = miners[roundId][user];
return (m.deployedMask, m.amountPerBlock, m.checkpointed);
}
function getRound(uint64 roundId)
external
view
returns (
uint256 startTime,
uint256 endTime,
uint256 totalDeployed,
uint256 totalWinnings,
uint256 winnersDeployed,
uint256 topMinerReward,
uint256 motherlodeAmount,
bytes32 randomnessValue,
bytes32 randomnessId,
uint64 requestedAt,
uint8 winningBlock,
address topMiner,
bool settled,
bool splitReward,
uint256 minerCount
)
{
Round storage r = rounds[roundId];
return (
r.startTime,
r.endTime,
r.totalDeployed,
r.totalWinnings,
r.winnersDeployed,
r.topMinerReward,
r.motherlodeAmount,
r.randomnessValue,
r.randomnessId,
r.requestedAt,
r.winningBlock,
r.topMiner,
r.settled,
r.splitReward,
r.minerCount
);
}
}[
{
"type": "constructor",
"inputs": [],
"stateMutability": "nonpayable"
},
{
"name": "AddressEmptyCode",
"type": "error",
"inputs": [
{
"name": "target",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "AlreadyCheckpointed",
"type": "error",
"inputs": []
},
{
"name": "AlreadyDeployed",
"type": "error",
"inputs": []
},
{
"name": "AlreadyRequested",
"type": "error",
"inputs": []
},
{
"name": "BadArrays",
"type": "error",
"inputs": []
},
{
"name": "ERC1967InvalidImplementation",
"type": "error",
"inputs": [
{
"name": "implementation",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC1967NonPayable",
"type": "error",
"inputs": []
},
{
"name": "FailedCall",
"type": "error",
"inputs": []
},
{
"name": "GameAlreadyStarted",
"type": "error",
"inputs": []
},
{
"name": "GameNotStarted",
"type": "error",
"inputs": []
},
{
"name": "InsufficientDeploy",
"type": "error",
"inputs": []
},
{
"name": "InsufficientEthReserves",
"type": "error",
"inputs": []
},
{
"name": "InsufficientOilReserves",
"type": "error",
"inputs": []
},
{
"name": "InvalidAmount",
"type": "error",
"inputs": []
},
{
"name": "InvalidBlockId",
"type": "error",
"inputs": []
},
{
"name": "InvalidInitialization",
"type": "error",
"inputs": []
},
{
"name": "InvalidRevealBuffer",
"type": "error",
"inputs": []
},
{
"name": "NoBlocksSelected",
"type": "error",
"inputs": []
},
{
"name": "NotCheckpointed",
"type": "error",
"inputs": []
},
{
"name": "NotInitializing",
"type": "error",
"inputs": []
},
{
"name": "NotRequested",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"type": "error",
"inputs": []
},
{
"name": "OilMotherlodeNotSet",
"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": "Paused",
"type": "error",
"inputs": []
},
{
"name": "PoolCapExceeded",
"type": "error",
"inputs": []
},
{
"name": "RandomnessNotConfigured",
"type": "error",
"inputs": []
},
{
"name": "RandomnessNotSettled",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "ReferralRegistryNotSet",
"type": "error",
"inputs": []
},
{
"name": "RewardsNotSet",
"type": "error",
"inputs": []
},
{
"name": "RoundAlreadySettled",
"type": "error",
"inputs": []
},
{
"name": "RoundNotActive",
"type": "error",
"inputs": []
},
{
"name": "RoundNotEnded",
"type": "error",
"inputs": []
},
{
"name": "RoundNotSettled",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "TooEarlyToReRequest",
"type": "error",
"inputs": []
},
{
"name": "TooEarlyToRequest",
"type": "error",
"inputs": []
},
{
"name": "TransferFailed",
"type": "error",
"inputs": []
},
{
"name": "UUPSUnauthorizedCallContext",
"type": "error",
"inputs": []
},
{
"name": "UUPSUnsupportedProxiableUUID",
"type": "error",
"inputs": [
{
"name": "slot",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "Unauthorized",
"type": "error",
"inputs": []
},
{
"name": "ValueNotSum",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"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": "oilReward",
"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": "ClaimedOIL",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ConfigUpdated",
"type": "event",
"inputs": [],
"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"
},
{
"name": "isPooled",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "EarliestRequestTimeBeforeEndUpdated",
"type": "event",
"inputs": [
{
"name": "oldValue",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "newValue",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"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": "Initialized",
"type": "event",
"inputs": [
{
"name": "version",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "MiningConfigUpdated",
"type": "event",
"inputs": [
{
"name": "miningConfig",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OilAutominerUpdated",
"type": "event",
"inputs": [
{
"name": "oilAutominer",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OilMotherlodeUpdated",
"type": "event",
"inputs": [
{
"name": "motherlode",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"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": "PauseUpdated",
"type": "event",
"inputs": [
{
"name": "paused",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "RandomnessProviderUpdated",
"type": "event",
"inputs": [
{
"name": "provider",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RandomnessReRequested",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "randomnessId",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "RandomnessRequested",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "randomnessId",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "ReferralRegistryUpdated",
"type": "event",
"inputs": [
{
"name": "referralRegistry",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RevealSafetyBufferUpdated",
"type": "event",
"inputs": [
{
"name": "oldValue",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "newValue",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "RewardsUpdated",
"type": "event",
"inputs": [
{
"name": "rewards",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"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": "motherlodeAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "isSplit",
"type": "bool",
"indexed": false,
"internalType": "bool"
},
{
"name": "winnersDeployed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Upgraded",
"type": "event",
"inputs": [
{
"name": "implementation",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MAX_REVEAL_SAFETY_BUFFER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "MIN_REVEAL_SAFETY_BUFFER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "RESOLUTION_TIMEOUT",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "UPGRADE_INTERFACE_VERSION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "auctionMining",
"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": "checkpointFor",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "roundId",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimAll",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimETH",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimETHForOilAutominer",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "payout",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimOIL",
"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[]"
},
{
"name": "isPooled",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "deploy",
"type": "function",
"inputs": [
{
"name": "blockIds",
"type": "uint8[]",
"internalType": "uint8[]"
},
{
"name": "isPooled",
"type": "bool",
"internalType": "bool"
},
{
"name": "referrer",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "deployFor",
"type": "function",
"inputs": [
{
"name": "beneficiary",
"type": "address",
"internalType": "address"
},
{
"name": "squares",
"type": "uint8[]",
"internalType": "uint8[]"
},
{
"name": "amounts",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "isPooled",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "earliestRequestTimeBeforeEnd",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"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": "getPoolMemberDeployed",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256[25]",
"internalType": "uint256[25]"
}
],
"stateMutability": "view"
},
{
"name": "getPoolRoundDeployed",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [
{
"name": "",
"type": "uint256[25]",
"internalType": "uint256[25]"
}
],
"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": "winnersDeployed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "topMinerReward",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "motherlodeAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "randomnessValue",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "randomnessId",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "requestedAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "winningBlock",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "topMiner",
"type": "address",
"internalType": "address"
},
{
"name": "settled",
"type": "bool",
"internalType": "bool"
},
{
"name": "splitReward",
"type": "bool",
"internalType": "bool"
},
{
"name": "minerCount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getRoundDeployed",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [
{
"name": "",
"type": "uint256[25]",
"internalType": "uint256[25]"
}
],
"stateMutability": "view"
},
{
"name": "initialize",
"type": "function",
"inputs": [
{
"name": "oil_",
"type": "address",
"internalType": "address"
},
{
"name": "randomnessProvider_",
"type": "address",
"internalType": "address"
},
{
"name": "treasury_",
"type": "address",
"internalType": "address"
},
{
"name": "owner_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "minerAmountOnSquare",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"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": "miningConfig",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "motherlode",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "motherlodeDenominator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "motherlodeEthPool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "motherlodeOilPool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "oil",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IOil"
}
],
"stateMutability": "view"
},
{
"name": "oilAutominer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "oilPerRound",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "paused",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "poolMembers",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "roundId",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "totalDeployed",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "poolRounds",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [
{
"name": "totalDeployed",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "proxiableUUID",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "randomnessProvider",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IRandomnessProvider"
}
],
"stateMutability": "view"
},
{
"name": "reRequestResolve",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "referralRegistry",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "requestResolve",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "revealSafetyBuffer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "rewards",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "roundMinerAtIndex",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"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": "topMinerReward",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "motherlodeAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "randomnessValue",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "randomnessId",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "requestedAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "topMinerSeed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "winningBlock",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "topMiner",
"type": "address",
"internalType": "address"
},
{
"name": "settled",
"type": "bool",
"internalType": "bool"
},
{
"name": "splitReward",
"type": "bool",
"internalType": "bool"
},
{
"name": "minerCount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setAuctionMining",
"type": "function",
"inputs": [
{
"name": "auction_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setEarliestRequestTimeBeforeEnd",
"type": "function",
"inputs": [
{
"name": "newValue",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMiningConfig",
"type": "function",
"inputs": [
{
"name": "miningConfig_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOilAutominer",
"type": "function",
"inputs": [
{
"name": "autominer_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOilMotherlode",
"type": "function",
"inputs": [
{
"name": "motherlode_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOilMotherlodeDenominator",
"type": "function",
"inputs": [
{
"name": "denom",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOilPerRound",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPaused",
"type": "function",
"inputs": [
{
"name": "paused_",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRandomnessProvider",
"type": "function",
"inputs": [
{
"name": "provider_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setReferralRegistry",
"type": "function",
"inputs": [
{
"name": "registry_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRevealSafetyBuffer",
"type": "function",
"inputs": [
{
"name": "newBuffer",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRewards",
"type": "function",
"inputs": [
{
"name": "rewards_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setStaking",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTeamVesting",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTreasury",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "settle",
"type": "function",
"inputs": [
{
"name": "updateData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "squareMinerAtIndex",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "squareMinerCount",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "staking",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "startFirstRound",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "teamVesting",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"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": "address"
}
],
"stateMutability": "view"
},
{
"name": "upgradeToAndCall",
"type": "function",
"inputs": [
{
"name": "newImplementation",
"type": "address",
"internalType": "address"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "userLastRound",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60a080604052346101065730608052601880546001600160801b031916680200000000000000061790557ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054604081901c60ff166100f5576002600160401b03196001600160401b0382160161008f575b60405161538d908161010c8239608051818181612dd00152612ea00152f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880610070565b63f92ee8a960e01b60005260046000fd5b600080fdfe60a080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c908163144d02291461355c5750806316c38b3c146134f85780631986af00146134cf57806324294b1f1461331157806324ca63c2146132f557806324cd460c146132ce5780632d588b18146132a25780632f6a106d146132845780633570dac61461325b5780634187c6c8146131ac57806347fadcb61461318357806349c36ca1146131355780634cf088d91461310c5780634d828652146130735780634e627e621461304a5780634f1ef28614612e2557806352d1902d14612dbd578063551f730314612d4a578063556fe77514612d23578063590674ed14612cd75780635c975abb14612cb45780635e123ce414612c915780635eed82b3146120bd57806360a8eb6214612c45578063619f3d6c14612c1c57806361d027b314612bf357806362857afd14612ba557806363f9cc05146127875780636623a0aa1461272b5780636727299914612637578063685384c0146125f85780636a79115f146125855780636c2a5d4e14612569578063715018a6146124e8578063736518711461233a578063747dff421461225057806379ba5097146121ff5780637e1dee161461213a5780637e930866146120bd57806382d5e1d41461209f5780638da5cb5b146120695780638ff3909914612022578063910decc314611faf5780639cbe5efd14611f855780639ec5a89414611f5c578063a080a88a14611f0b578063a0dfb90214611ccd578063ad3cb1cc14611c84578063ae4b7cbc14611c3d578063affac9e014611bc8578063b15fbc1414611b55578063bc3ac87514611a5b578063bfcbc43b146119f8578063c697f1a21461139a578063c7028f4214611327578063c8993c99146112e0578063cce7aa5f146112c3578063ce9bf5ac1461129a578063d0322fbf14611235578063d1058e5914611093578063d31c5b3b14611019578063dd1f9a5d14610f19578063dfedce3114610ef0578063e30c397814610eba578063e319416d14610dad578063e6f1df0614610d75578063e75fe5411461089f578063e77944eb146107fd578063eaf2bf0a146107d3578063ec38a86214610760578063f0f442601461070a578063f2fde38b14610682578063f8c8765e14610402578063f96e3ac5146103a45763fa397d620361000f57346103a15760203660031901126103a1576020906001600160401b03906040906001600160a01b0361038f61369a565b168152600d8452205416604051908152f35b80fd5b50346103a15760203660031901126103a1576103f2600160406103fe936001600160401b036103d1613646565b61032084516103e082826136dc565b369037168152600c60205220016137c7565b6040519182918261366b565b0390f35b50346103a15760803660031901126103a15761041c61369a565b6104246136b0565b61042c6136c6565b906064356001600160a01b0381169081810361067e57600080516020615318833981519152549460ff8660401c1615956001600160401b03811680159081610676575b600114908161066c575b159081610663575b506106545767ffffffffffffffff1981166001176000805160206153188339815191525586610627575b506001600160a01b03169182158015610616575b8015610605575b80156105fd575b6105ee576104d9614954565b6104e1614954565b156105da576104ef90613f2c565b6104f7614954565b6104ff614954565b610507614954565b60016000805160206152f883398151915255610521614954565b6001600160601b0360a01b85541617845560018060a01b03166001600160601b0360a01b600154161760015560018060a01b03166001600160601b0360a01b6002541617600255673782dace9d90000060055560046006556105805780f35b68ff0000000000000000196000805160206153188339815191525416600080516020615318833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b631e4fbdf760e01b86526004869052602486fd5b63d92e233d60e01b8752600487fd5b5080156104cd565b506001600160a01b038516156104c6565b506001600160a01b038416156104bf565b68ffffffffffffffffff1916680100000000000000011760008051602061531883398151915255386104ab565b63f92ee8a960e01b8852600488fd5b90501538610481565b303b159150610479565b88915061046f565b8580fd5b50346103a15760203660031901126103a15761069c61369a565b6106a461389e565b60008051602061533883398151915280546001600160a01b0319166001600160a01b039283169081179091556000805160206152b8833981519152549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346103a15760203660031901126103a15761072461369a565b61072c61389e565b6001600160a01b03168015610751576001600160601b0360a01b600254161760025580f35b63d92e233d60e01b8252600482fd5b50346103a15760203660031901126103a15761077a61369a565b61078261389e565b6001600160a01b03168015610751576020817f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf926001600160601b0360a01b600e541617600e55604051908152a180f35b50346103a157806003193601126103a15760206001600160401b0360185460401c16604051908152f35b50346103a157806003193601126103a1576012546001600160a01b0316908161082d57602091505b604051908152f35b60206004926040519384809263e40d9d6360e01b82525afa908115610893579061085b575b60209150610825565b506020813d60201161088b575b81610875602093836136dc565b810103126108865760209051610852565b600080fd5b3d9150610868565b604051903d90823e3d90fd5b5060603660031901126103a1576004356001600160401b038111610d71576108cb90369060040161372e565b906108d461365c565b6108dc6136c6565b6108e46138f1565b6108ec6138d4565b60075460ff811615610d62576001600160401b039060081c16908186526008602052604086209160ff600b84015460a81c16610d485760018301546000198114159081610d57575b50610d48578515610d395786526009602090815260408088203360009081529252902054610d2a5761096533613f9a565b61096f8534613940565b948515610d1b578690819582905b828210610ccd575050610993610999918861392d565b3461384d565b80610ca2575b5050906109af6109b49233614057565b6140f4565b6001600160401b0360075460081c16918285526008602052604085209183865260096020526040862060018060a01b03331660005260205260406000209285610a056109ff856149e9565b8261392d565b94600d8301895b60198110610c665750509060018286600c959455015560028101610a318682546137ff565b9055018054858852600a60209081526040808a20838b52909152882080546001600160a01b031916331790556001810191908210610c525755338652600d602052604086206001600160401b0385166001600160401b031982541617905580610a9b833387614156565b610aff575b604080519586526020860192909252908401919091521515606083015233917ff7c5da9d99fd36c3b07e372c4e1f0a85ca1c8857b33f2eace705bf2c04b577e59080608081015b0390a360016000805160206152f88339815191525580f35b338652600b602052604086206001600160401b03815416858103610bf1575b50848752600c602052604087206002820160018201895b60198110610b915750505090670de0b6b3a764000091610b796001610b62610b5c886149e9565b8b61392d565b930192610b708185546137ff565b845582546137ff565b9055541115610aa05763053be18f60e21b8652600486fd5b80600180921b881615610bec57610bd58b610bbe610baf848861388e565b91909283548360031b1c6137ff565b825460001960039390931b92831b1916911b179055565b610be68b610bbe610baf848761388e565b01610b35565b610be6565b610c1b575b6001600160401b0385166001600160401b031982541617815586600182015538610b1e565b60028101875b60198110610c30575050610bf6565b80610c3d6001928461388e565b8154906000199060031b1b1916905501610c21565b634e487b7160e01b88526011600452602488fd5b60018092939450811b871615610c9d57610c93610c83828561388e565b610bbe8d83548360031b1c6137ff565b0190889291610a0c565b610c93565b81808092335af1610cb1613e5e565b5015610cbe57853861099f565b6312171d8360e31b8652600486fd5b9192509560ff610ce6610ce189868661385a565b613880565b166019811015610d0c576001901b90818116610d0c57899392916001911797019061097d565b63037a804f60e41b8a5260048afd5b6365cd08ed60e01b8752600487fd5b63a6ef0ba160e01b8652600486fd5b63634538d760e11b8752600487fd5b633df07da560e01b8752600487fd5b905042101538610934565b633a5f7b5760e01b8652600486fd5b5080fd5b50346103a15760203660031901126103a15760406020916001600160401b03610d9c613646565b168152600c83522054604051908152f35b50346103a15760203660031901126103a157610dc761369a565b610dcf6138f1565b6013546001600160a01b03163303610eac576001600160a01b0381161561075157610df981613e8e565b600e546001600160a01b0316908115610e9d5760405163deb9bc2d60e01b81526001600160a01b0391909116600482015233602482015291906020908390604490829085905af19081156108935790610e6a575b60209060016000805160206152f883398151915255604051908152f35b506020813d602011610e95575b81610e84602093836136dc565b810103126108865760209051610e4d565b3d9150610e77565b63132fb52160e11b8352600483fd5b6282b42960e81b8252600482fd5b50346103a157806003193601126103a157600080516020615338833981519152546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a1576011546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a157610f326138f1565b610f3b33613e8e565b600e546001600160a01b0316801561100a57602082916024604051809481936312cb9acb60e01b83523360048401525af1908115610fff578291610fd0575b5015610fc1576040518181527fc8fa3f4f31ec36ca84867c76bbc8474396b24252f1721e29a887d503f786e5b860203392a260016000805160206152f88339815191525580f35b6312d37ee560e31b8152600490fd5b610ff2915060203d602011610ff8575b610fea81836136dc565b8101906137af565b38610f7a565b503d610fe0565b6040513d84823e3d90fd5b63132fb52160e11b8252600482fd5b50346103a15760203660031901126103a15760043561103661389e565b8015611066576006557ffe891c6ab12cf73707f8deb6600c12ba382e4cc31eb2b0a2754cad13075ed2d18180a180f35b60405162461bcd60e51b815260206004820152600560248201526464656e6f6d60d81b6044820152606490fd5b50346103a157806003193601126103a1576110ac6138f1565b6110b533613e8e565b600e546001600160a01b0316801561100a5760405163deb9bc2d60e01b815233600482018190526024820152829160208260448186855af19182156111f25783926111fd575b506020906024604051809581936312cb9acb60e01b83523360048401525af19182156111f25783926111d1575b50801580806111c9575b6111ba5715611188575b50611157575b60016000805160206152f88339815191525580f35b6040518181527fc8fa3f4f31ec36ca84867c76bbc8474396b24252f1721e29a887d503f786e5b860203392a2611142565b6040519081527f9f413f0f451c24edeec8f50838056a8d47c9d8ea0226e5a536392f677a310ad560203392a23861113c565b6312d37ee560e31b8452600484fd5b508215611132565b6111eb91925060203d602011610ff857610fea81836136dc565b9038611128565b6040513d85823e3d90fd5b925090506020823d60201161122d575b8161121a602093836136dc565b81010312610886579051829160206110fb565b3d915061120d565b50346103a15760203660031901126103a1576004356001600160401b038111610d715736602382011215610d715780600401356001600160401b038111611296573660248284010111611296576024611142926112906138f1565b01614222565b8280fd5b50346103a157806003193601126103a1576001546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a157602060405161012c8152f35b50346103a15760203660031901126103a1576112fa61369a565b61130261389e565b6001600160a01b03168015610751576001600160601b0360a01b600454161760045580f35b50346103a15760203660031901126103a15761134161369a565b61134961389e565b6001600160a01b03168015610751576020817f09d2adccc5cfc22875926867a6b8609d445ef46c79d9417dee17fded145da700926001600160601b0360a01b6013541617601355604051908152a180f35b5060803660031901126103a1576113af61369a565b6024356001600160401b038111611296576113ce90369060040161372e565b6044929192356001600160401b0381116119f4576113f090369060040161372e565b92906064359081151582036119f0576114076138f1565b61140f6138d4565b6013546001600160a01b031633036119e2576001600160a01b038316156105ee5760075460ff8116156119d357841580156119c9575b6119ba576001600160401b039060081c16948588526008602052604088209560ff600b88015460a81c166119a057600187015460001981141590816119af575b506119a05788526009602052604080892060009060018060a01b03871682526020522090815461199157889789968a5b8181106119235750893403611914578580611903575b6118f4576114d887613f9a565b600f546001600160a01b031680156118e5576001600160a01b0388168c52600d60205260408c20548c91906001600160401b03161515813b1561129657829060648b83604051958694859363032cd31f60e21b855260018060a01b0316600485015282602485015260448401525af18015610fff576118cc575b505061155d896140f4565b6001600160401b0360075460081c169883156118b8576001948c858a828e5b8b888a81881061182e57505050505050505090818a600c93558d87600014611825575060018835915b0155600281016115b68d82546137ff565b9055018054908a8d52600a6020528c8260408220915260205260408d2060018060a01b038a166001600160601b0360a01b8254161790556001820180921161181157556001600160a01b0387168b52600d60205260408b20805467ffffffffffffffff19166001600160401b038b161790558561163489898c614156565b6116a8575b50505091610ae7917ff7c5da9d99fd36c3b07e372c4e1f0a85ca1c8857b33f2eace705bf2c04b577e59594936000146116a15735965b6040805198895260208901959095529387019390935291151560608601526001600160a01b0316939081906080820190565b508661166f565b6001600160a01b0387168b52600b60205260408b2080549091906001600160401b03168a81036117b0575b5092898c52600c60205260408c20928c948d926002850160805260018601915b8981861061173e575050505050509061171f6001670de0b6b3a764000094930192610b708185546137ff565b9055541161172f57388080611639565b63053be18f60e21b8852600488fd5b6117a59086996117a06117906117698a88611763610ce18d9e8b60019c9d9e9f61385a565b9661385a565b359361178a61177a8260805161388e565b610bbe8883548360031b1c6137ff565b8961388e565b610bbe8583548360031b1c6137ff565b6137ff565b9701939291906116f3565b6117da575b6001600160401b038a166001600160401b03198354161782558b6001830155386116d3565b600282018c5b601981106117ef5750506117b5565b806117fc6001928461388e565b8154906000199060031b1b19169055016117e0565b634e487b7160e01b8d52601160045260248dfd5b600190916115a5565b604094600d9794611876611866889661185c8f9b976118548f9182610ce1918d9b61385a565b9a8b9361385a565b359b8c9b0161388e565b610bbe8b83548360031b1c6137ff565b815260146020522060009160018060a01b031682526020522060ff60009216825260205220558835036118b0575b600101858a8f8e61157c565b8d96506118a4565b634e487b7160e01b8c52603260045260248cfd5b816118d6916136dc565b6118e1578a38611552565b8a80fd5b632f6840b560e21b8c5260048cfd5b63053be18f60e21b8b5260048bfd5b50670de0b6b3a76400008a116114cb565b63589d001160e11b8b5260048bfd5b999760ff611935610ce18d858761385a565b166019811015611982576001901b908181166119825717976119588b858861385a565b359081156119735760019161196c916137ff565b9a016114b5565b6365cd08ed60e01b8d5260048dfd5b63037a804f60e41b8d5260048dfd5b63a6ef0ba160e01b8952600489fd5b633df07da560e01b8952600489fd5b905042101538611485565b6331c8778360e21b8852600488fd5b5085851415611445565b633a5f7b5760e01b8852600488fd5b6282b42960e81b8752600487fd5b8680fd5b8480fd5b50346103a15760603660031901126103a157602090611a15613646565b6001600160401b03611a2561375e565b911682526016835260ff6040832091166000528252604060002060443582528252604060018060a01b0391205416604051908152f35b50346103a15760203660031901126103a1576040610200916001600160401b03611a83613646565b16815260086020522080549060ff600182015491600281015460038201546004830154600584015460068501546007860154916008870154936001600160401b0360098901541695600a89015497600c600b8b01549a01549b60206040519e8f908152015260408d015260608c015260808b015260a08a015260c089015260e088015261010087015261012086015261014085015281811661016085015260018060a01b038160081c16610180850152818160a81c1615156101a085015260b01c1615156101c08301526101e0820152f35b50346103a15760203660031901126103a157611b6f61369a565b611b7761389e565b6001600160a01b03168015610751576020817f87b050f471f7331bfd8fc9347cd54894f2ae6663e3339e49ca0d8b2dbe792eb2926001600160601b0360a01b6001541617600155604051908152a180f35b50346103a15760603660031901126103a157611be2613646565b90611beb6136b0565b906044359260ff84168403610d7157906001600160401b036040921681526014602052209060018060a01b031660005260205260ff604060002091166000526020526020604060002054604051908152f35b50346103a15760203660031901126103a157611c5761369a565b611c5f61389e565b6001600160a01b03168015610751576001600160601b0360a01b601054161760105580f35b50346103a157806003193601126103a157506103fe604051611ca76040826136dc565b60058152640352e302e360dc1b602082015260405191829160208352602083019061376e565b50346103a157806003193601126103a157611ce66138f1565b611cee6138d4565b60075460ff811615611efc576001600160401b039060081c16808252600860205260408220906001820154916000198314611eed5760ff600b82015460a81c16611ede5760098101916001600160401b03835416611ecf576001600160401b0360185460401c168015159081611ebc575b50611ead57928492826008956002611dcd9501546040519060208201923084526040830152606082015260608152611d986080826136dc565b51902095869101556001600160401b03804216166001600160401b03198254161790556001600160401b0360185416906137ff565b42811115611ea657611de090429061384d565b60018060a01b036001541660405191602083015260208252611e036040836136dc565b803b156112965760405163c2fc530160e01b81529183918391829084908290611e3190308b60048501613822565b03925af18015610fff57611e91575b50507fc7449912a6ba2079a6fdd0a6bce7d912a3b15cb76113cc9f0e9bd4eae730d75060206001600160401b0360075460081c1692604051908152a260016000805160206152f88339815191525580f35b81611e9b916136dc565b610d71578138611e40565b5080611de0565b6301fe570560e51b8552600485fd5b611ec791508561384d565b421038611d5f565b632981f6c160e11b8552600485fd5b6308d4975360e11b8452600484fd5b636218b96960e11b8452600484fd5b633a5f7b5760e01b8252600482fd5b50346103a15760403660031901126103a15760ff6040611f29613646565b926001600160401b03611f3a61375e565b9416815260176020522091166000526020526020604060002054604051908152f35b50346103a157806003193601126103a157600e546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a15760206001600160401b0360075460081c16604051908152f35b50346103a15760203660031901126103a157611fc961369a565b611fd161389e565b6001600160a01b03168015610751576020817f90e159f0f121f20aec23ca7ba722e583c10bcfc550e4b5bed5a1bf1b9c2d1bae926001600160601b0360a01b6011541617601155604051908152a180f35b50346103a15760203660031901126103a15761203c61369a565b61204461389e565b6001600160a01b03168015610751576001600160601b0360a01b600354161760035580f35b50346103a157806003193601126103a1576000805160206152b8833981519152546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a1576020600554604051908152f35b50346103a15760403660031901126103a157604090816120db613646565b916001600160401b036120ec6136b0565b9316815260096020522060009160018060a01b031682526020522080546103fe60ff600260018501549401541660405193849384919260409194936060840195845260208401521515910152565b50346103a15760203660031901126103a157612154613646565b61215c61389e565b603c6001600160401b038216116121f0576001600160401b037f0d282a021a2e883a9f8db89187f76ab54828e887beb610a5a5e46af488b64f7e916121ea6018549167ffffffffffffffff60401b8160401b1667ffffffffffffffff60401b1984161760185560405193849360401c16839092916001600160401b0360209181604085019616845216910152565b0390a180f35b63162908e360e11b8252600482fd5b50346103a157806003193601126103a15760008051602061533883398151915254336001600160a01b039091160361223d5761223a33613f2c565b80f35b63118cdaa760e01b815233600452602490fd5b50346103a157806003193601126103a1578060c09150600754906001600160401b038260081c169182825260086020526040822091825460018401549060028501549260001983149081159182612330575b1561231d5760ff90955b16958661230a575b5085612302575b50846122f6575b846122eb575b6040519586526020860152604085015260608401526080830152151560a0820152f35b9350804210936122c8565b809450421015936122c2565b9450386122bb565b600b015460a81c60ff16159550386122b4565b5060ff61232a428561384d565b956122ac565b50834210156122a2565b50346103a157806003193601126103a1576123536138f1565b61235b6138d4565b60075460ff811615611efc576001600160401b039060081c16815260086020526040812060ff600b82015460a81c1680156124d3575b6124c557600981016001600160401b0381541661012c81018091116124b15742106124a2576001600160401b03804216166001600160401b031982541617905581600860018060a01b03600154169201918254604051836020820152602081526123fc6040826136dc565b823b1561249e576124289284928360405180968195829463c2fc530160e01b8452309060048501613822565b03925af18015610fff57612489575b50507f09e42ed9ea3d4e067e0c2ab62128104f75bdba0cea869df01b3d7071f51b650b60206001600160401b0360075460081c169254604051908152a260016000805160206152f88339815191525580f35b81612493916136dc565b610d71578138612437565b8380fd5b630d609bfb60e01b8352600483fd5b634e487b7160e01b84526011600452602484fd5b6294861760e21b8252600482fd5b506001600160401b0360098201541615612391565b50346103a157806003193601126103a15761250161389e565b60008051602061533883398151915280546001600160a01b03199081169091556000805160206152b88339815191528054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50346103a157806003193601126103a157602060405160038152f35b50346103a15760203660031901126103a15761259f61369a565b6125a761389e565b6001600160a01b03168015610751576020817f9d4414af8d61d821c1ad25f0aadfa28aa386c452716a31fc1f7fdbd9b9d364dc926001600160601b0360a01b600f541617600f55604051908152a180f35b50346103a15760403660031901126103a15761261261369a565b602435906001600160401b038216820361129657611142916126326138f1565b613960565b50346103a157806003193601126103a1576126506138f1565b61265933613e8e565b600e546001600160a01b0316801561100a5760405163deb9bc2d60e01b815233600482018190526024820152906020908290604490829086905af1908115610fff5782916126f9575b5080156126ea576040519081527f9f413f0f451c24edeec8f50838056a8d47c9d8ea0226e5a536392f677a310ad560203392a260016000805160206152f88339815191525580f35b6312d37ee560e31b8252600482fd5b90506020813d602011612723575b81612714602093836136dc565b810103126108865751386126a2565b3d9150612707565b50346103a157806003193601126103a1576012546001600160a01b0316908161275a5760209150604051908152f35b602060049260405193848092633c599ce960e21b82525afa908115610893579061085b5760209150610825565b5060403660031901126103a1576004356001600160401b038111610d71576127b390369060040161372e565b906127bc61365c565b6127c46138f1565b6127cc6138d4565b60075460ff811615612b96576001600160401b039060081c168085526008602052604085209060ff600b83015460a81c16612b7c5760018201546000198114159081612b8b575b50612b7c578415612b6d5785526009602090815260408087203360009081529252902054612b5e5761284433613f9a565b61284e8434613940565b938415612b4f578590819482905b828210612b06575050610993612872918761392d565b80612adb575b50906109af6128879233614057565b6001600160401b0360075460081c16918285526008602052604085209183865260096020526040862060018060a01b033316600052602052604060002092856128d26109ff856149e9565b94600d8301895b60198110612aaf5750509060018286600c9594550155600281016128fe8682546137ff565b9055018054858852600a60209081526040808a20838b52909152882080546001600160a01b031916331790556001810191908210610c525755338652600d602052604086206001600160401b0385166001600160401b031982541617905580612968833387614156565b6129b757604080519586526020860192909252908401919091521515606083015233917ff7c5da9d99fd36c3b07e372c4e1f0a85ca1c8857b33f2eace705bf2c04b577e5908060808101610ae7565b338652600b602052604086206001600160401b03815416858103612a4e575b50848752600c602052604087206002820160018201895b60198110612a145750505090670de0b6b3a764000091610b796001610b62610b5c886149e9565b80600180921b881615612a4957612a328b610bbe610baf848861388e565b612a438b610bbe610baf848761388e565b016129ed565b612a43565b612a78575b6001600160401b0385166001600160401b0319825416178155866001820155386129d6565b60028101875b60198110612a8d575050612a53565b80612a9a6001928461388e565b8154906000199060031b1b1916905501612a7e565b60018092939450811b871615612ad657612acc610c83828561388e565b01908892916128d9565b612acc565b81808092335af1612aea613e5e565b5015612af7578438612878565b6312171d8360e31b8552600485fd5b9192509460ff612b1a610ce188868661385a565b166019811015612b40576001901b90818116612b4057889392916001911796019061285c565b63037a804f60e41b8952600489fd5b6365cd08ed60e01b8652600486fd5b63a6ef0ba160e01b8552600485fd5b63634538d760e11b8652600486fd5b633df07da560e01b8652600486fd5b905042101538612813565b633a5f7b5760e01b8552600485fd5b50346103a15760203660031901126103a1576103f2600260406103fe93612bca61369a565b6103208351612bd982826136dc565b3690376001600160a01b03168152600b60205220016137c7565b50346103a157806003193601126103a1576002546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a1576010546040516001600160a01b039091168152602090f35b50346103a15760403660031901126103a1576020906001600160401b03612c6a613646565b168152600a82526040812060243582528252604060018060a01b0391205416604051908152f35b50346103a157806003193601126103a157602060ff600754166040519015158152f35b50346103a157806003193601126103a157602060ff601554166040519015158152f35b50346103a15760203660031901126103a15760409081906001600160a01b03612cfe61369a565b168152600b6020522060016001600160401b0382541691015482519182526020820152f35b50346103a157806003193601126103a157546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a157612d6461369a565b612d6c61389e565b6001600160a01b03168015610751576020817f32a3c8561ee550bc3fb2ef131ed2050d2c560a9e31d7cd782b6debabf53fb3a1926001600160601b0360a01b6012541617601255604051908152a180f35b50346103a157806003193601126103a1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003612e165760206040516000805160206152d88339815191528152f35b63703e46dd60e11b8152600490fd5b5060403660031901126103a157612e3a61369a565b602435906001600160401b03821161129657366023830112156112965781600401359083612e6783613713565b93612e7560405195866136dc565b8385526020850193366024828401011161129657806024602093018637850101526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115613027575b5061301857612ed861389e565b6040516352d1902d60e01b81526001600160a01b0382169390602081600481885afa869181612fe4575b50612f1b57634c9c8ce360e01b86526004859052602486fd5b93846000805160206152d8833981519152879603612fd25750823b15612fc0576000805160206152d883398151915280546001600160a01b031916821790558491907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8380a2805115612fa557612fa19382915190845af4612f9b613e5e565b91614f03565b5080f35b5050505034612fb15780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8552600452602484fd5b632a87526960e21b8652600452602485fd5b9091506020813d602011613010575b81613000602093836136dc565b810103126119f057519038612f02565b3d9150612ff3565b63703e46dd60e11b8452600484fd5b6000805160206152d8833981519152546001600160a01b03161415905038612ecb565b50346103a157806003193601126103a157600f546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a15760043561309061389e565b801515806130f9575b156130c8576005557ffe891c6ab12cf73707f8deb6600c12ba382e4cc31eb2b0a2754cad13075ed2d18180a180f35b60405162461bcd60e51b81526020600482015260096024820152681bda5b0bdc9bdd5b9960ba1b6044820152606490fd5b5068056bc75e2d63100000811115613099565b50346103a157806003193601126103a1576003546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a1576103f2600d60406103fe936001600160401b03613162613646565b610320845161317182826136dc565b369037168152600860205220016137c7565b50346103a157806003193601126103a1576012546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a1576131c6613646565b6131ce61389e565b6001600160401b03811690600382108015613251575b613242576018805467ffffffffffffffff1981169093179055604080516001600160401b0393841681529190921660208201527fd3f9867a279ba2e840059332bc3043f783559cd060e3edd34d4267a92130ab1591819081016121ea565b6309f7299b60e11b8352600483fd5b50603c82116131e4565b50346103a157806003193601126103a1576004546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a1576020600654604051908152f35b50346103a15760203660031901126103a1576111426132bf613646565b6132c76138f1565b3390613960565b50346103a157806003193601126103a15760206001600160401b0360185416604051908152f35b50346103a157806003193601126103a1576020604051603c8152f35b50346103a157806003193601126103a1576000805160206152b8833981519152546001600160a01b0316331415806134ba575b6134ac576133506138d4565b60075460ff811661348a576001546001600160a01b03161561347b576101019068ffffffffffffffffff19161760075560018152600860205260408120428155600160001991015560017f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee604080514281526000196020820152a25b60045481906001600160a01b031680151580613430575b6133ea5750f35b803b1561342d5781809160046040518095819363be9a655560e01b83525af1801561342057613417579050f35b61223a916136dc565b50604051903d90823e3d90fd5b50fd5b50604051631f2698ab60e01b8152602081600481855afa9081156111f257839161345c575b50156133e3565b613475915060203d602011610ff857610fea81836136dc565b38613455565b63063bbf6960e01b8252600482fd5b506004546001600160a01b031633146133cc5763ba26162b60e01b8152600490fd5b6282b42960e81b8152600490fd5b506004546001600160a01b0316331415613344565b50346103a157806003193601126103a1576013546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a157600435801515809103610d715760207f77860e247ab9186dbe64e5bd0e0b93273cc4273e01818420e788f500078886f59161354361389e565b60ff196015541660ff821617601555604051908152a180f35b905034610d71576020366003190112610d715760406101e0926001600160401b03613585613646565b16815260086020522060ff815491600181015460028201546003830154600484015460058501546006860154916007870154936008880154956001600160401b0360098a01541697600c600b8b01549a01549b8d5260208d015260408c015260608b015260808a015260a089015260c088015260e087015261010086015261012085015281811661014085015260018060a01b038160081c16610160850152818160a81c16151561018085015260b01c1615156101a08301526101c0820152f35b600435906001600160401b038216820361088657565b60243590811515820361088657565b91906103208301926000905b6019821061368457505050565b6020806001928551815201930191019091613677565b600435906001600160a01b038216820361088657565b602435906001600160a01b038216820361088657565b604435906001600160a01b038216820361088657565b90601f801991011681019081106001600160401b038211176136fd57604052565b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116136fd57601f01601f191660200190565b9181601f84011215610886578235916001600160401b038311610886576020808501948460051b01011161088657565b6024359060ff8216820361088657565b919082519283825260005b84811061379a575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201613779565b90816020910312610886575180151581036108865790565b60405191906000835b601982106137e9575050506137e7610320836136dc565b565b60016020819285548152019301910190916137d0565b9190820180921161380c57565b634e487b7160e01b600052601160045260246000fd5b9081526001600160a01b03909116602082015260606040820181905261384a9291019061376e565b90565b9190820391821161380c57565b919081101561386a5760051b0190565b634e487b7160e01b600052603260045260246000fd5b3560ff811681036108865790565b601982101561386a570190600090565b6000805160206152b8833981519152546001600160a01b031633036138bf57565b63118cdaa760e01b6000523360045260246000fd5b60ff601554166138e057565b6313d0ff5960e31b60005260046000fd5b60026000805160206152f8833981519152541461391c5760026000805160206152f883398151915255565b633ee5aeb560e01b60005260046000fd5b8181029291811591840414171561380c57565b811561394a570490565b634e487b7160e01b600052601260045260246000fd5b6000916001600160401b0382169182845260086020526040842093600b85019160ff835460a81c1615613e4f5784825260096020526040822060018060a01b03851683526020526040822095600287019182549260ff8416613e40578854938415613e2d57506001830154620151808101809111613e1957421015613dc857908691600160ff19825416179055613a0a85998697549560ff87169485916001831b16151594614491565b9080613dbf575b80613db2575b613c04575b5050600e546001600160a01b0316915050801561100a5785613b96575b82613a7c575b50507f6c43ab65cd0ebdd66d111a711fedd4b61c1eb8c18b791217bead63294658b1c6916040918251958652602086015260018060a01b031693a3565b815460405163095ea7b360e01b60208083019182526001600160a01b0385811660248501526044808501899052845290931692908590613abd6064856136dc565b83519082865af184513d82613b7a575b505015613b36575b5050803b15610d71576040516301fc161f60e01b8152600481018390526001600160a01b0385166024820152604481018490529082908290606490829084905af18015610fff5715613a3f57613b2c8280926136dc565b6103a15780613a3f565b613b7391613b6e60405163095ea7b360e01b602082015285602482015286604482015260448152613b686064826136dc565b82614982565b614982565b3880613ad5565b909150613b8e5750813b15155b3880613acd565b600114613b87565b47808711613bfc575b508515613a395790813b156103a1576040516303539c2d60e11b8152600481018290526001600160a01b038516602482015281816044818a875af18015610fff57613bec575b5090613a39565b81613bf6916136dc565b38613be5565b955038613b9f565b9194909297506064820282810460641483151715613d9e57612710613c2a91048361384d565b92613c52613c3c84600389015461392d565b94613c4c60048901548097613940565b906137ff565b9860ff8160b01c16600014613ca9575050506006613c7d83613c7884600589015461392d565b613940565b945b015480613c8d575b80613a1c565b91613c78613c4c92613ca095969461392d565b90388080613c87565b91959160081c6001600160a01b031663506f6f6c8103613d7857506001600160a01b0387168552600b6020526040852080546001600160401b0316891480613d5c575b613cfb575b5050600690613c7f565b888652600c602052613d13826001604089200161388e565b90549060031b1c9182613d27575b50613cf1565b839750613d539291613d46613c7892600260056006980154930161388e565b90549060031b1c9061392d565b94903880613d21565b50613d6a826002830161388e565b90549060031b1c1515613cec565b6001600160a01b038816149050613d92575b600690613c7f565b60058101549450613d8a565b634e487b7160e01b85526011600452602485fd5b5060048301541515613a17565b50801515613a11565b805460ff1916600117905550506040805183815260208101939093526001600160a01b0390941695507f6c43ab65cd0ebdd66d111a711fedd4b61c1eb8c18b791217bead63294658b1c693925050a3565b634e487b7160e01b86526011600452602486fd5b60ff191660011790555050505050505050565b63cdda955f60e01b8552600485fd5b632382430560e11b8252600482fd5b3d15613e89573d90613e6f82613713565b91613e7d60405193846136dc565b82523d6000602084013e565b606090565b6001600160a01b0381166000908152600d60205260409020546001600160401b03169081158015613f15575b613f1157816000526009602052604060002060018060a01b03821660005260205260ff60026040600020015416613f115781600052600860205260ff600b6040600020015460a81c1615613f11576137e791613960565b5050565b506001600160401b0360075460081c168214613eba565b60008051602061533883398151915280546001600160a01b03199081169091556000805160206152b883398151915280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6001600160a01b0381166000908152600d60205260409020546001600160401b031680158015614040575b613f1157806000526009602052604060002060018060a01b03831660005260205260026040600020019060ff82541661403b5780600052600860205260ff600b6040600020015460a81c161561402a5760ff9261402191613960565b54161561402a57565b630b265c0360e11b60005260046000fd5b505050565b506001600160401b0360075460081c168114613fc5565b600f546000926001600160a01b039091169182156140e5576001600160a01b0316808452600d60205260408420546001600160401b0316151592803b156119f45784929183606492604051968795869463032cd31f60e21b8652600486015260018060a01b0316602485015260448401525af18015610fff576140d8575050565b816140e2916136dc565b50565b632f6840b560e21b8452600484fd5b6001810190600019825403613f1157429055603c42019081421161380c578190557f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee60406001600160401b0360075460081c16928151904282526020820152a2565b919060005b601981106141695750505050565b6001811b831615614204576001600160401b038416600081815260176020908152604080832060ff861680855290835281842054858552601684528285208286528452828520818652909352922080546001600160a01b0319166001600160a01b0387161790559092916001820191821061380c5760019360409160005260176020528160002060ff60009216825260205220555b0161415b565b6001906141fe565b9190826040910312610886576020825192015190565b61422a6138d4565b6007549160009260ff811615614482576001600160401b039060081c168352600860205260408320906001820154600019811461447357601e8101809111613d9e574210611eed57600b82019060ff825460a81c16614464576001600160401b03600984015416156144565760018060a01b036001541660088401948554823b156144525791839188606481956040519788968795869363243098b960e11b8552600485015260406024850152816044850152848401378181018301849052601f01601f191681010301925af1801561444757614433575b50604060018060a01b0360015416935460248251809681936302d8ca0160e11b835260048301525afa801561442857849385916143f3575b50156143e45782600783015560028201541561436a57506137e792506001600160401b0360075460081c16614576565b915050600160a81b60ff60a81b198254161790557fa84e5f0d04242e721adff2076b30ca115b444d9d3c51feb5398572df1be3269a60e06001600160401b0360075460081c1692604051908082528060208301528060408301528060608301528060808301528060a083015260c0820152a26137e76144de565b6338c52e6760e21b8452600484fd5b905061441891935060403d604011614421575b61441081836136dc565b81019061420c565b9290923861433a565b503d614406565b6040513d86823e3d90fd5b84614440919592956136dc565b9238614302565b6040513d87823e3d90fd5b8780fd5b6294861760e21b8552600485fd5b6308d4975360e11b8552600485fd5b636218b96960e11b8552600485fd5b633a5f7b5760e01b8452600484fd5b6001600160401b0316600052601460205260406000209060018060a01b031660005260205260ff6040600020911660005260205260406000205490816144da5760019150015490565b5090565b60075460016001600160401b038260081c1601906001600160401b03821161380c5768ffffffffffffffff006001600160401b0383169260081b169068ffffffffffffffff00191617600755806000526008602052604060002042815560016000199101557f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee604080514281526000196020820152a2565b600b8201805460ff60ff60a81b01191660ff6019860616908117600160a81b17825560028401549094600091906145b087600d880161388e565b90549060031b1c9384600488015584156148e4578495966145cf614a88565b949b6145e09194939298969a61384d565b906145eb908261392d565b61271090046145fb81988361392d565b61271090049461460c86958461392d565b61271090049561461d87928561392d565b612710900493849361462e9161384d565b906146389161384d565b906146429161384d565b9061464c9161384d565b936003870197885580614879575b509161467291836146779594614869575b5050614ced565b614a1a565b60648802888104606403614855579260e09895926001600160401b039895926127107fa84e5f0d04242e721adff2076b30ca115b444d9d3c51feb5398572df1be3269a9c99960480614846575b5061471c614717600161ffff8760301c1661ffff8860201c1661ffff8960101c1661ffff8a16181818161598835460ff60b01b8b60b01b169060ff60b01b19161784556147118830614f64565b97613940565b614d43565b84600583015561472d888a86614da7565b969080614833575b508660068401558d8982968a15614786575b50505050505054906040519a8b5260018060a01b031660208b015260408a01526060890152608088015260a087015260c08601521692a26137e76144de565b8394959750906147a191600a93945060801c0680938d614e36565b9501556001600160a01b03841690816147e1575b50508054610100600160a81b031916600884901b610100600160a81b03161790553880808d8982614747565b6040918152600b602052208c8a8254168b8b16149182614816575b505061480a575b38806147b5565b63506f6f6c9250614803565b614823925060020161388e565b90549060031b1c15158c386147fc565b61483e9085546137ff565b845538614735565b61484f90614a1a565b386146c4565b634e487b7160e01b87526011600452602487fd5b61487291614cbd565b388061466b565b6002546001600160a01b0316803b156148e0578b9060246040518094819363207d7d8d60e21b8352600160048401525af180156148d5571561465a57918a6148ca6146779695939c614672956136dc565b9a919394509161465a565b6040513d8d823e3d90fd5b8b80fd5b50507fa84e5f0d04242e721adff2076b30ca115b444d9d3c51feb5398572df1be3269a94506001600160401b0392509061492060e09492614a1a565b6040519586528060208701528060408701528060608701528060808701528060a087015260c08601521692a26137e76144de565b60ff6000805160206153188339815191525460401c161561497157565b631afcd79f60e31b60005260046000fd5b906000602091828151910182855af1156149dd576000513d6149d457506001600160a01b0381163b155b6149b35750565b635274afe760e01b60009081526001600160a01b0391909116600452602490fd5b600114156149ac565b6040513d6000823e3d90fd5b9060009160005b601981106149fc575050565b6001811b8216614a0f575b6001016149f0565b600190930192614a07565b6000908015613f11576012546001600160a01b03168015614a795747808311614a71575b50811561403b57803b15611296578290600460405180948193637f4433a760e01b83525af18015610fff576140d8575050565b915038614a3e565b6318bf7cc760e21b8352600483fd5b6011546001600160a01b031680614ac85750600554906006549073b01322f50580743906047dc0b44325d9b2fff89690612328906101f49060c890606490565b60405163f917238d60e01b8152602081600481855afa9081156149dd57600091614c8b575b50604051637693b3b360e01b815292602084600481865afa9384156149dd57600094614c57575b506040516318c0d45b60e21b815292602084600481845afa9384156149dd57600094614c10575b5060a0600491604051928380926321beffc160e11b82525afa9081156149dd57600091614b81575b50805192602082015192606060408401519301519196959493929190565b60a0813d60a011614c08575b81614b9a60a093836136dc565b81010312610d71576040519160a08301908382106001600160401b03831117614bf4575090608091604052805183526020810151602084015260408101516040840152606081015160608401520151608082015238614b63565b634e487b7160e01b81526041600452602490fd5b3d9150614b8d565b6020949194813d602011614c4f575b81614c2c602093836136dc565b81010312610d715751906001600160a01b03821682036103a157509260a0614b3b565b3d9150614c1f565b9093506020813d602011614c83575b81614c73602093836136dc565b8101031261088657519238614b14565b3d9150614c66565b90506020813d602011614cb5575b81614ca6602093836136dc565b81010312610886575138614aed565b3d9150614c99565b8115613f1157600080809381935af1614cd4613e5e565b5015614cdc57565b6312171d8360e31b60005260046000fd5b6000908015613f11576003546001600160a01b03168015614d3457803b15611296578290600460405180948193633d9dd07760e01b83525af18015610fff576140d8575050565b63d92e233d60e01b8352600483fd5b6000908015613f11576012546001600160a01b0316908115614a7957614d69908261513a565b80614d7357505050565b813b15611296578291602483926040519485938492631f3fed5760e01b845260048401525af18015610fff576140d8575050565b601254919290916001600160a01b0316908115614e2a5760409260006001600160401b0396959360649386519889968795634ef59d6d60e11b8752600487015216602485015260448401525af19182156149dd57600090600093614e0a57509190565b9050614e2691925060403d6040116144215761441081836136dc565b9091565b50505050600090600090565b9190916000916001600160401b03821691826000526017602052604060002060ff8616600052602052604060002054946000945b868610614e7d5750505050505050600090565b600085815260166020908152604080832060ff861684528252808320898452825280832054888452600983528184206001600160a01b039091168085529252909120614ed590614ecf90858488614491565b836137ff565b9185101580614efa575b614eef5750600190950194614e6a565b965050505050505090565b50818510614edf565b90614f295750805115614f1857805190602001fd5b63d6bda27560e01b60005260046000fd5b81511580614f5b575b614f3a575090565b639996b31560e01b60009081526001600160a01b0391909116600452602490fd5b50803b15614f32565b9190600081158015615129575b6151245780546040516318160ddd60e01b81526001600160a01b039091169290602081600481875afa9081156111f25783916150f2575b50604051630cb2dac360e21b815290602082600481885afa80156144285784906150bc575b614fd7925061384d565b9081156150b457818111156150ac5750915b829483614ff7575b50505050565b813b15611296576040516340c10f1960e01b81526001600160a01b03919091166004820152602481018490529082908290604490829084905af18015610fff5761509c575b509060018060a01b03601054169081615056575b80614ff1565b813b156112965782916024839260405194859384926359f86e1160e01b845260048401525af1615087575b80615050565b6150928280926136dc565b6103a15780615081565b816150a6916136dc565b3861503c565b905091614fe9565b509093505050565b50906020813d6020116150ea575b816150d7602093836136dc565b8101031261249e5790614fd79151614fcd565b3d91506150ca565b90506020813d60201161511c575b8161510d602093836136dc565b81010312611296575138614fa8565b3d9150615100565b925050565b506001600160a01b03841615614f71565b9190600090801580156152a6575b6152a15781546040516318160ddd60e01b81526001600160a01b039091169190602081600481865afa90811561442857849161526f575b50604051630cb2dac360e21b815290602082600481875afa8015614447578590615239575b6151ae925061384d565b90811561523157818111156152295750905b8194826151cd5750505050565b813b1561249e576040516340c10f1960e01b81526001600160a01b03919091166004820152602481019290925282908290604490829084905af18015610fff57615219575b8080614ff1565b81615223916136dc565b38615212565b9050906151c0565b509193505050565b50906020813d602011615267575b81615254602093836136dc565b810103126119f457906151ae91516151a4565b3d9150615247565b90506020813d602011615299575b8161528a602093836136dc565b8101031261249e57513861517f565b3d915061527d565b509150565b506001600160a01b0384161561514856fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a2646970667358221220e811e7a1712baec1698dda191e23c51741e274241f3fe8d7fd80765e5c34b3f764736f6c634300081c0033
0x60a080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c908163144d02291461355c5750806316c38b3c146134f85780631986af00146134cf57806324294b1f1461331157806324ca63c2146132f557806324cd460c146132ce5780632d588b18146132a25780632f6a106d146132845780633570dac61461325b5780634187c6c8146131ac57806347fadcb61461318357806349c36ca1146131355780634cf088d91461310c5780634d828652146130735780634e627e621461304a5780634f1ef28614612e2557806352d1902d14612dbd578063551f730314612d4a578063556fe77514612d23578063590674ed14612cd75780635c975abb14612cb45780635e123ce414612c915780635eed82b3146120bd57806360a8eb6214612c45578063619f3d6c14612c1c57806361d027b314612bf357806362857afd14612ba557806363f9cc05146127875780636623a0aa1461272b5780636727299914612637578063685384c0146125f85780636a79115f146125855780636c2a5d4e14612569578063715018a6146124e8578063736518711461233a578063747dff421461225057806379ba5097146121ff5780637e1dee161461213a5780637e930866146120bd57806382d5e1d41461209f5780638da5cb5b146120695780638ff3909914612022578063910decc314611faf5780639cbe5efd14611f855780639ec5a89414611f5c578063a080a88a14611f0b578063a0dfb90214611ccd578063ad3cb1cc14611c84578063ae4b7cbc14611c3d578063affac9e014611bc8578063b15fbc1414611b55578063bc3ac87514611a5b578063bfcbc43b146119f8578063c697f1a21461139a578063c7028f4214611327578063c8993c99146112e0578063cce7aa5f146112c3578063ce9bf5ac1461129a578063d0322fbf14611235578063d1058e5914611093578063d31c5b3b14611019578063dd1f9a5d14610f19578063dfedce3114610ef0578063e30c397814610eba578063e319416d14610dad578063e6f1df0614610d75578063e75fe5411461089f578063e77944eb146107fd578063eaf2bf0a146107d3578063ec38a86214610760578063f0f442601461070a578063f2fde38b14610682578063f8c8765e14610402578063f96e3ac5146103a45763fa397d620361000f57346103a15760203660031901126103a1576020906001600160401b03906040906001600160a01b0361038f61369a565b168152600d8452205416604051908152f35b80fd5b50346103a15760203660031901126103a1576103f2600160406103fe936001600160401b036103d1613646565b61032084516103e082826136dc565b369037168152600c60205220016137c7565b6040519182918261366b565b0390f35b50346103a15760803660031901126103a15761041c61369a565b6104246136b0565b61042c6136c6565b906064356001600160a01b0381169081810361067e57600080516020615318833981519152549460ff8660401c1615956001600160401b03811680159081610676575b600114908161066c575b159081610663575b506106545767ffffffffffffffff1981166001176000805160206153188339815191525586610627575b506001600160a01b03169182158015610616575b8015610605575b80156105fd575b6105ee576104d9614954565b6104e1614954565b156105da576104ef90613f2c565b6104f7614954565b6104ff614954565b610507614954565b60016000805160206152f883398151915255610521614954565b6001600160601b0360a01b85541617845560018060a01b03166001600160601b0360a01b600154161760015560018060a01b03166001600160601b0360a01b6002541617600255673782dace9d90000060055560046006556105805780f35b68ff0000000000000000196000805160206153188339815191525416600080516020615318833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b631e4fbdf760e01b86526004869052602486fd5b63d92e233d60e01b8752600487fd5b5080156104cd565b506001600160a01b038516156104c6565b506001600160a01b038416156104bf565b68ffffffffffffffffff1916680100000000000000011760008051602061531883398151915255386104ab565b63f92ee8a960e01b8852600488fd5b90501538610481565b303b159150610479565b88915061046f565b8580fd5b50346103a15760203660031901126103a15761069c61369a565b6106a461389e565b60008051602061533883398151915280546001600160a01b0319166001600160a01b039283169081179091556000805160206152b8833981519152549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346103a15760203660031901126103a15761072461369a565b61072c61389e565b6001600160a01b03168015610751576001600160601b0360a01b600254161760025580f35b63d92e233d60e01b8252600482fd5b50346103a15760203660031901126103a15761077a61369a565b61078261389e565b6001600160a01b03168015610751576020817f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf926001600160601b0360a01b600e541617600e55604051908152a180f35b50346103a157806003193601126103a15760206001600160401b0360185460401c16604051908152f35b50346103a157806003193601126103a1576012546001600160a01b0316908161082d57602091505b604051908152f35b60206004926040519384809263e40d9d6360e01b82525afa908115610893579061085b575b60209150610825565b506020813d60201161088b575b81610875602093836136dc565b810103126108865760209051610852565b600080fd5b3d9150610868565b604051903d90823e3d90fd5b5060603660031901126103a1576004356001600160401b038111610d71576108cb90369060040161372e565b906108d461365c565b6108dc6136c6565b6108e46138f1565b6108ec6138d4565b60075460ff811615610d62576001600160401b039060081c16908186526008602052604086209160ff600b84015460a81c16610d485760018301546000198114159081610d57575b50610d48578515610d395786526009602090815260408088203360009081529252902054610d2a5761096533613f9a565b61096f8534613940565b948515610d1b578690819582905b828210610ccd575050610993610999918861392d565b3461384d565b80610ca2575b5050906109af6109b49233614057565b6140f4565b6001600160401b0360075460081c16918285526008602052604085209183865260096020526040862060018060a01b03331660005260205260406000209285610a056109ff856149e9565b8261392d565b94600d8301895b60198110610c665750509060018286600c959455015560028101610a318682546137ff565b9055018054858852600a60209081526040808a20838b52909152882080546001600160a01b031916331790556001810191908210610c525755338652600d602052604086206001600160401b0385166001600160401b031982541617905580610a9b833387614156565b610aff575b604080519586526020860192909252908401919091521515606083015233917ff7c5da9d99fd36c3b07e372c4e1f0a85ca1c8857b33f2eace705bf2c04b577e59080608081015b0390a360016000805160206152f88339815191525580f35b338652600b602052604086206001600160401b03815416858103610bf1575b50848752600c602052604087206002820160018201895b60198110610b915750505090670de0b6b3a764000091610b796001610b62610b5c886149e9565b8b61392d565b930192610b708185546137ff565b845582546137ff565b9055541115610aa05763053be18f60e21b8652600486fd5b80600180921b881615610bec57610bd58b610bbe610baf848861388e565b91909283548360031b1c6137ff565b825460001960039390931b92831b1916911b179055565b610be68b610bbe610baf848761388e565b01610b35565b610be6565b610c1b575b6001600160401b0385166001600160401b031982541617815586600182015538610b1e565b60028101875b60198110610c30575050610bf6565b80610c3d6001928461388e565b8154906000199060031b1b1916905501610c21565b634e487b7160e01b88526011600452602488fd5b60018092939450811b871615610c9d57610c93610c83828561388e565b610bbe8d83548360031b1c6137ff565b0190889291610a0c565b610c93565b81808092335af1610cb1613e5e565b5015610cbe57853861099f565b6312171d8360e31b8652600486fd5b9192509560ff610ce6610ce189868661385a565b613880565b166019811015610d0c576001901b90818116610d0c57899392916001911797019061097d565b63037a804f60e41b8a5260048afd5b6365cd08ed60e01b8752600487fd5b63a6ef0ba160e01b8652600486fd5b63634538d760e11b8752600487fd5b633df07da560e01b8752600487fd5b905042101538610934565b633a5f7b5760e01b8652600486fd5b5080fd5b50346103a15760203660031901126103a15760406020916001600160401b03610d9c613646565b168152600c83522054604051908152f35b50346103a15760203660031901126103a157610dc761369a565b610dcf6138f1565b6013546001600160a01b03163303610eac576001600160a01b0381161561075157610df981613e8e565b600e546001600160a01b0316908115610e9d5760405163deb9bc2d60e01b81526001600160a01b0391909116600482015233602482015291906020908390604490829085905af19081156108935790610e6a575b60209060016000805160206152f883398151915255604051908152f35b506020813d602011610e95575b81610e84602093836136dc565b810103126108865760209051610e4d565b3d9150610e77565b63132fb52160e11b8352600483fd5b6282b42960e81b8252600482fd5b50346103a157806003193601126103a157600080516020615338833981519152546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a1576011546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a157610f326138f1565b610f3b33613e8e565b600e546001600160a01b0316801561100a57602082916024604051809481936312cb9acb60e01b83523360048401525af1908115610fff578291610fd0575b5015610fc1576040518181527fc8fa3f4f31ec36ca84867c76bbc8474396b24252f1721e29a887d503f786e5b860203392a260016000805160206152f88339815191525580f35b6312d37ee560e31b8152600490fd5b610ff2915060203d602011610ff8575b610fea81836136dc565b8101906137af565b38610f7a565b503d610fe0565b6040513d84823e3d90fd5b63132fb52160e11b8252600482fd5b50346103a15760203660031901126103a15760043561103661389e565b8015611066576006557ffe891c6ab12cf73707f8deb6600c12ba382e4cc31eb2b0a2754cad13075ed2d18180a180f35b60405162461bcd60e51b815260206004820152600560248201526464656e6f6d60d81b6044820152606490fd5b50346103a157806003193601126103a1576110ac6138f1565b6110b533613e8e565b600e546001600160a01b0316801561100a5760405163deb9bc2d60e01b815233600482018190526024820152829160208260448186855af19182156111f25783926111fd575b506020906024604051809581936312cb9acb60e01b83523360048401525af19182156111f25783926111d1575b50801580806111c9575b6111ba5715611188575b50611157575b60016000805160206152f88339815191525580f35b6040518181527fc8fa3f4f31ec36ca84867c76bbc8474396b24252f1721e29a887d503f786e5b860203392a2611142565b6040519081527f9f413f0f451c24edeec8f50838056a8d47c9d8ea0226e5a536392f677a310ad560203392a23861113c565b6312d37ee560e31b8452600484fd5b508215611132565b6111eb91925060203d602011610ff857610fea81836136dc565b9038611128565b6040513d85823e3d90fd5b925090506020823d60201161122d575b8161121a602093836136dc565b81010312610886579051829160206110fb565b3d915061120d565b50346103a15760203660031901126103a1576004356001600160401b038111610d715736602382011215610d715780600401356001600160401b038111611296573660248284010111611296576024611142926112906138f1565b01614222565b8280fd5b50346103a157806003193601126103a1576001546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a157602060405161012c8152f35b50346103a15760203660031901126103a1576112fa61369a565b61130261389e565b6001600160a01b03168015610751576001600160601b0360a01b600454161760045580f35b50346103a15760203660031901126103a15761134161369a565b61134961389e565b6001600160a01b03168015610751576020817f09d2adccc5cfc22875926867a6b8609d445ef46c79d9417dee17fded145da700926001600160601b0360a01b6013541617601355604051908152a180f35b5060803660031901126103a1576113af61369a565b6024356001600160401b038111611296576113ce90369060040161372e565b6044929192356001600160401b0381116119f4576113f090369060040161372e565b92906064359081151582036119f0576114076138f1565b61140f6138d4565b6013546001600160a01b031633036119e2576001600160a01b038316156105ee5760075460ff8116156119d357841580156119c9575b6119ba576001600160401b039060081c16948588526008602052604088209560ff600b88015460a81c166119a057600187015460001981141590816119af575b506119a05788526009602052604080892060009060018060a01b03871682526020522090815461199157889789968a5b8181106119235750893403611914578580611903575b6118f4576114d887613f9a565b600f546001600160a01b031680156118e5576001600160a01b0388168c52600d60205260408c20548c91906001600160401b03161515813b1561129657829060648b83604051958694859363032cd31f60e21b855260018060a01b0316600485015282602485015260448401525af18015610fff576118cc575b505061155d896140f4565b6001600160401b0360075460081c169883156118b8576001948c858a828e5b8b888a81881061182e57505050505050505090818a600c93558d87600014611825575060018835915b0155600281016115b68d82546137ff565b9055018054908a8d52600a6020528c8260408220915260205260408d2060018060a01b038a166001600160601b0360a01b8254161790556001820180921161181157556001600160a01b0387168b52600d60205260408b20805467ffffffffffffffff19166001600160401b038b161790558561163489898c614156565b6116a8575b50505091610ae7917ff7c5da9d99fd36c3b07e372c4e1f0a85ca1c8857b33f2eace705bf2c04b577e59594936000146116a15735965b6040805198895260208901959095529387019390935291151560608601526001600160a01b0316939081906080820190565b508661166f565b6001600160a01b0387168b52600b60205260408b2080549091906001600160401b03168a81036117b0575b5092898c52600c60205260408c20928c948d926002850160805260018601915b8981861061173e575050505050509061171f6001670de0b6b3a764000094930192610b708185546137ff565b9055541161172f57388080611639565b63053be18f60e21b8852600488fd5b6117a59086996117a06117906117698a88611763610ce18d9e8b60019c9d9e9f61385a565b9661385a565b359361178a61177a8260805161388e565b610bbe8883548360031b1c6137ff565b8961388e565b610bbe8583548360031b1c6137ff565b6137ff565b9701939291906116f3565b6117da575b6001600160401b038a166001600160401b03198354161782558b6001830155386116d3565b600282018c5b601981106117ef5750506117b5565b806117fc6001928461388e565b8154906000199060031b1b19169055016117e0565b634e487b7160e01b8d52601160045260248dfd5b600190916115a5565b604094600d9794611876611866889661185c8f9b976118548f9182610ce1918d9b61385a565b9a8b9361385a565b359b8c9b0161388e565b610bbe8b83548360031b1c6137ff565b815260146020522060009160018060a01b031682526020522060ff60009216825260205220558835036118b0575b600101858a8f8e61157c565b8d96506118a4565b634e487b7160e01b8c52603260045260248cfd5b816118d6916136dc565b6118e1578a38611552565b8a80fd5b632f6840b560e21b8c5260048cfd5b63053be18f60e21b8b5260048bfd5b50670de0b6b3a76400008a116114cb565b63589d001160e11b8b5260048bfd5b999760ff611935610ce18d858761385a565b166019811015611982576001901b908181166119825717976119588b858861385a565b359081156119735760019161196c916137ff565b9a016114b5565b6365cd08ed60e01b8d5260048dfd5b63037a804f60e41b8d5260048dfd5b63a6ef0ba160e01b8952600489fd5b633df07da560e01b8952600489fd5b905042101538611485565b6331c8778360e21b8852600488fd5b5085851415611445565b633a5f7b5760e01b8852600488fd5b6282b42960e81b8752600487fd5b8680fd5b8480fd5b50346103a15760603660031901126103a157602090611a15613646565b6001600160401b03611a2561375e565b911682526016835260ff6040832091166000528252604060002060443582528252604060018060a01b0391205416604051908152f35b50346103a15760203660031901126103a1576040610200916001600160401b03611a83613646565b16815260086020522080549060ff600182015491600281015460038201546004830154600584015460068501546007860154916008870154936001600160401b0360098901541695600a89015497600c600b8b01549a01549b60206040519e8f908152015260408d015260608c015260808b015260a08a015260c089015260e088015261010087015261012086015261014085015281811661016085015260018060a01b038160081c16610180850152818160a81c1615156101a085015260b01c1615156101c08301526101e0820152f35b50346103a15760203660031901126103a157611b6f61369a565b611b7761389e565b6001600160a01b03168015610751576020817f87b050f471f7331bfd8fc9347cd54894f2ae6663e3339e49ca0d8b2dbe792eb2926001600160601b0360a01b6001541617600155604051908152a180f35b50346103a15760603660031901126103a157611be2613646565b90611beb6136b0565b906044359260ff84168403610d7157906001600160401b036040921681526014602052209060018060a01b031660005260205260ff604060002091166000526020526020604060002054604051908152f35b50346103a15760203660031901126103a157611c5761369a565b611c5f61389e565b6001600160a01b03168015610751576001600160601b0360a01b601054161760105580f35b50346103a157806003193601126103a157506103fe604051611ca76040826136dc565b60058152640352e302e360dc1b602082015260405191829160208352602083019061376e565b50346103a157806003193601126103a157611ce66138f1565b611cee6138d4565b60075460ff811615611efc576001600160401b039060081c16808252600860205260408220906001820154916000198314611eed5760ff600b82015460a81c16611ede5760098101916001600160401b03835416611ecf576001600160401b0360185460401c168015159081611ebc575b50611ead57928492826008956002611dcd9501546040519060208201923084526040830152606082015260608152611d986080826136dc565b51902095869101556001600160401b03804216166001600160401b03198254161790556001600160401b0360185416906137ff565b42811115611ea657611de090429061384d565b60018060a01b036001541660405191602083015260208252611e036040836136dc565b803b156112965760405163c2fc530160e01b81529183918391829084908290611e3190308b60048501613822565b03925af18015610fff57611e91575b50507fc7449912a6ba2079a6fdd0a6bce7d912a3b15cb76113cc9f0e9bd4eae730d75060206001600160401b0360075460081c1692604051908152a260016000805160206152f88339815191525580f35b81611e9b916136dc565b610d71578138611e40565b5080611de0565b6301fe570560e51b8552600485fd5b611ec791508561384d565b421038611d5f565b632981f6c160e11b8552600485fd5b6308d4975360e11b8452600484fd5b636218b96960e11b8452600484fd5b633a5f7b5760e01b8252600482fd5b50346103a15760403660031901126103a15760ff6040611f29613646565b926001600160401b03611f3a61375e565b9416815260176020522091166000526020526020604060002054604051908152f35b50346103a157806003193601126103a157600e546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a15760206001600160401b0360075460081c16604051908152f35b50346103a15760203660031901126103a157611fc961369a565b611fd161389e565b6001600160a01b03168015610751576020817f90e159f0f121f20aec23ca7ba722e583c10bcfc550e4b5bed5a1bf1b9c2d1bae926001600160601b0360a01b6011541617601155604051908152a180f35b50346103a15760203660031901126103a15761203c61369a565b61204461389e565b6001600160a01b03168015610751576001600160601b0360a01b600354161760035580f35b50346103a157806003193601126103a1576000805160206152b8833981519152546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a1576020600554604051908152f35b50346103a15760403660031901126103a157604090816120db613646565b916001600160401b036120ec6136b0565b9316815260096020522060009160018060a01b031682526020522080546103fe60ff600260018501549401541660405193849384919260409194936060840195845260208401521515910152565b50346103a15760203660031901126103a157612154613646565b61215c61389e565b603c6001600160401b038216116121f0576001600160401b037f0d282a021a2e883a9f8db89187f76ab54828e887beb610a5a5e46af488b64f7e916121ea6018549167ffffffffffffffff60401b8160401b1667ffffffffffffffff60401b1984161760185560405193849360401c16839092916001600160401b0360209181604085019616845216910152565b0390a180f35b63162908e360e11b8252600482fd5b50346103a157806003193601126103a15760008051602061533883398151915254336001600160a01b039091160361223d5761223a33613f2c565b80f35b63118cdaa760e01b815233600452602490fd5b50346103a157806003193601126103a1578060c09150600754906001600160401b038260081c169182825260086020526040822091825460018401549060028501549260001983149081159182612330575b1561231d5760ff90955b16958661230a575b5085612302575b50846122f6575b846122eb575b6040519586526020860152604085015260608401526080830152151560a0820152f35b9350804210936122c8565b809450421015936122c2565b9450386122bb565b600b015460a81c60ff16159550386122b4565b5060ff61232a428561384d565b956122ac565b50834210156122a2565b50346103a157806003193601126103a1576123536138f1565b61235b6138d4565b60075460ff811615611efc576001600160401b039060081c16815260086020526040812060ff600b82015460a81c1680156124d3575b6124c557600981016001600160401b0381541661012c81018091116124b15742106124a2576001600160401b03804216166001600160401b031982541617905581600860018060a01b03600154169201918254604051836020820152602081526123fc6040826136dc565b823b1561249e576124289284928360405180968195829463c2fc530160e01b8452309060048501613822565b03925af18015610fff57612489575b50507f09e42ed9ea3d4e067e0c2ab62128104f75bdba0cea869df01b3d7071f51b650b60206001600160401b0360075460081c169254604051908152a260016000805160206152f88339815191525580f35b81612493916136dc565b610d71578138612437565b8380fd5b630d609bfb60e01b8352600483fd5b634e487b7160e01b84526011600452602484fd5b6294861760e21b8252600482fd5b506001600160401b0360098201541615612391565b50346103a157806003193601126103a15761250161389e565b60008051602061533883398151915280546001600160a01b03199081169091556000805160206152b88339815191528054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50346103a157806003193601126103a157602060405160038152f35b50346103a15760203660031901126103a15761259f61369a565b6125a761389e565b6001600160a01b03168015610751576020817f9d4414af8d61d821c1ad25f0aadfa28aa386c452716a31fc1f7fdbd9b9d364dc926001600160601b0360a01b600f541617600f55604051908152a180f35b50346103a15760403660031901126103a15761261261369a565b602435906001600160401b038216820361129657611142916126326138f1565b613960565b50346103a157806003193601126103a1576126506138f1565b61265933613e8e565b600e546001600160a01b0316801561100a5760405163deb9bc2d60e01b815233600482018190526024820152906020908290604490829086905af1908115610fff5782916126f9575b5080156126ea576040519081527f9f413f0f451c24edeec8f50838056a8d47c9d8ea0226e5a536392f677a310ad560203392a260016000805160206152f88339815191525580f35b6312d37ee560e31b8252600482fd5b90506020813d602011612723575b81612714602093836136dc565b810103126108865751386126a2565b3d9150612707565b50346103a157806003193601126103a1576012546001600160a01b0316908161275a5760209150604051908152f35b602060049260405193848092633c599ce960e21b82525afa908115610893579061085b5760209150610825565b5060403660031901126103a1576004356001600160401b038111610d71576127b390369060040161372e565b906127bc61365c565b6127c46138f1565b6127cc6138d4565b60075460ff811615612b96576001600160401b039060081c168085526008602052604085209060ff600b83015460a81c16612b7c5760018201546000198114159081612b8b575b50612b7c578415612b6d5785526009602090815260408087203360009081529252902054612b5e5761284433613f9a565b61284e8434613940565b938415612b4f578590819482905b828210612b06575050610993612872918761392d565b80612adb575b50906109af6128879233614057565b6001600160401b0360075460081c16918285526008602052604085209183865260096020526040862060018060a01b033316600052602052604060002092856128d26109ff856149e9565b94600d8301895b60198110612aaf5750509060018286600c9594550155600281016128fe8682546137ff565b9055018054858852600a60209081526040808a20838b52909152882080546001600160a01b031916331790556001810191908210610c525755338652600d602052604086206001600160401b0385166001600160401b031982541617905580612968833387614156565b6129b757604080519586526020860192909252908401919091521515606083015233917ff7c5da9d99fd36c3b07e372c4e1f0a85ca1c8857b33f2eace705bf2c04b577e5908060808101610ae7565b338652600b602052604086206001600160401b03815416858103612a4e575b50848752600c602052604087206002820160018201895b60198110612a145750505090670de0b6b3a764000091610b796001610b62610b5c886149e9565b80600180921b881615612a4957612a328b610bbe610baf848861388e565b612a438b610bbe610baf848761388e565b016129ed565b612a43565b612a78575b6001600160401b0385166001600160401b0319825416178155866001820155386129d6565b60028101875b60198110612a8d575050612a53565b80612a9a6001928461388e565b8154906000199060031b1b1916905501612a7e565b60018092939450811b871615612ad657612acc610c83828561388e565b01908892916128d9565b612acc565b81808092335af1612aea613e5e565b5015612af7578438612878565b6312171d8360e31b8552600485fd5b9192509460ff612b1a610ce188868661385a565b166019811015612b40576001901b90818116612b4057889392916001911796019061285c565b63037a804f60e41b8952600489fd5b6365cd08ed60e01b8652600486fd5b63a6ef0ba160e01b8552600485fd5b63634538d760e11b8652600486fd5b633df07da560e01b8652600486fd5b905042101538612813565b633a5f7b5760e01b8552600485fd5b50346103a15760203660031901126103a1576103f2600260406103fe93612bca61369a565b6103208351612bd982826136dc565b3690376001600160a01b03168152600b60205220016137c7565b50346103a157806003193601126103a1576002546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a1576010546040516001600160a01b039091168152602090f35b50346103a15760403660031901126103a1576020906001600160401b03612c6a613646565b168152600a82526040812060243582528252604060018060a01b0391205416604051908152f35b50346103a157806003193601126103a157602060ff600754166040519015158152f35b50346103a157806003193601126103a157602060ff601554166040519015158152f35b50346103a15760203660031901126103a15760409081906001600160a01b03612cfe61369a565b168152600b6020522060016001600160401b0382541691015482519182526020820152f35b50346103a157806003193601126103a157546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a157612d6461369a565b612d6c61389e565b6001600160a01b03168015610751576020817f32a3c8561ee550bc3fb2ef131ed2050d2c560a9e31d7cd782b6debabf53fb3a1926001600160601b0360a01b6012541617601255604051908152a180f35b50346103a157806003193601126103a1577f0000000000000000000000006e283039979fb866ccbfa73dbe2c8cf743cedbdc6001600160a01b03163003612e165760206040516000805160206152d88339815191528152f35b63703e46dd60e11b8152600490fd5b5060403660031901126103a157612e3a61369a565b602435906001600160401b03821161129657366023830112156112965781600401359083612e6783613713565b93612e7560405195866136dc565b8385526020850193366024828401011161129657806024602093018637850101526001600160a01b037f0000000000000000000000006e283039979fb866ccbfa73dbe2c8cf743cedbdc16308114908115613027575b5061301857612ed861389e565b6040516352d1902d60e01b81526001600160a01b0382169390602081600481885afa869181612fe4575b50612f1b57634c9c8ce360e01b86526004859052602486fd5b93846000805160206152d8833981519152879603612fd25750823b15612fc0576000805160206152d883398151915280546001600160a01b031916821790558491907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8380a2805115612fa557612fa19382915190845af4612f9b613e5e565b91614f03565b5080f35b5050505034612fb15780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8552600452602484fd5b632a87526960e21b8652600452602485fd5b9091506020813d602011613010575b81613000602093836136dc565b810103126119f057519038612f02565b3d9150612ff3565b63703e46dd60e11b8452600484fd5b6000805160206152d8833981519152546001600160a01b03161415905038612ecb565b50346103a157806003193601126103a157600f546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a15760043561309061389e565b801515806130f9575b156130c8576005557ffe891c6ab12cf73707f8deb6600c12ba382e4cc31eb2b0a2754cad13075ed2d18180a180f35b60405162461bcd60e51b81526020600482015260096024820152681bda5b0bdc9bdd5b9960ba1b6044820152606490fd5b5068056bc75e2d63100000811115613099565b50346103a157806003193601126103a1576003546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a1576103f2600d60406103fe936001600160401b03613162613646565b610320845161317182826136dc565b369037168152600860205220016137c7565b50346103a157806003193601126103a1576012546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a1576131c6613646565b6131ce61389e565b6001600160401b03811690600382108015613251575b613242576018805467ffffffffffffffff1981169093179055604080516001600160401b0393841681529190921660208201527fd3f9867a279ba2e840059332bc3043f783559cd060e3edd34d4267a92130ab1591819081016121ea565b6309f7299b60e11b8352600483fd5b50603c82116131e4565b50346103a157806003193601126103a1576004546040516001600160a01b039091168152602090f35b50346103a157806003193601126103a1576020600654604051908152f35b50346103a15760203660031901126103a1576111426132bf613646565b6132c76138f1565b3390613960565b50346103a157806003193601126103a15760206001600160401b0360185416604051908152f35b50346103a157806003193601126103a1576020604051603c8152f35b50346103a157806003193601126103a1576000805160206152b8833981519152546001600160a01b0316331415806134ba575b6134ac576133506138d4565b60075460ff811661348a576001546001600160a01b03161561347b576101019068ffffffffffffffffff19161760075560018152600860205260408120428155600160001991015560017f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee604080514281526000196020820152a25b60045481906001600160a01b031680151580613430575b6133ea5750f35b803b1561342d5781809160046040518095819363be9a655560e01b83525af1801561342057613417579050f35b61223a916136dc565b50604051903d90823e3d90fd5b50fd5b50604051631f2698ab60e01b8152602081600481855afa9081156111f257839161345c575b50156133e3565b613475915060203d602011610ff857610fea81836136dc565b38613455565b63063bbf6960e01b8252600482fd5b506004546001600160a01b031633146133cc5763ba26162b60e01b8152600490fd5b6282b42960e81b8152600490fd5b506004546001600160a01b0316331415613344565b50346103a157806003193601126103a1576013546040516001600160a01b039091168152602090f35b50346103a15760203660031901126103a157600435801515809103610d715760207f77860e247ab9186dbe64e5bd0e0b93273cc4273e01818420e788f500078886f59161354361389e565b60ff196015541660ff821617601555604051908152a180f35b905034610d71576020366003190112610d715760406101e0926001600160401b03613585613646565b16815260086020522060ff815491600181015460028201546003830154600484015460058501546006860154916007870154936008880154956001600160401b0360098a01541697600c600b8b01549a01549b8d5260208d015260408c015260608b015260808a015260a089015260c088015260e087015261010086015261012085015281811661014085015260018060a01b038160081c16610160850152818160a81c16151561018085015260b01c1615156101a08301526101c0820152f35b600435906001600160401b038216820361088657565b60243590811515820361088657565b91906103208301926000905b6019821061368457505050565b6020806001928551815201930191019091613677565b600435906001600160a01b038216820361088657565b602435906001600160a01b038216820361088657565b604435906001600160a01b038216820361088657565b90601f801991011681019081106001600160401b038211176136fd57604052565b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116136fd57601f01601f191660200190565b9181601f84011215610886578235916001600160401b038311610886576020808501948460051b01011161088657565b6024359060ff8216820361088657565b919082519283825260005b84811061379a575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201613779565b90816020910312610886575180151581036108865790565b60405191906000835b601982106137e9575050506137e7610320836136dc565b565b60016020819285548152019301910190916137d0565b9190820180921161380c57565b634e487b7160e01b600052601160045260246000fd5b9081526001600160a01b03909116602082015260606040820181905261384a9291019061376e565b90565b9190820391821161380c57565b919081101561386a5760051b0190565b634e487b7160e01b600052603260045260246000fd5b3560ff811681036108865790565b601982101561386a570190600090565b6000805160206152b8833981519152546001600160a01b031633036138bf57565b63118cdaa760e01b6000523360045260246000fd5b60ff601554166138e057565b6313d0ff5960e31b60005260046000fd5b60026000805160206152f8833981519152541461391c5760026000805160206152f883398151915255565b633ee5aeb560e01b60005260046000fd5b8181029291811591840414171561380c57565b811561394a570490565b634e487b7160e01b600052601260045260246000fd5b6000916001600160401b0382169182845260086020526040842093600b85019160ff835460a81c1615613e4f5784825260096020526040822060018060a01b03851683526020526040822095600287019182549260ff8416613e40578854938415613e2d57506001830154620151808101809111613e1957421015613dc857908691600160ff19825416179055613a0a85998697549560ff87169485916001831b16151594614491565b9080613dbf575b80613db2575b613c04575b5050600e546001600160a01b0316915050801561100a5785613b96575b82613a7c575b50507f6c43ab65cd0ebdd66d111a711fedd4b61c1eb8c18b791217bead63294658b1c6916040918251958652602086015260018060a01b031693a3565b815460405163095ea7b360e01b60208083019182526001600160a01b0385811660248501526044808501899052845290931692908590613abd6064856136dc565b83519082865af184513d82613b7a575b505015613b36575b5050803b15610d71576040516301fc161f60e01b8152600481018390526001600160a01b0385166024820152604481018490529082908290606490829084905af18015610fff5715613a3f57613b2c8280926136dc565b6103a15780613a3f565b613b7391613b6e60405163095ea7b360e01b602082015285602482015286604482015260448152613b686064826136dc565b82614982565b614982565b3880613ad5565b909150613b8e5750813b15155b3880613acd565b600114613b87565b47808711613bfc575b508515613a395790813b156103a1576040516303539c2d60e11b8152600481018290526001600160a01b038516602482015281816044818a875af18015610fff57613bec575b5090613a39565b81613bf6916136dc565b38613be5565b955038613b9f565b9194909297506064820282810460641483151715613d9e57612710613c2a91048361384d565b92613c52613c3c84600389015461392d565b94613c4c60048901548097613940565b906137ff565b9860ff8160b01c16600014613ca9575050506006613c7d83613c7884600589015461392d565b613940565b945b015480613c8d575b80613a1c565b91613c78613c4c92613ca095969461392d565b90388080613c87565b91959160081c6001600160a01b031663506f6f6c8103613d7857506001600160a01b0387168552600b6020526040852080546001600160401b0316891480613d5c575b613cfb575b5050600690613c7f565b888652600c602052613d13826001604089200161388e565b90549060031b1c9182613d27575b50613cf1565b839750613d539291613d46613c7892600260056006980154930161388e565b90549060031b1c9061392d565b94903880613d21565b50613d6a826002830161388e565b90549060031b1c1515613cec565b6001600160a01b038816149050613d92575b600690613c7f565b60058101549450613d8a565b634e487b7160e01b85526011600452602485fd5b5060048301541515613a17565b50801515613a11565b805460ff1916600117905550506040805183815260208101939093526001600160a01b0390941695507f6c43ab65cd0ebdd66d111a711fedd4b61c1eb8c18b791217bead63294658b1c693925050a3565b634e487b7160e01b86526011600452602486fd5b60ff191660011790555050505050505050565b63cdda955f60e01b8552600485fd5b632382430560e11b8252600482fd5b3d15613e89573d90613e6f82613713565b91613e7d60405193846136dc565b82523d6000602084013e565b606090565b6001600160a01b0381166000908152600d60205260409020546001600160401b03169081158015613f15575b613f1157816000526009602052604060002060018060a01b03821660005260205260ff60026040600020015416613f115781600052600860205260ff600b6040600020015460a81c1615613f11576137e791613960565b5050565b506001600160401b0360075460081c168214613eba565b60008051602061533883398151915280546001600160a01b03199081169091556000805160206152b883398151915280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6001600160a01b0381166000908152600d60205260409020546001600160401b031680158015614040575b613f1157806000526009602052604060002060018060a01b03831660005260205260026040600020019060ff82541661403b5780600052600860205260ff600b6040600020015460a81c161561402a5760ff9261402191613960565b54161561402a57565b630b265c0360e11b60005260046000fd5b505050565b506001600160401b0360075460081c168114613fc5565b600f546000926001600160a01b039091169182156140e5576001600160a01b0316808452600d60205260408420546001600160401b0316151592803b156119f45784929183606492604051968795869463032cd31f60e21b8652600486015260018060a01b0316602485015260448401525af18015610fff576140d8575050565b816140e2916136dc565b50565b632f6840b560e21b8452600484fd5b6001810190600019825403613f1157429055603c42019081421161380c578190557f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee60406001600160401b0360075460081c16928151904282526020820152a2565b919060005b601981106141695750505050565b6001811b831615614204576001600160401b038416600081815260176020908152604080832060ff861680855290835281842054858552601684528285208286528452828520818652909352922080546001600160a01b0319166001600160a01b0387161790559092916001820191821061380c5760019360409160005260176020528160002060ff60009216825260205220555b0161415b565b6001906141fe565b9190826040910312610886576020825192015190565b61422a6138d4565b6007549160009260ff811615614482576001600160401b039060081c168352600860205260408320906001820154600019811461447357601e8101809111613d9e574210611eed57600b82019060ff825460a81c16614464576001600160401b03600984015416156144565760018060a01b036001541660088401948554823b156144525791839188606481956040519788968795869363243098b960e11b8552600485015260406024850152816044850152848401378181018301849052601f01601f191681010301925af1801561444757614433575b50604060018060a01b0360015416935460248251809681936302d8ca0160e11b835260048301525afa801561442857849385916143f3575b50156143e45782600783015560028201541561436a57506137e792506001600160401b0360075460081c16614576565b915050600160a81b60ff60a81b198254161790557fa84e5f0d04242e721adff2076b30ca115b444d9d3c51feb5398572df1be3269a60e06001600160401b0360075460081c1692604051908082528060208301528060408301528060608301528060808301528060a083015260c0820152a26137e76144de565b6338c52e6760e21b8452600484fd5b905061441891935060403d604011614421575b61441081836136dc565b81019061420c565b9290923861433a565b503d614406565b6040513d86823e3d90fd5b84614440919592956136dc565b9238614302565b6040513d87823e3d90fd5b8780fd5b6294861760e21b8552600485fd5b6308d4975360e11b8552600485fd5b636218b96960e11b8552600485fd5b633a5f7b5760e01b8452600484fd5b6001600160401b0316600052601460205260406000209060018060a01b031660005260205260ff6040600020911660005260205260406000205490816144da5760019150015490565b5090565b60075460016001600160401b038260081c1601906001600160401b03821161380c5768ffffffffffffffff006001600160401b0383169260081b169068ffffffffffffffff00191617600755806000526008602052604060002042815560016000199101557f21a3f9234ecb68aa0fbcda0a09a292af15303c8862c702b5ddde980ae822bfee604080514281526000196020820152a2565b600b8201805460ff60ff60a81b01191660ff6019860616908117600160a81b17825560028401549094600091906145b087600d880161388e565b90549060031b1c9384600488015584156148e4578495966145cf614a88565b949b6145e09194939298969a61384d565b906145eb908261392d565b61271090046145fb81988361392d565b61271090049461460c86958461392d565b61271090049561461d87928561392d565b612710900493849361462e9161384d565b906146389161384d565b906146429161384d565b9061464c9161384d565b936003870197885580614879575b509161467291836146779594614869575b5050614ced565b614a1a565b60648802888104606403614855579260e09895926001600160401b039895926127107fa84e5f0d04242e721adff2076b30ca115b444d9d3c51feb5398572df1be3269a9c99960480614846575b5061471c614717600161ffff8760301c1661ffff8860201c1661ffff8960101c1661ffff8a16181818161598835460ff60b01b8b60b01b169060ff60b01b19161784556147118830614f64565b97613940565b614d43565b84600583015561472d888a86614da7565b969080614833575b508660068401558d8982968a15614786575b50505050505054906040519a8b5260018060a01b031660208b015260408a01526060890152608088015260a087015260c08601521692a26137e76144de565b8394959750906147a191600a93945060801c0680938d614e36565b9501556001600160a01b03841690816147e1575b50508054610100600160a81b031916600884901b610100600160a81b03161790553880808d8982614747565b6040918152600b602052208c8a8254168b8b16149182614816575b505061480a575b38806147b5565b63506f6f6c9250614803565b614823925060020161388e565b90549060031b1c15158c386147fc565b61483e9085546137ff565b845538614735565b61484f90614a1a565b386146c4565b634e487b7160e01b87526011600452602487fd5b61487291614cbd565b388061466b565b6002546001600160a01b0316803b156148e0578b9060246040518094819363207d7d8d60e21b8352600160048401525af180156148d5571561465a57918a6148ca6146779695939c614672956136dc565b9a919394509161465a565b6040513d8d823e3d90fd5b8b80fd5b50507fa84e5f0d04242e721adff2076b30ca115b444d9d3c51feb5398572df1be3269a94506001600160401b0392509061492060e09492614a1a565b6040519586528060208701528060408701528060608701528060808701528060a087015260c08601521692a26137e76144de565b60ff6000805160206153188339815191525460401c161561497157565b631afcd79f60e31b60005260046000fd5b906000602091828151910182855af1156149dd576000513d6149d457506001600160a01b0381163b155b6149b35750565b635274afe760e01b60009081526001600160a01b0391909116600452602490fd5b600114156149ac565b6040513d6000823e3d90fd5b9060009160005b601981106149fc575050565b6001811b8216614a0f575b6001016149f0565b600190930192614a07565b6000908015613f11576012546001600160a01b03168015614a795747808311614a71575b50811561403b57803b15611296578290600460405180948193637f4433a760e01b83525af18015610fff576140d8575050565b915038614a3e565b6318bf7cc760e21b8352600483fd5b6011546001600160a01b031680614ac85750600554906006549073b01322f50580743906047dc0b44325d9b2fff89690612328906101f49060c890606490565b60405163f917238d60e01b8152602081600481855afa9081156149dd57600091614c8b575b50604051637693b3b360e01b815292602084600481865afa9384156149dd57600094614c57575b506040516318c0d45b60e21b815292602084600481845afa9384156149dd57600094614c10575b5060a0600491604051928380926321beffc160e11b82525afa9081156149dd57600091614b81575b50805192602082015192606060408401519301519196959493929190565b60a0813d60a011614c08575b81614b9a60a093836136dc565b81010312610d71576040519160a08301908382106001600160401b03831117614bf4575090608091604052805183526020810151602084015260408101516040840152606081015160608401520151608082015238614b63565b634e487b7160e01b81526041600452602490fd5b3d9150614b8d565b6020949194813d602011614c4f575b81614c2c602093836136dc565b81010312610d715751906001600160a01b03821682036103a157509260a0614b3b565b3d9150614c1f565b9093506020813d602011614c83575b81614c73602093836136dc565b8101031261088657519238614b14565b3d9150614c66565b90506020813d602011614cb5575b81614ca6602093836136dc565b81010312610886575138614aed565b3d9150614c99565b8115613f1157600080809381935af1614cd4613e5e565b5015614cdc57565b6312171d8360e31b60005260046000fd5b6000908015613f11576003546001600160a01b03168015614d3457803b15611296578290600460405180948193633d9dd07760e01b83525af18015610fff576140d8575050565b63d92e233d60e01b8352600483fd5b6000908015613f11576012546001600160a01b0316908115614a7957614d69908261513a565b80614d7357505050565b813b15611296578291602483926040519485938492631f3fed5760e01b845260048401525af18015610fff576140d8575050565b601254919290916001600160a01b0316908115614e2a5760409260006001600160401b0396959360649386519889968795634ef59d6d60e11b8752600487015216602485015260448401525af19182156149dd57600090600093614e0a57509190565b9050614e2691925060403d6040116144215761441081836136dc565b9091565b50505050600090600090565b9190916000916001600160401b03821691826000526017602052604060002060ff8616600052602052604060002054946000945b868610614e7d5750505050505050600090565b600085815260166020908152604080832060ff861684528252808320898452825280832054888452600983528184206001600160a01b039091168085529252909120614ed590614ecf90858488614491565b836137ff565b9185101580614efa575b614eef5750600190950194614e6a565b965050505050505090565b50818510614edf565b90614f295750805115614f1857805190602001fd5b63d6bda27560e01b60005260046000fd5b81511580614f5b575b614f3a575090565b639996b31560e01b60009081526001600160a01b0391909116600452602490fd5b50803b15614f32565b9190600081158015615129575b6151245780546040516318160ddd60e01b81526001600160a01b039091169290602081600481875afa9081156111f25783916150f2575b50604051630cb2dac360e21b815290602082600481885afa80156144285784906150bc575b614fd7925061384d565b9081156150b457818111156150ac5750915b829483614ff7575b50505050565b813b15611296576040516340c10f1960e01b81526001600160a01b03919091166004820152602481018490529082908290604490829084905af18015610fff5761509c575b509060018060a01b03601054169081615056575b80614ff1565b813b156112965782916024839260405194859384926359f86e1160e01b845260048401525af1615087575b80615050565b6150928280926136dc565b6103a15780615081565b816150a6916136dc565b3861503c565b905091614fe9565b509093505050565b50906020813d6020116150ea575b816150d7602093836136dc565b8101031261249e5790614fd79151614fcd565b3d91506150ca565b90506020813d60201161511c575b8161510d602093836136dc565b81010312611296575138614fa8565b3d9150615100565b925050565b506001600160a01b03841615614f71565b9190600090801580156152a6575b6152a15781546040516318160ddd60e01b81526001600160a01b039091169190602081600481865afa90811561442857849161526f575b50604051630cb2dac360e21b815290602082600481875afa8015614447578590615239575b6151ae925061384d565b90811561523157818111156152295750905b8194826151cd5750505050565b813b1561249e576040516340c10f1960e01b81526001600160a01b03919091166004820152602481019290925282908290604490829084905af18015610fff57615219575b8080614ff1565b81615223916136dc565b38615212565b9050906151c0565b509193505050565b50906020813d602011615267575b81615254602093836136dc565b810103126119f457906151ae91516151a4565b3d9150615247565b90506020813d602011615299575b8161528a602093836136dc565b8101031261249e57513861517f565b3d915061527d565b509150565b506001600160a01b0384161561514856fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a2646970667358221220e811e7a1712baec1698dda191e23c51741e274241f3fe8d7fd80765e5c34b3f764736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xdafff2…af010c | 26 days agoWed, 22 Jul 2026 19:10:59 UTC | 0xc7f505…81d2 | data: 0x000000000000000000…ffffffff |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| No direct transactions — this address is only ever reached via internal calls (common for a contract only invoked through a router or proxy). View Internal Transactions → | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 17,685,379 | 25 days agoThu, 23 Jul 2026 23:33:08 UTC | 0xb8fd52…f182cc | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,682,880 | 25 days agoThu, 23 Jul 2026 23:28:58 UTC | 0x018bc1…b9a7f6 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,682,866 | 25 days agoThu, 23 Jul 2026 23:28:56 UTC | 0x7caa85…e0070e | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,681,908 | 25 days agoThu, 23 Jul 2026 23:27:20 UTC | 0x173978…356b27 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,681,894 | 25 days agoThu, 23 Jul 2026 23:27:18 UTC | 0xe8a714…fdaddb | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,680,954 | 25 days agoThu, 23 Jul 2026 23:25:44 UTC | 0x9e3537…b81e1e | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,680,940 | 25 days agoThu, 23 Jul 2026 23:25:42 UTC | 0xfa3e01…cf1962 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,679,971 | 25 days agoThu, 23 Jul 2026 23:24:06 UTC | 0x47904f…742c68 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,679,958 | 25 days agoThu, 23 Jul 2026 23:24:05 UTC | 0x177918…f747de | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,678,994 | 25 days agoThu, 23 Jul 2026 23:22:28 UTC | 0x58b963…1c00f7 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,678,978 | 25 days agoThu, 23 Jul 2026 23:22:26 UTC | 0x29dc93…3add70 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,678,026 | 25 days agoThu, 23 Jul 2026 23:20:50 UTC | 0xad5846…a619ae | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,678,012 | 25 days agoThu, 23 Jul 2026 23:20:49 UTC | 0xfb0396…34ef97 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,677,058 | 25 days agoThu, 23 Jul 2026 23:19:14 UTC | 0xd30c74…28a1db | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,677,045 | 25 days agoThu, 23 Jul 2026 23:19:13 UTC | 0x3d3d7f…35c2d3 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,676,097 | 25 days agoThu, 23 Jul 2026 23:17:38 UTC | 0x2a7447…dc6aeb | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,676,084 | 25 days agoThu, 23 Jul 2026 23:17:36 UTC | 0x4d8516…7c394a | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,675,122 | 25 days agoThu, 23 Jul 2026 23:15:59 UTC | 0x283983…b2f634 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,675,108 | 25 days agoThu, 23 Jul 2026 23:15:58 UTC | 0x6bd3b2…725ea5 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,674,118 | 25 days agoThu, 23 Jul 2026 23:14:19 UTC | 0x901609…7a3716 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,674,093 | 25 days agoThu, 23 Jul 2026 23:14:16 UTC | 0xa8cd84…7c05aa | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,673,133 | 25 days agoThu, 23 Jul 2026 23:12:40 UTC | 0x1c0c64…7453b1 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,673,118 | 25 days agoThu, 23 Jul 2026 23:12:39 UTC | 0x9ec72b…63b998 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |
| 17,672,153 | 25 days agoThu, 23 Jul 2026 23:11:02 UTC | 0x2547bb…a7462c | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.002 ETH |
| 17,672,138 | 25 days agoThu, 23 Jul 2026 23:11:00 UTC | 0x473804…d08be4 | DELEGATECALL | executeFor | 0x8b28…344b | IN | 0x6e28…dbdc | 0.0025 ETH |