| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xdf3ea6…d0a4ac | 32 days agoThu, 16 Jul 2026 13:56:12 UTC | 0xb3e2e6…5102 | [0] 0x000000000000…000004b5 [1] 0x000000000000…6bd1aa61 [2] 0x000000000000…6bd1aa61 data: 0x969d0f8e9fe9f028a0…b508b564 |
| 0xdf3ea6…d0a4ac | 32 days agoThu, 16 Jul 2026 13:56:12 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…6bd1aa61 [2] 0x000000000000…000004b5 |
| 0x6d9c56…a64c9d | 33 days agoWed, 15 Jul 2026 17:46:24 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…6bd1aa61 |
| 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 | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import {ERC2981} from "@openzeppelin/contracts/token/common/ERC2981.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ReentrancyGuardTransient} from "@openzeppelin/contracts/utils/ReentrancyGuardTransient.sol";
import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
/// @title Hoodmap Plot — own a slice of Base history
/// @notice 1 NFT = 250 consecutive Base blocks. 200,000 plots total covering
/// the first 50,000,000 Base blocks. 0-indexed: plot N covers blocks
/// [N*250 .. N*250+249]. Single price (no tiers): 0.0007 ETH.
///
/// @dev Design vs v12 HoodmapNFT (1 NFT = 1 of 50M blocks, tiered pricing):
/// - **Removed tiered pricing** (Genesis/Early/Open) → single price
/// keeps front-running irrelevant (no arbitrage between tiers).
/// - **Removed commit-reveal flow** (was needed only to protect cheap
/// Genesis blocks from MEV-bot sniping). With uniform pricing there's
/// nothing to gain by reordering claims, so simple atomic `claim()`
/// is safe and ~30% cheaper gas.
/// - **Removed `GenesisQuota` rolling 24h cap**. Without tiers there's
/// no premium-supply to ration. Volume is gated only by `maxBatchSize`.
/// - **0-indexed plot IDs**. Plot 0 owns blocks 0..249 (Base genesis
/// era). solmap pattern. Saves one branch in the `OutOfRange` check.
/// - **PLOT_SIZE constant** baked in. Block→plot conversion is
/// `floor(block / PLOT_SIZE)` — pure view function for tooling.
///
/// Carried over unchanged from v12 (audit-hardened mechanics):
/// - ReentrancyGuardTransient + Pausable on all state-mutating fns.
/// - Push-refund with 50k gas cap → fallback to pull-refund (audit M-3).
/// - Assembly-level CALL with truncated returndata (audit NEW-5).
/// - Bounded maxBatchSize, Ownable2Step (2-step admin handover).
/// - ERC-2981 royalties, default-frozen metadata one-way switch.
/// - `withdrawable()` excludes pendingRefunds (audit H-1).
/// - `renounceOwnership` disabled — pause+renounce permanent freeze attack (M-2).
contract HoodmapPlot is ERC721, ERC2981, Ownable2Step, ReentrancyGuardTransient, Pausable {
using Strings for uint256;
// ─── Constants ────────────────────────────────────────────────────────
/// @notice Each plot owns this many consecutive Base blocks.
uint256 public constant PLOT_SIZE = 250;
/// @notice Total plots: 50,000,000 / 250 = 200,000. Plot IDs are 0-indexed
/// (valid range: 0 .. 199_999). Mirrors solmap's transparent
/// multiplication scheme: plot N owns blocks [N*250, N*250+249].
uint256 public constant MAX_PLOT = 199_999;
uint256 public constant TOTAL_PLOTS = 200_000;
/// @notice Single uniform price. No tiers, no rolling quotas.
uint256 public constant PLOT_PRICE = 0.0007 ether;
/// @notice Hard ceiling on `maxBatchSize`. batchClaim(1000) gas budget
/// ≈ 29M wei units fits Base 30M block limit with ~3% margin
/// (per-mint ≈ 29k from DEPLOYMENT.md + NEW-A4 extcodesize check).
uint256 public constant MAX_BATCH_SIZE_LIMIT = 1000;
/// @notice Gas forwarded to recipient on push-refund. Bounded to defang
/// return-bomb / OOG griefing while still letting EOAs and modern
/// Gnosis Safes (signature-version checks + module hooks burn
/// 40-50k) accept the transfer. v11 audit NEW-A5.
uint256 internal constant REFUND_GAS = 50_000;
uint96 public constant MAX_ROYALTY_BPS = 1000; // 10% absolute ceiling.
// ─── Storage ──────────────────────────────────────────────────────────
/// @dev maxBatchSize: uint64, packs in one slot with metadataFrozen.
uint64 public maxBatchSize = 50;
bool public metadataFrozen;
string private _baseTokenURI;
/// @notice Sum of all pending push-refunds parked for pull. `withdrawable()`
/// subtracts this so the owner can never pull funds reserved for
/// users (audit H-1).
uint256 public totalPendingRefunds;
mapping(address => uint256) public pendingRefunds;
// ─── Events ───────────────────────────────────────────────────────────
/// @notice `plotId` is the NFT token ID. `payer` is `msg.sender` (the EOA
/// signing the tx); `owner` is the NFT recipient (may differ when
/// minting as gift). `blockHash` is the L2 (Base) parent block hash
/// at mint time — indexer captures it for provenance.
event Claimed(uint256 indexed plotId, address indexed owner, address indexed payer, bytes32 blockHash);
event MaxBatchSizeUpdated(uint256 oldSize, uint256 newSize);
event BaseURIUpdated(string newURI);
event MetadataFrozen();
event Refunded(address indexed to, uint256 amount);
event RefundParked(address indexed to, uint256 amount);
event Withdrawn(address indexed to, uint256 amount);
// ─── Errors ───────────────────────────────────────────────────────────
error OutOfRange(uint256 plotId);
error AlreadyClaimed(uint256 plotId);
error Underpaid(uint256 sent, uint256 required);
error PriceMismatch(uint256 expected, uint256 actual);
error BatchTooLarge(uint256 size, uint256 maxSize);
error EmptyBatch();
error WithdrawFailed();
error InvalidBatchSize(uint256 size);
error RenounceDisabled();
error RoyaltyTooHigh(uint96 bps);
error MetadataAlreadyFrozen();
error RefundEmpty();
error WithdrawTooMuch(uint256 requested, uint256 available);
// ─── Constructor ──────────────────────────────────────────────────────
constructor(address _royaltyReceiver, uint96 _royaltyBps)
ERC721("Hoodmap", "HOOD")
Ownable(msg.sender)
{
if (_royaltyBps > MAX_ROYALTY_BPS) revert RoyaltyTooHigh(_royaltyBps);
if (_royaltyReceiver != address(0)) _setDefaultRoyalty(_royaltyReceiver, _royaltyBps);
}
// ─── Pricing ──────────────────────────────────────────────────────────
/// @notice Returns the price in wei to mint any plot. Uniform across all
/// 200,000 plots — single constant. Kept as a view for ABI
/// symmetry with the v12 contract's `priceFor(blockNumber)`.
function priceFor(uint256 /* plotId */) public pure returns (uint256) {
return PLOT_PRICE;
}
/// @notice Total cost for a batch. Constant per plot, so just `count * PLOT_PRICE`.
function priceForBatch(uint256[] calldata plotIds) external pure returns (uint256) {
return plotIds.length * PLOT_PRICE;
}
// ─── Block ↔ plot helpers ─────────────────────────────────────────────
/// @notice Convert a Base block number to its plot ID.
/// @dev `floor(blockNumber / PLOT_SIZE)`. Block 0..249 → plot 0,
/// block 250..499 → plot 1, etc. Reverts if blockNumber lands
/// outside the indexed range (50M blocks total).
function plotForBlock(uint256 blockNumber) external pure returns (uint256) {
uint256 plotId = blockNumber / PLOT_SIZE;
if (plotId > MAX_PLOT) revert OutOfRange(plotId);
return plotId;
}
/// @notice Returns the inclusive block range owned by a plot.
/// @return startBlock First Base block in the plot (= plotId * 250).
/// @return endBlock Last Base block (= plotId * 250 + 249).
function blockRangeForPlot(uint256 plotId)
external
pure
returns (uint256 startBlock, uint256 endBlock)
{
if (plotId > MAX_PLOT) revert OutOfRange(plotId);
unchecked {
startBlock = plotId * PLOT_SIZE;
endBlock = startBlock + PLOT_SIZE - 1;
}
}
// ─── Public mint API ──────────────────────────────────────────────────
/// @param plotId Plot ID (0..MAX_PLOT inclusive).
/// @param expectedPrice Pass PLOT_PRICE to lock in the live price. Pass 0
/// to skip the strict-equality check (back-compat
/// with v12 wallet flow). Either way, msg.value must
/// cover PLOT_PRICE.
/// @param recipient NFT goes to this address. Pass `address(0)` to
/// send to `msg.sender`.
function claim(uint256 plotId, uint256 expectedPrice, address recipient)
external
payable
whenNotPaused
nonReentrant
{
if (expectedPrice != 0 && expectedPrice != PLOT_PRICE) {
revert PriceMismatch(expectedPrice, PLOT_PRICE);
}
if (msg.value < PLOT_PRICE) revert Underpaid(msg.value, PLOT_PRICE);
address to = recipient == address(0) ? msg.sender : recipient;
_mintPlot(plotId, to);
unchecked {
uint256 excess = msg.value - PLOT_PRICE;
if (excess != 0) _refund(msg.sender, excess);
}
}
/// @param plotIds Array of plot IDs to mint. All-or-nothing: any
/// already-claimed plot reverts the whole batch
/// (callers should pre-filter using `isClaimed`).
/// @param expectedPrice Pass `plotIds.length * PLOT_PRICE`. Pass 0 to skip.
/// @param recipient Single recipient for all minted plots. `address(0)`
/// ⇒ `msg.sender`.
function batchClaim(uint256[] calldata plotIds, uint256 expectedPrice, address recipient)
external
payable
whenNotPaused
nonReentrant
{
uint256 len = plotIds.length;
if (len == 0) revert EmptyBatch();
if (len > maxBatchSize) revert BatchTooLarge(len, maxBatchSize);
uint256 required = len * PLOT_PRICE;
if (expectedPrice != 0 && expectedPrice != required) revert PriceMismatch(expectedPrice, required);
if (msg.value < required) revert Underpaid(msg.value, required);
address to = recipient == address(0) ? msg.sender : recipient;
bytes32 bh = blockhash(block.number - 1); // cached once per TX
for (uint256 i; i < len;) {
_mintPlot(plotIds[i], to, bh);
unchecked { ++i; }
}
unchecked {
uint256 excess = msg.value - required;
if (excess != 0) _refund(msg.sender, excess);
}
}
/// @notice Pull parked refund balance to msg.sender.
function claimRefund() external nonReentrant {
uint256 amt = pendingRefunds[msg.sender];
if (amt == 0) revert RefundEmpty();
pendingRefunds[msg.sender] = 0;
totalPendingRefunds -= amt;
bool ok;
address payable to = payable(msg.sender);
assembly {
ok := call(gas(), to, amt, 0, 0, 0, 0)
}
if (!ok) revert WithdrawFailed();
emit Refunded(msg.sender, amt);
}
/// @notice Pull parked refund to an arbitrary destination. Lets a user
/// whose original on-chain identity is broken (Safe with module
/// bug, compromised EOA delegated to a guardian) route their
/// refund elsewhere instead of being permanently locked.
function claimRefundTo(address payable to) external nonReentrant {
if (to == address(0)) revert WithdrawFailed();
uint256 amt = pendingRefunds[msg.sender];
if (amt == 0) revert RefundEmpty();
pendingRefunds[msg.sender] = 0;
totalPendingRefunds -= amt;
bool ok;
assembly {
ok := call(gas(), to, amt, 0, 0, 0, 0)
}
if (!ok) revert WithdrawFailed();
emit Refunded(to, amt);
}
// ─── Views ────────────────────────────────────────────────────────────
function isClaimed(uint256 plotId) external view returns (bool) {
return _ownerOf(plotId) != address(0);
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
_requireOwned(tokenId);
string memory base = _baseTokenURI;
return bytes(base).length == 0 ? "" : string.concat(base, tokenId.toString());
}
/// @notice Funds the owner can actually withdraw — never includes parked
/// refunds reserved for users (audit H-1).
function withdrawable() public view returns (uint256) {
uint256 bal = address(this).balance;
return bal > totalPendingRefunds ? bal - totalPendingRefunds : 0;
}
// ─── Owner ────────────────────────────────────────────────────────────
function setMaxBatchSize(uint256 newSize) external onlyOwner {
if (newSize == 0 || newSize > MAX_BATCH_SIZE_LIMIT) revert InvalidBatchSize(newSize);
emit MaxBatchSizeUpdated(maxBatchSize, newSize);
// forge-lint: disable-next-line(unsafe-typecast) — MAX_BATCH_SIZE_LIMIT (1000) << uint64 max.
maxBatchSize = uint64(newSize);
}
function setBaseURI(string calldata newURI) external onlyOwner {
if (metadataFrozen) revert MetadataAlreadyFrozen();
_baseTokenURI = newURI;
emit BaseURIUpdated(newURI);
}
/// @notice One-way: after this, baseURI can never be changed again. Use
/// after metadata has been pinned to immutable storage (IPFS/Arweave).
function freezeMetadata() external onlyOwner {
if (metadataFrozen) revert MetadataAlreadyFrozen();
metadataFrozen = true;
emit MetadataFrozen();
}
function setDefaultRoyalty(address receiver, uint96 bps) external onlyOwner {
if (bps > MAX_ROYALTY_BPS) revert RoyaltyTooHigh(bps);
_setDefaultRoyalty(receiver, bps);
}
function pause() external onlyOwner { _pause(); }
function unpause() external onlyOwner { _unpause(); }
/// @notice Audit M-2: block `Ownable.renounceOwnership`. A paused-then-renounced
/// contract is permanently un-administered (no one can ever unpause).
/// Mint can be paused but `unpause` must always have a live owner.
function renounceOwnership() public view override onlyOwner {
revert RenounceDisabled();
}
/// @notice Withdraw protocol fees. Cannot pull funds reserved for users.
/// @param to Destination address (validated non-zero).
/// @param amount Pass 0 to withdraw all available; otherwise exact amount.
/// @dev Audit NEW-5: assembly-level CALL truncates returndata so a
/// hostile `to` returning a multi-MB revert payload can't OOM-DoS
/// the owner. Emits `Withdrawn` for on-chain audit trail (H-M-9).
function withdraw(address payable to, uint256 amount) external onlyOwner nonReentrant {
if (to == address(0)) revert WithdrawFailed();
uint256 avail = withdrawable();
uint256 send = amount == 0 ? avail : amount;
if (send > avail) revert WithdrawTooMuch(send, avail);
bool ok;
assembly {
ok := call(gas(), to, send, 0, 0, 0, 0)
}
if (!ok) revert WithdrawFailed();
emit Withdrawn(to, send);
}
// ─── Internals ────────────────────────────────────────────────────────
/// @dev Single-claim path: always `_safeMint`. Matches v12 HoodmapNFT
/// pattern exactly. For EOA receivers `_safeMint` is functionally
/// identical to `_mint` (the IERC721Receiver check no-ops on
/// zero-codesize), so the cost is one extra extcodesize check
/// (~100 gas) for the safety guarantee that contract receivers
/// either accept the NFT or revert at mint time (no silent locks).
function _mintPlot(uint256 plotId, address to) internal {
_mintPlot(plotId, to, blockhash(block.number - 1), true);
}
/// @dev Batch path: opportunistic `_safeMint` only when `to` is a contract
/// (extcodesize > 0). v12 audit NEW-A4 fix carried over verbatim:
/// costs ~100 gas extcodesize per iter for EOAs but prevents up to
/// `maxBatchSize` NFTs being silently locked if the batch recipient
/// is a contract without `onERC721Received`. EOAs keep the cheap
/// `_mint` path. `bh` is the L2 (Base) parent block hash, cached
/// once per TX by the caller; emitted in Claimed so the indexer
/// captures provenance without on-chain storage cost.
function _mintPlot(uint256 plotId, address to, bytes32 bh) internal {
bool useSafe = to.code.length > 0;
_mintPlot(plotId, to, bh, useSafe);
}
/// @dev Inner implementation. `useSafe` controls whether `_safeMint` (with
/// the IERC721Receiver callback) or `_mint` (no callback) is used.
/// Reverts on out-of-range plot, already-claimed plot, or callback
/// rejection (e.g. contract recipient lacking `onERC721Received`).
function _mintPlot(uint256 plotId, address to, bytes32 bh, bool useSafe) internal {
if (plotId > MAX_PLOT) revert OutOfRange(plotId);
if (_ownerOf(plotId) != address(0)) revert AlreadyClaimed(plotId);
if (useSafe) _safeMint(to, plotId);
else _mint(to, plotId);
emit Claimed(plotId, to, msg.sender, bh);
}
/// @dev Push-refund with bounded gas (audit M-3) and truncated returndata
/// (audit NEW-5). On failure, park for pull via `claimRefund` so the
/// parent claim still succeeds — refusing to refund must never block
/// a paid mint.
function _refund(address to, uint256 amount) internal {
bool ok;
uint256 g = REFUND_GAS; // constants aren't always inlinable into asm
assembly {
ok := call(g, to, amount, 0, 0, 0, 0)
}
if (ok) {
emit Refunded(to, amount);
} else {
_parkRefund(to, amount);
}
}
function _parkRefund(address to, uint256 amount) internal {
pendingRefunds[to] += amount;
totalPendingRefunds += amount;
emit RefundParked(to, amount);
}
function _baseURI() internal view override returns (string memory) {
return _baseTokenURI;
}
function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC2981) returns (bool) {
return super.supportsInterface(interfaceId);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_royaltyReceiver",
"type": "address",
"internalType": "address"
},
{
"name": "_royaltyBps",
"type": "uint96",
"internalType": "uint96"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyClaimed",
"type": "error",
"inputs": [
{
"name": "plotId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "BatchTooLarge",
"type": "error",
"inputs": [
{
"name": "size",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxSize",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC2981InvalidDefaultRoyalty",
"type": "error",
"inputs": [
{
"name": "numerator",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "denominator",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC2981InvalidDefaultRoyaltyReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC2981InvalidTokenRoyalty",
"type": "error",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "numerator",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "denominator",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC2981InvalidTokenRoyaltyReceiver",
"type": "error",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721IncorrectOwner",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InsufficientApproval",
"type": "error",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC721InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidOperator",
"type": "error",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721NonexistentToken",
"type": "error",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "EmptyBatch",
"type": "error",
"inputs": []
},
{
"name": "EnforcedPause",
"type": "error",
"inputs": []
},
{
"name": "ExpectedPause",
"type": "error",
"inputs": []
},
{
"name": "InvalidBatchSize",
"type": "error",
"inputs": [
{
"name": "size",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "MetadataAlreadyFrozen",
"type": "error",
"inputs": []
},
{
"name": "OutOfRange",
"type": "error",
"inputs": [
{
"name": "plotId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "PriceMismatch",
"type": "error",
"inputs": [
{
"name": "expected",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "actual",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "RefundEmpty",
"type": "error",
"inputs": []
},
{
"name": "RenounceDisabled",
"type": "error",
"inputs": []
},
{
"name": "RoyaltyTooHigh",
"type": "error",
"inputs": [
{
"name": "bps",
"type": "uint96",
"internalType": "uint96"
}
]
},
{
"name": "Underpaid",
"type": "error",
"inputs": [
{
"name": "sent",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "required",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "WithdrawFailed",
"type": "error",
"inputs": []
},
{
"name": "WithdrawTooMuch",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "available",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "approved",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ApprovalForAll",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "operator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "approved",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "BaseURIUpdated",
"type": "event",
"inputs": [
{
"name": "newURI",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "Claimed",
"type": "event",
"inputs": [
{
"name": "plotId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "payer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "blockHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "MaxBatchSizeUpdated",
"type": "event",
"inputs": [
{
"name": "oldSize",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newSize",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MetadataFrozen",
"type": "event",
"inputs": [],
"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": "Paused",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RefundParked",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Refunded",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Unpaused",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Withdrawn",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MAX_BATCH_SIZE_LIMIT",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_PLOT",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_ROYALTY_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint96",
"internalType": "uint96"
}
],
"stateMutability": "view"
},
{
"name": "PLOT_PRICE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "PLOT_SIZE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TOTAL_PLOTS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "batchClaim",
"type": "function",
"inputs": [
{
"name": "plotIds",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "expectedPrice",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "blockRangeForPlot",
"type": "function",
"inputs": [
{
"name": "plotId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "startBlock",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "endBlock",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "pure"
},
{
"name": "claim",
"type": "function",
"inputs": [
{
"name": "plotId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "expectedPrice",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "claimRefund",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimRefundTo",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address payable"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "freezeMetadata",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "getApproved",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "isApprovedForAll",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "operator",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isClaimed",
"type": "function",
"inputs": [
{
"name": "plotId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "maxBatchSize",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "metadataFrozen",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "ownerOf",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"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": "pendingRefunds",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "plotForBlock",
"type": "function",
"inputs": [
{
"name": "blockNumber",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "pure"
},
{
"name": "priceFor",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "pure"
},
{
"name": "priceForBatch",
"type": "function",
"inputs": [
{
"name": "plotIds",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "pure"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "view"
},
{
"name": "royaltyInfo",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "salePrice",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "safeTransferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "safeTransferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setApprovalForAll",
"type": "function",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
},
{
"name": "approved",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setBaseURI",
"type": "function",
"inputs": [
{
"name": "newURI",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setDefaultRoyalty",
"type": "function",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
},
{
"name": "bps",
"type": "uint96",
"internalType": "uint96"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMaxBatchSize",
"type": "function",
"inputs": [
{
"name": "newSize",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "supportsInterface",
"type": "function",
"inputs": [
{
"name": "interfaceId",
"type": "bytes4",
"internalType": "bytes4"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "tokenURI",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalPendingRefunds",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unpause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdraw",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address payable"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawable",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
}
]0x608060405260098054600160a81b600160e81b031916601960a91b17905534801562000029575f80fd5b5060405162002bbc38038062002bbc8339810160408190526200004c9162000259565b33604051806040016040528060078152602001660486f6f646d61760cc1b815250604051806040016040528060048152602001631213d3d160e21b815250815f90816200009a919062000348565b506001620000a9828262000348565b5050506001600160a01b038116620000db57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b620000e68162000144565b506103e86001600160601b03821611156200012057604051633777017360e01b81526001600160601b0382166004820152602401620000d2565b6001600160a01b038216156200013c576200013c828262000162565b505062000414565b600980546001600160a01b03191690556200015f8162000208565b50565b6127106001600160601b038216811015620001a357604051636f483d0960e01b81526001600160601b038316600482015260248101829052604401620000d2565b6001600160a01b038316620001ce57604051635b6cc80560e11b81525f6004820152602401620000d2565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80604083850312156200026b575f80fd5b82516001600160a01b038116811462000282575f80fd5b60208401519092506001600160601b03811681146200029f575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620002d357607f821691505b602082108103620002f257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200034357805f5260205f20601f840160051c810160208510156200031f5750805b601f840160051c820191505b8181101562000340575f81556001016200032b565b50505b505050565b81516001600160401b03811115620003645762000364620002aa565b6200037c81620003758454620002be565b84620002f8565b602080601f831160018114620003b2575f84156200039a5750858301515b5f19600386901b1c1916600185901b1785556200040c565b5f85815260208120601f198616915b82811015620003e257888601518255948401946001909101908401620003c1565b50858210156200040057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b61279a80620004225f395ff3fe608060405260043610610280575f3560e01c80636dc9877411610155578063ac44ff31116100be578063d111515d11610078578063d111515d146107a7578063e30c3978146107bb578063e985e9c5146107d8578063f2fde38b146107f7578063f3fef3a314610816578063fb3cc6c214610835575f80fd5b8063ac44ff3114610702578063b5545a3c14610715578063b613b11414610729578063b88d4fde14610754578063bdece83a14610773578063c87b56dd14610788575f80fd5b80638d8ec2c71161010f5780638d8ec2c7146106535780638da5cb5b1461066957806395d89b41146106865780639e34070f1461069a578063a22cb465146106d0578063a6ca2905146106ef575f80fd5b80636dc98774146105be57806370a08231146105d2578063715018a6146105f157806379ba5097146106055780638456cb59146106195780638d5555f21461062d575f80fd5b80633672b766116101f757806350188301116101b1578063501883011461051957806355f804b31461052d5780635c975abb1461054c5780636352211e1461056a578063696adcd6146105895780636d5c37a91461059f575f80fd5b80633672b7661461044757806338f833321461047b5780633dca40e61461049a5780633f4ba83a146104c757806342842e0e146104db5780634a405f4c146104fa575f80fd5b80632177b1db116102485780632177b1db1461035057806323b872dd1461037357806326889ac6146103925780632913daa0146103ac5780632a55205a146103ea5780632b26a6bf14610428575f80fd5b806301ffc9a71461028457806304634d8d146102b857806306fdde03146102d9578063081812fc146102fa578063095ea7b314610331575b5f80fd5b34801561028f575f80fd5b506102a361029e3660046120ad565b610855565b60405190151581526020015b60405180910390f35b3480156102c3575f80fd5b506102d76102d23660046120dc565b610865565b005b3480156102e4575f80fd5b506102ed6108b7565b6040516102af919061216b565b348015610305575f80fd5b5061031961031436600461217d565b610946565b6040516001600160a01b0390911681526020016102af565b34801561033c575f80fd5b506102d761034b366004612194565b61096d565b34801561035b575f80fd5b50610365600b5481565b6040519081526020016102af565b34801561037e575f80fd5b506102d761038d3660046121be565b610978565b34801561039d575f80fd5b5061036566027ca57357c00081565b3480156103b7575f80fd5b506009546103d290600160a81b90046001600160401b031681565b6040516001600160401b0390911681526020016102af565b3480156103f5575f80fd5b506104096104043660046121fc565b610a01565b604080516001600160a01b0390931683526020830191909152016102af565b348015610433575f80fd5b506102d761044236600461217d565b610a86565b348015610452575f80fd5b5061046661046136600461217d565b610b36565b604080519283526020830191909152016102af565b348015610486575f80fd5b506102d761049536600461221c565b610b6c565b3480156104a5575f80fd5b506104af6103e881565b6040516001600160601b0390911681526020016102af565b3480156104d2575f80fd5b506102d7610c6d565b3480156104e6575f80fd5b506102d76104f53660046121be565b610c7f565b348015610505575f80fd5b5061036561051436600461217d565b610c9e565b348015610524575f80fd5b50610365610cd4565b348015610538575f80fd5b506102d7610547366004612237565b610cfa565b348015610557575f80fd5b50600954600160a01b900460ff166102a3565b348015610575575f80fd5b5061031961058436600461217d565b610d78565b348015610594575f80fd5b5061036562030d4081565b3480156105aa575f80fd5b506103656105b93660046122e2565b610d82565b3480156105c9575f80fd5b5061036560fa81565b3480156105dd575f80fd5b506103656105ec36600461221c565b610d9b565b3480156105fc575f80fd5b506102d7610de0565b348015610610575f80fd5b506102d7610e01565b348015610624575f80fd5b506102d7610e42565b348015610638575f80fd5b5061036561064736600461217d565b5066027ca57357c00090565b34801561065e575f80fd5b5061036562030d3f81565b348015610674575f80fd5b506008546001600160a01b0316610319565b348015610691575f80fd5b506102ed610e52565b3480156106a5575f80fd5b506102a36106b436600461217d565b5f908152600260205260409020546001600160a01b0316151590565b3480156106db575f80fd5b506102d76106ea366004612320565b610e61565b6102d76106fd366004612350565b610e6c565b6102d76107103660046123aa565b610fe3565b348015610720575f80fd5b506102d76110b7565b348015610734575f80fd5b5061036561074336600461221c565b600c6020525f908152604090205481565b34801561075f575f80fd5b506102d761076e3660046123f4565b611182565b34801561077e575f80fd5b506103656103e881565b348015610793575f80fd5b506102ed6107a236600461217d565b61119a565b3480156107b2575f80fd5b506102d761127f565b3480156107c6575f80fd5b506009546001600160a01b0316610319565b3480156107e3575f80fd5b506102a36107f23660046124cc565b6112ef565b348015610802575f80fd5b506102d761081136600461221c565b61131c565b348015610821575f80fd5b506102d7610830366004612194565b61138d565b348015610840575f80fd5b506009546102a390600160e81b900460ff1681565b5f61085f82611481565b92915050565b61086d6114a5565b6103e86001600160601b03821611156108a957604051633777017360e01b81526001600160601b03821660048201526024015b60405180910390fd5b6108b382826114d2565b5050565b60605f80546108c5906124f8565b80601f01602080910402602001604051908101604052809291908181526020018280546108f1906124f8565b801561093c5780601f106109135761010080835404028352916020019161093c565b820191905f5260205f20905b81548152906001019060200180831161091f57829003601f168201915b5050505050905090565b5f61095082611574565b505f828152600460205260409020546001600160a01b031661085f565b6108b38282336115ac565b6001600160a01b0382166109a157604051633250574960e11b81525f60048201526024016108a0565b5f6109ad8383336115b9565b9050836001600160a01b0316816001600160a01b0316146109fb576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016108a0565b50505050565b5f82815260076020526040812080548291906001600160a01b03811690600160a01b90046001600160601b031681610a545750506006546001600160a01b03811690600160a01b90046001600160601b03165b5f612710610a6b6001600160601b03841689612544565b610a75919061255b565b9295509193505050505b9250929050565b610a8e6114a5565b801580610a9c57506103e881115b15610abd5760405163a6f7498560e01b8152600481018290526024016108a0565b60095460408051600160a81b9092046001600160401b03168252602082018390527f6b141d34195f1cbfa2080571bebbe19ad6d201cc0d1d53c70550795d14a4be83910160405180910390a1600980546001600160401b03909216600160a81b0267ffffffffffffffff60a81b19909216919091179055565b5f8062030d3f831115610b5f57604051633797db4f60e11b8152600481018490526024016108a0565b505060fa029060f9820190565b610b746116ab565b6001600160a01b038116610b9b57604051631d42c86760e21b815260040160405180910390fd5b335f908152600c602052604081205490819003610bcb5760405163df79b9b360e01b815260040160405180910390fd5b335f908152600c60205260408120819055600b8054839290610bee90849061257a565b909155505f90508080808085875af1905080610c1d57604051631d42c86760e21b815260040160405180910390fd5b826001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d065183604051610c5891815260200190565b60405180910390a25050610c6a6116e0565b50565b610c756114a5565b610c7d61170a565b565b610c9983838360405180602001604052805f815250611182565b505050565b5f80610cab60fa8461255b565b905062030d3f81111561085f57604051633797db4f60e11b8152600481018290526024016108a0565b600b545f9047908111610ce7575f610cf4565b600b54610cf4908261257a565b91505090565b610d026114a5565b600954600160e81b900460ff1615610d2d57604051633355c3a160e21b815260040160405180910390fd5b600a610d3a8284836125d1565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051610d6c92919061268a565b60405180910390a15050565b5f61085f82611574565b5f610d9466027ca57357c00083612544565b9392505050565b5f6001600160a01b038216610dc5576040516322718ad960e21b81525f60048201526024016108a0565b506001600160a01b03165f9081526003602052604090205490565b610de86114a5565b604051638905116560e01b815260040160405180910390fd5b60095433906001600160a01b03168114610e395760405163118cdaa760e01b81526001600160a01b03821660048201526024016108a0565b610c6a8161175f565b610e4a6114a5565b610c7d611778565b6060600180546108c5906124f8565b6108b33383836117bb565b610e74611882565b610e7c6116ab565b825f819003610e9e5760405163c2e5347d60e01b815260040160405180910390fd5b600954600160a81b90046001600160401b0316811115610eed5760095460405163bb1cb70b60e01b815260048101839052600160a81b9091046001600160401b031660248201526044016108a0565b5f610eff66027ca57357c00083612544565b90508315801590610f105750808414155b15610f3857604051631d6bbb8d60e11b815260048101859052602481018290526044016108a0565b80341015610f6257604051633cfaf0e160e21b8152346004820152602481018290526044016108a0565b5f6001600160a01b03841615610f785783610f7a565b335b90505f610f8860014361257a565b4090505f5b84811015610fc057610fb8898983818110610faa57610faa6126b8565b9050602002013584846118ad565b600101610f8d565b5034838103908414610fd657610fd633826118c6565b50505050506109fb6116e0565b610feb611882565b610ff36116ab565b8115801590611009575066027ca57357c0008214155b1561103757604051631d6bbb8d60e11b81526004810183905266027ca57357c00060248201526044016108a0565b66027ca57357c00034101561106e57604051633cfaf0e160e21b815234600482015266027ca57357c00060248201526044016108a0565b5f6001600160a01b038216156110845781611086565b335b9050611092848261192c565b66027ca57357bfff19340180156110ad576110ad33826118c6565b5050610c996116e0565b6110bf6116ab565b335f908152600c6020526040812054908190036110ef5760405163df79b9b360e01b815260040160405180910390fd5b335f908152600c60205260408120819055600b805483929061111290849061257a565b909155505f9050338180808086855af191508161114257604051631d42c86760e21b815260040160405180910390fd5b60405183815233907fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06519060200160405180910390a2505050610c7d6116e0565b61118d848484610978565b6109fb3385858585611944565b60606111a582611574565b505f600a80546111b4906124f8565b80601f01602080910402602001604051908101604052809291908181526020018280546111e0906124f8565b801561122b5780601f106112025761010080835404028352916020019161122b565b820191905f5260205f20905b81548152906001019060200180831161120e57829003601f168201915b5050505050905080515f14611269578061124484611a6c565b6040516020016112559291906126cc565b604051602081830303815290604052610d94565b60405180602001604052805f8152509392505050565b6112876114a5565b600954600160e81b900460ff16156112b257604051633355c3a160e21b815260040160405180910390fd5b6009805460ff60e81b1916600160e81b1790556040517feef043febddf4e1d1cf1f72ff1407b84e036e805aa0934418cb82095da8d7164905f90a1565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6113246114a5565b600980546001600160a01b0383166001600160a01b031990911681179091556113556008546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6113956114a5565b61139d6116ab565b6001600160a01b0382166113c457604051631d42c86760e21b815260040160405180910390fd5b5f6113cd610cd4565b90505f82156113dc57826113de565b815b90508181111561140a576040516203900d60e71b815260048101829052602481018390526044016108a0565b5f805f805f85895af190508061143357604051631d42c86760e21b815260040160405180910390fd5b846001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58360405161146e91815260200190565b60405180910390a25050506108b36116e0565b5f6001600160e01b0319821663152a902d60e11b148061085f575061085f82611afb565b6008546001600160a01b03163314610c7d5760405163118cdaa760e01b81523360048201526024016108a0565b6127106001600160601b03821681101561151157604051636f483d0960e01b81526001600160601b0383166004820152602481018290526044016108a0565b6001600160a01b03831661153a57604051635b6cc80560e11b81525f60048201526024016108a0565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b5f818152600260205260408120546001600160a01b03168061085f57604051637e27328960e01b8152600481018490526024016108a0565b610c998383836001611b4a565b5f828152600260205260408120546001600160a01b03908116908316156115e5576115e5818486611c4e565b6001600160a01b0381161561161f576116005f855f80611b4a565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b0385161561164d576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6116b3611cb2565b610c7d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b90611cf2565b610c7d5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006116da565b611712611cf9565b6009805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600980546001600160a01b0319169055610c6a81611d23565b611780611882565b6009805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117423390565b6001600160a01b0383166117e45760405163a9fbf51f60e01b81525f60048201526024016108a0565b6001600160a01b03821661181657604051630b61174360e31b81526001600160a01b03831660048201526024016108a0565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600954600160a01b900460ff1615610c7d5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0382163b15156109fb84848484611d74565b5f61c35081808080868886f19150811561192257836001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518460405161191591815260200190565b60405180910390a26109fb565b6109fb8484611e46565b6108b3828261193c60014361257a565b406001611d74565b6001600160a01b0383163b15611a6557604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906119869088908890879087906004016126fa565b6020604051808303815f875af19250505080156119c0575060408051601f3d908101601f191682019092526119bd91810190612736565b60015b611a27573d8080156119ed576040519150601f19603f3d011682016040523d82523d5f602084013e6119f2565b606091505b5080515f03611a1f57604051633250574960e11b81526001600160a01b03851660048201526024016108a0565b805160208201fd5b6001600160e01b03198116630a85bd0160e11b14611a6357604051633250574960e11b81526001600160a01b03851660048201526024016108a0565b505b5050505050565b60605f611a7883611ecc565b60010190505f816001600160401b03811115611a9657611a966123e0565b6040519080825280601f01601f191660200182016040528015611ac0576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611aca57509392505050565b5f6001600160e01b031982166380ac58cd60e01b1480611b2b57506001600160e01b03198216635b5e139f60e01b145b8061085f57506301ffc9a760e01b6001600160e01b031983161461085f565b8080611b5e57506001600160a01b03821615155b15611c1f575f611b6d84611574565b90506001600160a01b03831615801590611b995750826001600160a01b0316816001600160a01b031614155b8015611bac5750611baa81846112ef565b155b15611bd55760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016108a0565b8115611c1d5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b611c59838383611fa3565b610c99576001600160a01b038316611c8757604051637e27328960e01b8152600481018290526024016108a0565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016108a0565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15610c7d57604051633ee5aeb560e01b815260040160405180910390fd5b80825d5050565b600954600160a01b900460ff16610c7d57604051638dfc202b60e01b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b62030d3f841115611d9b57604051633797db4f60e11b8152600481018590526024016108a0565b5f848152600260205260409020546001600160a01b031615611dd35760405163598b3dfd60e11b8152600481018590526024016108a0565b8015611de857611de38385612007565b611df2565b611df28385612020565b336001600160a01b0316836001600160a01b0316857fb3e2e64c646c8dd2bdc4c84e3548af0340329b466aad36aededb6c07e0f8510285604051611e3891815260200190565b60405180910390a450505050565b6001600160a01b0382165f908152600c602052604081208054839290611e6d908490612751565b9250508190555080600b5f828254611e859190612751565b90915550506040518181526001600160a01b038316907fe20788b1e4d91df298f8d39cd08a18e6ddb5755f173db2466a405737d8640a7b9060200160405180910390a25050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611f0a5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611f36576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611f5457662386f26fc10000830492506010015b6305f5e1008310611f6c576305f5e100830492506008015b6127108310611f8057612710830492506004015b60648310611f92576064830492506002015b600a831061085f5760010192915050565b5f6001600160a01b03831615801590611fff5750826001600160a01b0316846001600160a01b03161480611fdc5750611fdc84846112ef565b80611fff57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6108b3828260405180602001604052805f815250612081565b6001600160a01b03821661204957604051633250574960e11b81525f60048201526024016108a0565b5f61205583835f6115b9565b90506001600160a01b03811615610c99576040516339e3563760e11b81525f60048201526024016108a0565b61208b8383612020565b610c99335f858585611944565b6001600160e01b031981168114610c6a575f80fd5b5f602082840312156120bd575f80fd5b8135610d9481612098565b6001600160a01b0381168114610c6a575f80fd5b5f80604083850312156120ed575f80fd5b82356120f8816120c8565b915060208301356001600160601b0381168114612113575f80fd5b809150509250929050565b5f5b83811015612138578181015183820152602001612120565b50505f910152565b5f815180845261215781602086016020860161211e565b601f01601f19169290920160200192915050565b602081525f610d946020830184612140565b5f6020828403121561218d575f80fd5b5035919050565b5f80604083850312156121a5575f80fd5b82356121b0816120c8565b946020939093013593505050565b5f805f606084860312156121d0575f80fd5b83356121db816120c8565b925060208401356121eb816120c8565b929592945050506040919091013590565b5f806040838503121561220d575f80fd5b50508035926020909101359150565b5f6020828403121561222c575f80fd5b8135610d94816120c8565b5f8060208385031215612248575f80fd5b82356001600160401b038082111561225e575f80fd5b818501915085601f830112612271575f80fd5b81358181111561227f575f80fd5b866020828501011115612290575f80fd5b60209290920196919550909350505050565b5f8083601f8401126122b2575f80fd5b5081356001600160401b038111156122c8575f80fd5b6020830191508360208260051b8501011115610a7f575f80fd5b5f80602083850312156122f3575f80fd5b82356001600160401b03811115612308575f80fd5b612314858286016122a2565b90969095509350505050565b5f8060408385031215612331575f80fd5b823561233c816120c8565b915060208301358015158114612113575f80fd5b5f805f8060608587031215612363575f80fd5b84356001600160401b03811115612378575f80fd5b612384878288016122a2565b90955093505060208501359150604085013561239f816120c8565b939692955090935050565b5f805f606084860312156123bc575f80fd5b833592506020840135915060408401356123d5816120c8565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612407575f80fd5b8435612412816120c8565b93506020850135612422816120c8565b92506040850135915060608501356001600160401b0380821115612444575f80fd5b818701915087601f830112612457575f80fd5b813581811115612469576124696123e0565b604051601f8201601f19908116603f01168101908382118183101715612491576124916123e0565b816040528281528a60208487010111156124a9575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156124dd575f80fd5b82356124e8816120c8565b91506020830135612113816120c8565b600181811c9082168061250c57607f821691505b60208210810361252a57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761085f5761085f612530565b5f8261257557634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561085f5761085f612530565b601f821115610c9957805f5260205f20601f840160051c810160208510156125b25750805b601f840160051c820191505b81811015611a65575f81556001016125be565b6001600160401b038311156125e8576125e86123e0565b6125fc836125f683546124f8565b8361258d565b5f601f84116001811461262d575f85156126165750838201355b5f19600387901b1c1916600186901b178355611a65565b5f83815260208120601f198716915b8281101561265c578685013582556020948501946001909201910161263c565b5086821015612678575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b5f83516126dd81846020880161211e565b8351908301906126f181836020880161211e565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061272c90830184612140565b9695505050505050565b5f60208284031215612746575f80fd5b8151610d9481612098565b8082018082111561085f5761085f61253056fea26469706673582212203c4af1b31b6607c59fa4c463189982c43c0e82efa4a7bd5fd1c2bff39612a80864736f6c63430008180033000000000000000000000000e3a972cdd37ee5196d0baaf68e591b3f6bd1aa6100000000000000000000000000000000000000000000000000000000000001f4
0x608060405260043610610280575f3560e01c80636dc9877411610155578063ac44ff31116100be578063d111515d11610078578063d111515d146107a7578063e30c3978146107bb578063e985e9c5146107d8578063f2fde38b146107f7578063f3fef3a314610816578063fb3cc6c214610835575f80fd5b8063ac44ff3114610702578063b5545a3c14610715578063b613b11414610729578063b88d4fde14610754578063bdece83a14610773578063c87b56dd14610788575f80fd5b80638d8ec2c71161010f5780638d8ec2c7146106535780638da5cb5b1461066957806395d89b41146106865780639e34070f1461069a578063a22cb465146106d0578063a6ca2905146106ef575f80fd5b80636dc98774146105be57806370a08231146105d2578063715018a6146105f157806379ba5097146106055780638456cb59146106195780638d5555f21461062d575f80fd5b80633672b766116101f757806350188301116101b1578063501883011461051957806355f804b31461052d5780635c975abb1461054c5780636352211e1461056a578063696adcd6146105895780636d5c37a91461059f575f80fd5b80633672b7661461044757806338f833321461047b5780633dca40e61461049a5780633f4ba83a146104c757806342842e0e146104db5780634a405f4c146104fa575f80fd5b80632177b1db116102485780632177b1db1461035057806323b872dd1461037357806326889ac6146103925780632913daa0146103ac5780632a55205a146103ea5780632b26a6bf14610428575f80fd5b806301ffc9a71461028457806304634d8d146102b857806306fdde03146102d9578063081812fc146102fa578063095ea7b314610331575b5f80fd5b34801561028f575f80fd5b506102a361029e3660046120ad565b610855565b60405190151581526020015b60405180910390f35b3480156102c3575f80fd5b506102d76102d23660046120dc565b610865565b005b3480156102e4575f80fd5b506102ed6108b7565b6040516102af919061216b565b348015610305575f80fd5b5061031961031436600461217d565b610946565b6040516001600160a01b0390911681526020016102af565b34801561033c575f80fd5b506102d761034b366004612194565b61096d565b34801561035b575f80fd5b50610365600b5481565b6040519081526020016102af565b34801561037e575f80fd5b506102d761038d3660046121be565b610978565b34801561039d575f80fd5b5061036566027ca57357c00081565b3480156103b7575f80fd5b506009546103d290600160a81b90046001600160401b031681565b6040516001600160401b0390911681526020016102af565b3480156103f5575f80fd5b506104096104043660046121fc565b610a01565b604080516001600160a01b0390931683526020830191909152016102af565b348015610433575f80fd5b506102d761044236600461217d565b610a86565b348015610452575f80fd5b5061046661046136600461217d565b610b36565b604080519283526020830191909152016102af565b348015610486575f80fd5b506102d761049536600461221c565b610b6c565b3480156104a5575f80fd5b506104af6103e881565b6040516001600160601b0390911681526020016102af565b3480156104d2575f80fd5b506102d7610c6d565b3480156104e6575f80fd5b506102d76104f53660046121be565b610c7f565b348015610505575f80fd5b5061036561051436600461217d565b610c9e565b348015610524575f80fd5b50610365610cd4565b348015610538575f80fd5b506102d7610547366004612237565b610cfa565b348015610557575f80fd5b50600954600160a01b900460ff166102a3565b348015610575575f80fd5b5061031961058436600461217d565b610d78565b348015610594575f80fd5b5061036562030d4081565b3480156105aa575f80fd5b506103656105b93660046122e2565b610d82565b3480156105c9575f80fd5b5061036560fa81565b3480156105dd575f80fd5b506103656105ec36600461221c565b610d9b565b3480156105fc575f80fd5b506102d7610de0565b348015610610575f80fd5b506102d7610e01565b348015610624575f80fd5b506102d7610e42565b348015610638575f80fd5b5061036561064736600461217d565b5066027ca57357c00090565b34801561065e575f80fd5b5061036562030d3f81565b348015610674575f80fd5b506008546001600160a01b0316610319565b348015610691575f80fd5b506102ed610e52565b3480156106a5575f80fd5b506102a36106b436600461217d565b5f908152600260205260409020546001600160a01b0316151590565b3480156106db575f80fd5b506102d76106ea366004612320565b610e61565b6102d76106fd366004612350565b610e6c565b6102d76107103660046123aa565b610fe3565b348015610720575f80fd5b506102d76110b7565b348015610734575f80fd5b5061036561074336600461221c565b600c6020525f908152604090205481565b34801561075f575f80fd5b506102d761076e3660046123f4565b611182565b34801561077e575f80fd5b506103656103e881565b348015610793575f80fd5b506102ed6107a236600461217d565b61119a565b3480156107b2575f80fd5b506102d761127f565b3480156107c6575f80fd5b506009546001600160a01b0316610319565b3480156107e3575f80fd5b506102a36107f23660046124cc565b6112ef565b348015610802575f80fd5b506102d761081136600461221c565b61131c565b348015610821575f80fd5b506102d7610830366004612194565b61138d565b348015610840575f80fd5b506009546102a390600160e81b900460ff1681565b5f61085f82611481565b92915050565b61086d6114a5565b6103e86001600160601b03821611156108a957604051633777017360e01b81526001600160601b03821660048201526024015b60405180910390fd5b6108b382826114d2565b5050565b60605f80546108c5906124f8565b80601f01602080910402602001604051908101604052809291908181526020018280546108f1906124f8565b801561093c5780601f106109135761010080835404028352916020019161093c565b820191905f5260205f20905b81548152906001019060200180831161091f57829003601f168201915b5050505050905090565b5f61095082611574565b505f828152600460205260409020546001600160a01b031661085f565b6108b38282336115ac565b6001600160a01b0382166109a157604051633250574960e11b81525f60048201526024016108a0565b5f6109ad8383336115b9565b9050836001600160a01b0316816001600160a01b0316146109fb576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016108a0565b50505050565b5f82815260076020526040812080548291906001600160a01b03811690600160a01b90046001600160601b031681610a545750506006546001600160a01b03811690600160a01b90046001600160601b03165b5f612710610a6b6001600160601b03841689612544565b610a75919061255b565b9295509193505050505b9250929050565b610a8e6114a5565b801580610a9c57506103e881115b15610abd5760405163a6f7498560e01b8152600481018290526024016108a0565b60095460408051600160a81b9092046001600160401b03168252602082018390527f6b141d34195f1cbfa2080571bebbe19ad6d201cc0d1d53c70550795d14a4be83910160405180910390a1600980546001600160401b03909216600160a81b0267ffffffffffffffff60a81b19909216919091179055565b5f8062030d3f831115610b5f57604051633797db4f60e11b8152600481018490526024016108a0565b505060fa029060f9820190565b610b746116ab565b6001600160a01b038116610b9b57604051631d42c86760e21b815260040160405180910390fd5b335f908152600c602052604081205490819003610bcb5760405163df79b9b360e01b815260040160405180910390fd5b335f908152600c60205260408120819055600b8054839290610bee90849061257a565b909155505f90508080808085875af1905080610c1d57604051631d42c86760e21b815260040160405180910390fd5b826001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d065183604051610c5891815260200190565b60405180910390a25050610c6a6116e0565b50565b610c756114a5565b610c7d61170a565b565b610c9983838360405180602001604052805f815250611182565b505050565b5f80610cab60fa8461255b565b905062030d3f81111561085f57604051633797db4f60e11b8152600481018290526024016108a0565b600b545f9047908111610ce7575f610cf4565b600b54610cf4908261257a565b91505090565b610d026114a5565b600954600160e81b900460ff1615610d2d57604051633355c3a160e21b815260040160405180910390fd5b600a610d3a8284836125d1565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051610d6c92919061268a565b60405180910390a15050565b5f61085f82611574565b5f610d9466027ca57357c00083612544565b9392505050565b5f6001600160a01b038216610dc5576040516322718ad960e21b81525f60048201526024016108a0565b506001600160a01b03165f9081526003602052604090205490565b610de86114a5565b604051638905116560e01b815260040160405180910390fd5b60095433906001600160a01b03168114610e395760405163118cdaa760e01b81526001600160a01b03821660048201526024016108a0565b610c6a8161175f565b610e4a6114a5565b610c7d611778565b6060600180546108c5906124f8565b6108b33383836117bb565b610e74611882565b610e7c6116ab565b825f819003610e9e5760405163c2e5347d60e01b815260040160405180910390fd5b600954600160a81b90046001600160401b0316811115610eed5760095460405163bb1cb70b60e01b815260048101839052600160a81b9091046001600160401b031660248201526044016108a0565b5f610eff66027ca57357c00083612544565b90508315801590610f105750808414155b15610f3857604051631d6bbb8d60e11b815260048101859052602481018290526044016108a0565b80341015610f6257604051633cfaf0e160e21b8152346004820152602481018290526044016108a0565b5f6001600160a01b03841615610f785783610f7a565b335b90505f610f8860014361257a565b4090505f5b84811015610fc057610fb8898983818110610faa57610faa6126b8565b9050602002013584846118ad565b600101610f8d565b5034838103908414610fd657610fd633826118c6565b50505050506109fb6116e0565b610feb611882565b610ff36116ab565b8115801590611009575066027ca57357c0008214155b1561103757604051631d6bbb8d60e11b81526004810183905266027ca57357c00060248201526044016108a0565b66027ca57357c00034101561106e57604051633cfaf0e160e21b815234600482015266027ca57357c00060248201526044016108a0565b5f6001600160a01b038216156110845781611086565b335b9050611092848261192c565b66027ca57357bfff19340180156110ad576110ad33826118c6565b5050610c996116e0565b6110bf6116ab565b335f908152600c6020526040812054908190036110ef5760405163df79b9b360e01b815260040160405180910390fd5b335f908152600c60205260408120819055600b805483929061111290849061257a565b909155505f9050338180808086855af191508161114257604051631d42c86760e21b815260040160405180910390fd5b60405183815233907fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06519060200160405180910390a2505050610c7d6116e0565b61118d848484610978565b6109fb3385858585611944565b60606111a582611574565b505f600a80546111b4906124f8565b80601f01602080910402602001604051908101604052809291908181526020018280546111e0906124f8565b801561122b5780601f106112025761010080835404028352916020019161122b565b820191905f5260205f20905b81548152906001019060200180831161120e57829003601f168201915b5050505050905080515f14611269578061124484611a6c565b6040516020016112559291906126cc565b604051602081830303815290604052610d94565b60405180602001604052805f8152509392505050565b6112876114a5565b600954600160e81b900460ff16156112b257604051633355c3a160e21b815260040160405180910390fd5b6009805460ff60e81b1916600160e81b1790556040517feef043febddf4e1d1cf1f72ff1407b84e036e805aa0934418cb82095da8d7164905f90a1565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6113246114a5565b600980546001600160a01b0383166001600160a01b031990911681179091556113556008546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6113956114a5565b61139d6116ab565b6001600160a01b0382166113c457604051631d42c86760e21b815260040160405180910390fd5b5f6113cd610cd4565b90505f82156113dc57826113de565b815b90508181111561140a576040516203900d60e71b815260048101829052602481018390526044016108a0565b5f805f805f85895af190508061143357604051631d42c86760e21b815260040160405180910390fd5b846001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58360405161146e91815260200190565b60405180910390a25050506108b36116e0565b5f6001600160e01b0319821663152a902d60e11b148061085f575061085f82611afb565b6008546001600160a01b03163314610c7d5760405163118cdaa760e01b81523360048201526024016108a0565b6127106001600160601b03821681101561151157604051636f483d0960e01b81526001600160601b0383166004820152602481018290526044016108a0565b6001600160a01b03831661153a57604051635b6cc80560e11b81525f60048201526024016108a0565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b5f818152600260205260408120546001600160a01b03168061085f57604051637e27328960e01b8152600481018490526024016108a0565b610c998383836001611b4a565b5f828152600260205260408120546001600160a01b03908116908316156115e5576115e5818486611c4e565b6001600160a01b0381161561161f576116005f855f80611b4a565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b0385161561164d576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6116b3611cb2565b610c7d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b90611cf2565b610c7d5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006116da565b611712611cf9565b6009805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600980546001600160a01b0319169055610c6a81611d23565b611780611882565b6009805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117423390565b6001600160a01b0383166117e45760405163a9fbf51f60e01b81525f60048201526024016108a0565b6001600160a01b03821661181657604051630b61174360e31b81526001600160a01b03831660048201526024016108a0565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600954600160a01b900460ff1615610c7d5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0382163b15156109fb84848484611d74565b5f61c35081808080868886f19150811561192257836001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518460405161191591815260200190565b60405180910390a26109fb565b6109fb8484611e46565b6108b3828261193c60014361257a565b406001611d74565b6001600160a01b0383163b15611a6557604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906119869088908890879087906004016126fa565b6020604051808303815f875af19250505080156119c0575060408051601f3d908101601f191682019092526119bd91810190612736565b60015b611a27573d8080156119ed576040519150601f19603f3d011682016040523d82523d5f602084013e6119f2565b606091505b5080515f03611a1f57604051633250574960e11b81526001600160a01b03851660048201526024016108a0565b805160208201fd5b6001600160e01b03198116630a85bd0160e11b14611a6357604051633250574960e11b81526001600160a01b03851660048201526024016108a0565b505b5050505050565b60605f611a7883611ecc565b60010190505f816001600160401b03811115611a9657611a966123e0565b6040519080825280601f01601f191660200182016040528015611ac0576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611aca57509392505050565b5f6001600160e01b031982166380ac58cd60e01b1480611b2b57506001600160e01b03198216635b5e139f60e01b145b8061085f57506301ffc9a760e01b6001600160e01b031983161461085f565b8080611b5e57506001600160a01b03821615155b15611c1f575f611b6d84611574565b90506001600160a01b03831615801590611b995750826001600160a01b0316816001600160a01b031614155b8015611bac5750611baa81846112ef565b155b15611bd55760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016108a0565b8115611c1d5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b611c59838383611fa3565b610c99576001600160a01b038316611c8757604051637e27328960e01b8152600481018290526024016108a0565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016108a0565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15610c7d57604051633ee5aeb560e01b815260040160405180910390fd5b80825d5050565b600954600160a01b900460ff16610c7d57604051638dfc202b60e01b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b62030d3f841115611d9b57604051633797db4f60e11b8152600481018590526024016108a0565b5f848152600260205260409020546001600160a01b031615611dd35760405163598b3dfd60e11b8152600481018590526024016108a0565b8015611de857611de38385612007565b611df2565b611df28385612020565b336001600160a01b0316836001600160a01b0316857fb3e2e64c646c8dd2bdc4c84e3548af0340329b466aad36aededb6c07e0f8510285604051611e3891815260200190565b60405180910390a450505050565b6001600160a01b0382165f908152600c602052604081208054839290611e6d908490612751565b9250508190555080600b5f828254611e859190612751565b90915550506040518181526001600160a01b038316907fe20788b1e4d91df298f8d39cd08a18e6ddb5755f173db2466a405737d8640a7b9060200160405180910390a25050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611f0a5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611f36576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611f5457662386f26fc10000830492506010015b6305f5e1008310611f6c576305f5e100830492506008015b6127108310611f8057612710830492506004015b60648310611f92576064830492506002015b600a831061085f5760010192915050565b5f6001600160a01b03831615801590611fff5750826001600160a01b0316846001600160a01b03161480611fdc5750611fdc84846112ef565b80611fff57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6108b3828260405180602001604052805f815250612081565b6001600160a01b03821661204957604051633250574960e11b81525f60048201526024016108a0565b5f61205583835f6115b9565b90506001600160a01b03811615610c99576040516339e3563760e11b81525f60048201526024016108a0565b61208b8383612020565b610c99335f858585611944565b6001600160e01b031981168114610c6a575f80fd5b5f602082840312156120bd575f80fd5b8135610d9481612098565b6001600160a01b0381168114610c6a575f80fd5b5f80604083850312156120ed575f80fd5b82356120f8816120c8565b915060208301356001600160601b0381168114612113575f80fd5b809150509250929050565b5f5b83811015612138578181015183820152602001612120565b50505f910152565b5f815180845261215781602086016020860161211e565b601f01601f19169290920160200192915050565b602081525f610d946020830184612140565b5f6020828403121561218d575f80fd5b5035919050565b5f80604083850312156121a5575f80fd5b82356121b0816120c8565b946020939093013593505050565b5f805f606084860312156121d0575f80fd5b83356121db816120c8565b925060208401356121eb816120c8565b929592945050506040919091013590565b5f806040838503121561220d575f80fd5b50508035926020909101359150565b5f6020828403121561222c575f80fd5b8135610d94816120c8565b5f8060208385031215612248575f80fd5b82356001600160401b038082111561225e575f80fd5b818501915085601f830112612271575f80fd5b81358181111561227f575f80fd5b866020828501011115612290575f80fd5b60209290920196919550909350505050565b5f8083601f8401126122b2575f80fd5b5081356001600160401b038111156122c8575f80fd5b6020830191508360208260051b8501011115610a7f575f80fd5b5f80602083850312156122f3575f80fd5b82356001600160401b03811115612308575f80fd5b612314858286016122a2565b90969095509350505050565b5f8060408385031215612331575f80fd5b823561233c816120c8565b915060208301358015158114612113575f80fd5b5f805f8060608587031215612363575f80fd5b84356001600160401b03811115612378575f80fd5b612384878288016122a2565b90955093505060208501359150604085013561239f816120c8565b939692955090935050565b5f805f606084860312156123bc575f80fd5b833592506020840135915060408401356123d5816120c8565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612407575f80fd5b8435612412816120c8565b93506020850135612422816120c8565b92506040850135915060608501356001600160401b0380821115612444575f80fd5b818701915087601f830112612457575f80fd5b813581811115612469576124696123e0565b604051601f8201601f19908116603f01168101908382118183101715612491576124916123e0565b816040528281528a60208487010111156124a9575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156124dd575f80fd5b82356124e8816120c8565b91506020830135612113816120c8565b600181811c9082168061250c57607f821691505b60208210810361252a57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761085f5761085f612530565b5f8261257557634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561085f5761085f612530565b601f821115610c9957805f5260205f20601f840160051c810160208510156125b25750805b601f840160051c820191505b81811015611a65575f81556001016125be565b6001600160401b038311156125e8576125e86123e0565b6125fc836125f683546124f8565b8361258d565b5f601f84116001811461262d575f85156126165750838201355b5f19600387901b1c1916600186901b178355611a65565b5f83815260208120601f198716915b8281101561265c578685013582556020948501946001909201910161263c565b5086821015612678575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b5f83516126dd81846020880161211e565b8351908301906126f181836020880161211e565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061272c90830184612140565b9695505050505050565b5f60208284031215612746575f80fd5b8151610d9481612098565b8082018082111561085f5761085f61253056fea26469706673582212203c4af1b31b6607c59fa4c463189982c43c0e82efa4a7bd5fd1c2bff39612a80864736f6c63430008180033
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xdf3ea6…d0a4ac | claim | 11,309,825 | 32 days agoThu, 16 Jul 2026 13:56:12 UTC | 0xe3a9…aa61 | IN | Hoodmap | $1.330.0007 ETH | 0.00000476 |