// SPDX-License-Identifier: MIT
pragma solidity 0.8.33;
// ============================================================
// HOODMAPS — ERC-721C + SSTORE2 (WL/Public relaunch)
// 21,000 cap | genesis 3,323 | sequential mint | on-chain pixel SVG
// Phase 1: whitelist (merkle-gated, free, 1hr) -> Phase 2: public (free)
// owner airdrop(address[]) | 5% royalties | data via SSTORE2
// ============================================================
// Compiler: 0.8.33, optimizer ON (runs 50), EVM: paris
// ============================================================
import { OwnableBasic } from "@limitbreak/creator-token-standards/src/access/OwnableBasic.sol";
import { ERC721C } from "@limitbreak/creator-token-standards/src/erc721c/ERC721C.sol";
import { ERC721OpenZeppelin } from "@limitbreak/creator-token-standards/src/token/erc721/ERC721OpenZeppelin.sol";
import { BasicRoyalties, ERC2981 } from "@limitbreak/creator-token-standards/src/programmable-royalties/BasicRoyalties.sol";
import "@openzeppelin/contracts@4.8.3/utils/Strings.sol";
import "@openzeppelin/contracts@4.8.3/utils/Base64.sol";
import "@openzeppelin/contracts@4.8.3/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts@4.8.3/utils/cryptography/MerkleProof.sol";
/// @dev Minimal SSTORE2 (based on the well-audited Solmate/0xSequence pattern).
/// Stores `data` as the runtime code of a tiny contract, prefixed with a STOP (0x00)
/// byte so the stored data can never be executed. Read back via extcodecopy.
library SSTORE2 {
// Creation code that returns (STOP ++ data) as runtime bytecode:
// 0x60_0B PUSH1 11 (offset where runtime begins in this creation code)
// 0x59 MSIZE -> 0
// 0x81 DUP2
// 0x38 CODESIZE
// 0x03 SUB -> runtime length
// 0x80 DUP1
// 0x92 SWAP3
// 0x59 MSIZE -> 0
// 0x39 CODECOPY
// 0x59 MSIZE -> 0
// 0xF3 RETURN
// 0x00 STOP (first runtime byte; guarantees data is non-executable)
function write(bytes memory data) internal returns (address ptr) {
bytes memory code = abi.encodePacked(hex"600B5981380380925939F300", data);
assembly { ptr := create(0, add(code, 0x20), mload(code)) }
require(ptr != address(0), "SSTORE2: write failed");
}
function read(address ptr, uint256 start, uint256 end) internal view returns (bytes memory data) {
uint256 len = end - start;
data = new bytes(len);
assembly { extcodecopy(ptr, add(data, 0x20), add(start, 1), len) } // +1 skips STOP byte
}
function codeLen(address ptr) internal view returns (uint256) {
return ptr.code.length - 1; // minus the STOP byte
}
}
contract HoodMaps is ERC721C, BasicRoyalties, OwnableBasic, ReentrancyGuard {
using Strings for uint256;
// ===================== CONSTANTS =====================
uint256 public constant MAX_SUPPLY = 21000;
uint96 public constant ROYALTY_BPS = 500;
uint256 internal constant PLOT_BYTES = 20; // packed bytes per plot (see _pack)
// ===================== SUPPLY =====================
uint256 public genesisSupply = 3323; // mintable genesis pool (<= MAX_SUPPLY)
uint256 public totalSupply; // number minted so far (== last tokenId)
// SSTORE2 data chunks, appended in order. Each holds N plots' packed bytes.
address[] public dataChunks;
uint256 public plotsStored; // how many plots have data uploaded
// ===================== PHASES / MINT CONTROLS =====================
// Phase gating by timestamp: wlStart <= now < publicStart => WL only
// now >= publicStart => public
uint64 public wlStart; // whitelist phase start (unix)
uint64 public publicStart; // public phase start (unix)
bool public paused = true; // hard kill-switch over everything
bytes32 public merkleRoot; // whitelist allowlist root
uint256 public wlMintsPerWallet = 1; // cap during WL (1 per wallet)
uint256 public publicMintsPerWallet = 2; // cap during public
mapping(address => uint256) public mintedBy; // lifetime minted per wallet
string public description =
"HoodMaps is a fully on-chain collection mapping the genesis activity of Robinhood Chain. Each plot is a real slice of the chain, rendered on-chain from its own transaction data.";
// ===================== EVENTS =====================
event PlotMinted(address indexed to, uint256 indexed tokenId);
event DataChunkAdded(uint256 chunkIndex, uint256 plotsInChunk, uint256 plotsStored);
event PhasesSet(uint64 wlStart, uint64 publicStart);
event MerkleRootSet(bytes32 root);
event PausedSet(bool paused);
event Airdropped(uint256 count, uint256 newTotal);
event Withdrawn(address indexed to, uint256 amount);
// ===================== ERRORS =====================
error MintPaused();
error OutOfRange();
error SoldOut();
error WalletLimitReached();
error NotWhitelisted();
error WLNotStarted();
error PublicNotStarted();
error ZeroAddress();
error NothingToWithdraw();
error WithdrawFailed();
error NonexistentToken();
error DataMissing();
error BadChunk();
constructor(address royaltyReceiver_)
ERC721OpenZeppelin("HoodMaps", "HOOD")
OwnableBasic()
BasicRoyalties(royaltyReceiver_, ROYALTY_BPS)
{}
// ================================================================
// PUBLIC MINT
// ================================================================
/// @dev current phase: 0 = closed, 1 = whitelist, 2 = public
function phase() public view returns (uint8) {
if (paused) return 0;
if (wlStart == 0) return 0; // phases not configured yet
if (publicStart != 0 && block.timestamp >= publicStart) return 2;
if (block.timestamp >= wlStart) return 1;
return 0;
}
/// @notice Whitelist mint (free). Requires a valid merkle proof for msg.sender.
function whitelistMint(uint256 quantity, bytes32[] calldata proof) external nonReentrant {
if (phase() != 1) revert WLNotStarted();
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
if (!MerkleProof.verifyCalldata(proof, merkleRoot, leaf)) revert NotWhitelisted();
if (mintedBy[msg.sender] + quantity > wlMintsPerWallet) revert WalletLimitReached();
_mintMany(msg.sender, quantity);
}
/// @notice Public mint (free).
function mint(uint256 quantity) external nonReentrant {
if (phase() != 2) revert PublicNotStarted();
if (mintedBy[msg.sender] + quantity > publicMintsPerWallet) revert WalletLimitReached();
_mintMany(msg.sender, quantity);
}
function _mintMany(address to, uint256 quantity) internal {
if (quantity == 0) revert OutOfRange();
if (totalSupply + quantity > genesisSupply) revert SoldOut();
mintedBy[to] += quantity;
for (uint256 i = 0; i < quantity; i++) {
uint256 id = ++totalSupply; // sequential 1,2,3...
_mint(to, id);
emit PlotMinted(to, id);
}
}
// ================================================================
// DATA READ (SSTORE2)
// ================================================================
// Plot i (0-indexed = tokenId-1) is stored at global byte offset i*PLOT_BYTES,
// spread across dataChunks in order. Each chunk holds a whole number of plots.
function _readPlot(uint256 tokenId) internal view returns (bytes memory) {
uint256 gi = tokenId - 1; // global plot index
if (gi >= plotsStored) revert DataMissing();
uint256 seen = 0;
for (uint256 c = 0; c < dataChunks.length; c++) {
uint256 plotsHere = SSTORE2.codeLen(dataChunks[c]) / PLOT_BYTES;
if (gi < seen + plotsHere) {
uint256 local = gi - seen;
return SSTORE2.read(dataChunks[c], local * PLOT_BYTES, local * PLOT_BYTES + PLOT_BYTES);
}
seen += plotsHere;
}
revert DataMissing();
}
// unpack 20-byte record: tx(4) blocks(2) maxTx(2) gasK(4) firstBlock(4) lastBlock(4)
function _fields(uint256 tokenId) internal view returns (
uint256 tx_, uint256 blocks_, uint256 maxTx_, uint256 gasK, uint256 fb, uint256 lb
) {
bytes memory b = _readPlot(tokenId);
tx_ = _u(b, 0, 4);
blocks_ = _u(b, 4, 2);
maxTx_ = _u(b, 6, 2);
gasK = _u(b, 8, 4);
fb = _u(b, 12, 4);
lb = _u(b, 16, 4);
}
function _u(bytes memory b, uint256 off, uint256 n) internal pure returns (uint256 v) {
for (uint256 i = 0; i < n; i++) { v = (v << 8) | uint8(b[off + i]); }
}
// ================================================================
// METADATA
// ================================================================
function tokenURI(uint256 tokenId) public view override returns (string memory) {
if (!_exists(tokenId)) revert NonexistentToken();
(uint256 tx_, uint256 blocks_, uint256 maxTx_, , , ) = _fields(tokenId);
string memory image = string(abi.encodePacked(
"data:image/svg+xml;base64,", Base64.encode(bytes(_renderSVG(tokenId, tx_, blocks_, maxTx_)))
));
string memory json = string(abi.encodePacked(
'{"name":"HoodMap #', tokenId.toString(),
'","description":"', description,
'","attributes":[', _attributes(tokenId),
'],"image":"', image, '"}'
));
return string(abi.encodePacked("data:application/json;base64,", Base64.encode(bytes(json))));
}
function _attributes(uint256 tokenId) internal view returns (string memory) {
(uint256 tx_, uint256 blocks_, uint256 maxTx_, uint256 gasK, uint256 fb, uint256 lb) = _fields(tokenId);
return string(abi.encodePacked(
'{"trait_type":"Transactions","value":', tx_.toString(), '},',
'{"trait_type":"Blocks","value":', blocks_.toString(), '},',
'{"trait_type":"Busiest Block","value":', maxTx_.toString(), '},',
_attributes2(gasK, fb, lb)
));
}
function _attributes2(uint256 gasK, uint256 fb, uint256 lb) internal pure returns (string memory) {
return string(abi.encodePacked(
'{"trait_type":"Gas (k)","value":', gasK.toString(), '},',
'{"trait_type":"First Block","value":', fb.toString(), '},',
'{"trait_type":"Last Block","value":', lb.toString(), '}'
));
}
// ================================================================
// ON-CHAIN PIXEL RENDER
// ================================================================
function _renderSVG(uint256 id, uint256 tx_, uint256 blocks_, uint256 maxTx_)
internal pure returns (string memory)
{
blocks_; maxTx_;
uint256 density = tx_ >= 380 ? 100 : (tx_ * 100) / 380;
uint256 bigChance = (density * 60) / 100;
bool[256] memory covered;
string memory cells = "";
for (uint256 gy = 0; gy < 16; gy++) {
for (uint256 gx = 0; gx < 16; gx++) {
if (covered[gy * 16 + gx]) continue;
uint256 hsh = uint256(keccak256(abi.encodePacked(id, gy * 16 + gx)));
if (hsh % 100 > (density * 85) / 100) continue;
uint256 span = _pickSpan(hsh, gx, gy, bigChance);
if (!_spanFree(covered, gx, gy, span)) span = 1;
_mark(covered, gx, gy, span);
cells = string(abi.encodePacked(cells, _rect(hsh, gx, gy, span)));
}
}
return string(abi.encodePacked(
'<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500">',
'<rect width="500" height="500" rx="26" fill="#000000"/>', cells, '</svg>'
));
}
function _pickSpan(uint256 hsh, uint256 gx, uint256 gy, uint256 bigChance) internal pure returns (uint256) {
uint256 r3 = (hsh >> 16) % 100;
if (r3 < bigChance && gx < 14 && gy < 14) return 3;
if (r3 < bigChance + 22 && gx < 15 && gy < 15) return 2;
return 1;
}
function _spanFree(bool[256] memory covered, uint256 gx, uint256 gy, uint256 span) internal pure returns (bool) {
for (uint256 dy = 0; dy < span; dy++)
for (uint256 dx = 0; dx < span; dx++)
if (covered[(gy + dy) * 16 + (gx + dx)]) return false;
return true;
}
function _mark(bool[256] memory covered, uint256 gx, uint256 gy, uint256 span) internal pure {
for (uint256 dy = 0; dy < span; dy++)
for (uint256 dx = 0; dx < span; dx++)
covered[(gy + dy) * 16 + (gx + dx)] = true;
}
function _rect(uint256 hsh, uint256 gx, uint256 gy, uint256 span) internal pure returns (string memory) {
uint256 r2 = (hsh >> 8) % 100;
string memory fill; string memory op;
if (r2 > 90 && (hsh % 9 == 0)) { fill = "#faffe8"; op = "0.95"; }
else {
fill = "#ccff00";
if (span >= 3) op = "0.92";
else if (span >= 2) op = (r2 > 50) ? "0.8" : "0.55";
else op = (r2 > 60) ? "0.7" : ((r2 > 30) ? "0.45" : "0.28");
}
return string(abi.encodePacked(
'<rect x="', (10 + gx * 30).toString(), '" y="', (10 + gy * 30).toString(),
'" width="', (span * 30 - 2).toString(), '" height="', (span * 30 - 2).toString(),
'" rx="', (span >= 2 ? "4" : "2"), '" fill="', fill, '" fill-opacity="', op, '"/>'
));
}
// ================================================================
// INTERFACE
// ================================================================
function supportsInterface(bytes4 interfaceId)
public view virtual override(ERC721C, ERC2981) returns (bool)
{
return ERC721C.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId);
}
// ================================================================
// VIEWS
// ================================================================
function isMinted(uint256 tokenId) external view returns (bool) { return _exists(tokenId); }
// ================================================================
// OWNER — DATA
// ================================================================
/// @notice Append one SSTORE2 chunk of packed plot bytes (multiple of PLOT_BYTES).
function addDataChunk(bytes calldata packedPlots) external onlyOwner {
if (packedPlots.length == 0 || packedPlots.length % PLOT_BYTES != 0) revert BadChunk();
address ptr = SSTORE2.write(packedPlots);
dataChunks.push(ptr);
plotsStored += packedPlots.length / PLOT_BYTES;
emit DataChunkAdded(dataChunks.length - 1, packedPlots.length / PLOT_BYTES, plotsStored);
}
// ================================================================
// OWNER — AIRDROP
// ================================================================
/// @notice Airdrop one token each to `recipients`, sequentially. Call in batches
/// (e.g. ~80 per tx) to stay under the block gas limit. Counts toward supply.
function airdrop(address[] calldata recipients) external onlyOwner {
uint256 n = recipients.length;
if (totalSupply + n > genesisSupply) revert SoldOut();
for (uint256 i = 0; i < n; i++) {
address to = recipients[i];
if (to == address(0)) revert ZeroAddress();
uint256 id = ++totalSupply;
_mint(to, id);
emit PlotMinted(to, id);
}
emit Airdropped(n, totalSupply);
}
// ================================================================
// OWNER — PHASES / SETTINGS
// ================================================================
function setPhases(uint64 wlStart_, uint64 publicStart_) external onlyOwner {
wlStart = wlStart_;
publicStart = publicStart_;
emit PhasesSet(wlStart_, publicStart_);
}
function setMerkleRoot(bytes32 root) external onlyOwner {
merkleRoot = root;
emit MerkleRootSet(root);
}
function setWalletCaps(uint256 wlCap, uint256 publicCap) external onlyOwner {
wlMintsPerWallet = wlCap;
publicMintsPerWallet = publicCap;
}
function setGenesisSupply(uint256 n) external onlyOwner {
require(n >= totalSupply && n <= MAX_SUPPLY, "bad supply");
genesisSupply = n;
}
function setPaused(bool p) external onlyOwner { paused = p; emit PausedSet(p); }
function setDescription(string calldata d) external onlyOwner { description = d; }
function setRoyaltyInfo(address r, uint96 fee) external onlyOwner { _setDefaultRoyalty(r, fee); }
function withdraw() external onlyOwner nonReentrant {
uint256 bal = address(this).balance;
if (bal == 0) revert NothingToWithdraw();
(bool ok, ) = payable(owner()).call{ value: bal }("");
if (!ok) revert WithdrawFailed();
emit Withdrawn(owner(), bal);
}
function withdrawTo(address to) external onlyOwner nonReentrant {
if (to == address(0)) revert ZeroAddress();
uint256 bal = address(this).balance;
if (bal == 0) revert NothingToWithdraw();
(bool ok, ) = payable(to).call{ value: bal }("");
if (!ok) revert WithdrawFailed();
emit Withdrawn(to, bal);
}
receive() external payable {}
}[
{
"type": "constructor",
"inputs": [
{
"name": "royaltyReceiver_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BadChunk",
"type": "error",
"inputs": []
},
{
"name": "CreatorTokenBase__InvalidTransferValidatorContract",
"type": "error",
"inputs": []
},
{
"name": "DataMissing",
"type": "error",
"inputs": []
},
{
"name": "MintPaused",
"type": "error",
"inputs": []
},
{
"name": "NonexistentToken",
"type": "error",
"inputs": []
},
{
"name": "NotWhitelisted",
"type": "error",
"inputs": []
},
{
"name": "NothingToWithdraw",
"type": "error",
"inputs": []
},
{
"name": "OutOfRange",
"type": "error",
"inputs": []
},
{
"name": "PublicNotStarted",
"type": "error",
"inputs": []
},
{
"name": "ShouldNotMintToBurnAddress",
"type": "error",
"inputs": []
},
{
"name": "SoldOut",
"type": "error",
"inputs": []
},
{
"name": "WLNotStarted",
"type": "error",
"inputs": []
},
{
"name": "WalletLimitReached",
"type": "error",
"inputs": []
},
{
"name": "WithdrawFailed",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "Airdropped",
"type": "event",
"inputs": [
{
"name": "count",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newTotal",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"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": "AutomaticApprovalOfTransferValidatorSet",
"type": "event",
"inputs": [
{
"name": "autoApproved",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "DataChunkAdded",
"type": "event",
"inputs": [
{
"name": "chunkIndex",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "plotsInChunk",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "plotsStored",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "DefaultRoyaltySet",
"type": "event",
"inputs": [
{
"name": "receiver",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "feeNumerator",
"type": "uint96",
"indexed": false,
"internalType": "uint96"
}
],
"anonymous": false
},
{
"name": "MerkleRootSet",
"type": "event",
"inputs": [
{
"name": "root",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"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": "PausedSet",
"type": "event",
"inputs": [
{
"name": "paused",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "PhasesSet",
"type": "event",
"inputs": [
{
"name": "wlStart",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "publicStart",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "PlotMinted",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TokenRoyaltySet",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "receiver",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "feeNumerator",
"type": "uint96",
"indexed": false,
"internalType": "uint96"
}
],
"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": "TransferValidatorUpdated",
"type": "event",
"inputs": [
{
"name": "oldValidator",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "newValidator",
"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": "DEFAULT_TRANSFER_VALIDATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "MAX_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "ROYALTY_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint96",
"internalType": "uint96"
}
],
"stateMutability": "view"
},
{
"name": "addDataChunk",
"type": "function",
"inputs": [
{
"name": "packedPlots",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "airdrop",
"type": "function",
"inputs": [
{
"name": "recipients",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "autoApproveTransfersFromValidator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "dataChunks",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "description",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "genesisSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getApproved",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "getTransferValidationFunction",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "functionSignature",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "isViewFunction",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "pure"
},
{
"name": "getTransferValidator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "validator",
"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": "isApproved",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isMinted",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "merkleRoot",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "mint",
"type": "function",
"inputs": [
{
"name": "quantity",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "mintedBy",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"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": "paused",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "phase",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "plotsStored",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "publicMintsPerWallet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "publicStart",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "royaltyInfo",
"type": "function",
"inputs": [
{
"name": "_tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_salePrice",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "setAutomaticApprovalOfTransfersFromValidator",
"type": "function",
"inputs": [
{
"name": "autoApprove",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setDescription",
"type": "function",
"inputs": [
{
"name": "d",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setGenesisSupply",
"type": "function",
"inputs": [
{
"name": "n",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMerkleRoot",
"type": "function",
"inputs": [
{
"name": "root",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPaused",
"type": "function",
"inputs": [
{
"name": "p",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPhases",
"type": "function",
"inputs": [
{
"name": "wlStart_",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "publicStart_",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRoyaltyInfo",
"type": "function",
"inputs": [
{
"name": "r",
"type": "address",
"internalType": "address"
},
{
"name": "fee",
"type": "uint96",
"internalType": "uint96"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTransferValidator",
"type": "function",
"inputs": [
{
"name": "transferValidator_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setWalletCaps",
"type": "function",
"inputs": [
{
"name": "wlCap",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "publicCap",
"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": "totalSupply",
"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": "whitelistMint",
"type": "function",
"inputs": [
{
"name": "quantity",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "proof",
"type": "bytes32[]",
"internalType": "bytes32[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdraw",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawTo",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "wlMintsPerWallet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "wlStart",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x610cfb600d556011805460ff60801b1916600160801b1790556001601355600260145561016060405260b160808181529061440960a0396016906100439082610466565b5034801561004f575f5ffd5b506040516144ba3803806144ba83398101604081905261006e91610524565b6040805180820182526008815267486f6f644d61707360c01b6020808301919091528251808401845260048152631213d3d160e21b81830152835180830185525f808252855193840190955284835285946101f49493906100cf8382610466565b5060016100dc8282610466565b5050506100ef828261013860201b60201c565b506100fa9050610156565b61011773721c008fdff27bf06e7e123956e2fe03b63342e36101a4565b610121828261021c565b5061012d905033610271565b506001600c55610551565b60066101448382610466565b5060076101518282610466565b505050565b604080515f815273721c008fdff27bf06e7e123956e2fe03b63342e360208201527fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac910160405180910390a1565b6001600160a01b0381161561021957803b8015610217576040805163fb2de5d760e01b81523060048201526102d1602482015290516001600160a01b0384169163fb2de5d7916044808301925f92919082900301818387803b158015610208575f5ffd5b505af192505050801561015157505b505b50565b61022682826102c2565b6040516001600160601b03821681526001600160a01b038316907f8a8bae378cb731c5c40b632330c6836c2f916f48edb967699c86736f9a6a76ef9060200160405180910390a25050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6127106001600160601b03821611156103355760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b03821661038b5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161032c565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600955565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806103ec57607f821691505b60208210810361040a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610151578282111561015157805f5260205f20601f840160051c602085101561043b57505f5b90810190601f840160051c035f5b8181101561045e575f83820155600101610449565b505050505050565b81516001600160401b0381111561047f5761047f6103c4565b6104938161048d84546103d8565b84610410565b6020601f8211600181146104c5575f83156104ae5750848201515b5f19600385901b1c1916600184901b17845561051d565b5f84815260208120601f198516915b828110156104f457878501518255602094850194600190920191016104d4565b508482101561051157868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b5f60208284031215610534575f5ffd5b81516001600160a01b038116811461054a575f5ffd5b9392505050565b613eab8061055e5f395ff3fe60806040526004361061027e575f3560e01c80636221d13c1161014d5780639e05d240116100ba5780639e05d2401461075c578063a0712d681461077b578063a22cb4651461079a578063a5f4c6ff146107b9578063a689c48c146107df578063a9fc664e146107fe578063ae42de581461081d578063b1c9fe6e1461083c578063b88d4fde14610862578063c87b56dd14610881578063d2cab056146108a0578063e985e9c5146108bf578063f2fde38b146108de575f5ffd5b80636221d13c146105fe5780636352211e1461061e5780636bfb7d241461063d57806370a0823114610652578063715018a6146106715780637284e41614610685578063729ad39e1461069957806372b0d90c146106b85780637cb64759146106d757806387d2437f146106f65780638da5cb5b1461071557806390c3f38f1461072957806395d89b4114610748575f5ffd5b806323b872dd116101eb57806323b872dd146104645780632a55205a146104835780632eb4a7ab146104c157806332cb6b0c146104d657806333c41a90146104eb5780633ccfd60b1461050a5780633cef28d21461051e57806342842e0e1461054957806349c657db146105685780634bbf179b146105955780635a020716146105aa5780635c69cbac146105bf5780635c975abb146105de575f5ffd5b8063014635461461028957806301ffc9a7146102cd57806302fa7c47146102fc5780630489cf6e1461031d57806306fdde0314610354578063081812fc1461037557806308e5d4f414610394578063095ea7b3146103b3578063098144d4146103d25780630d705df6146103e65780630ee83bbd1461040d57806316c38b3c1461043057806318160ddd1461044f575f5ffd5b3661028557005b5f5ffd5b348015610294575f5ffd5b506102b073721c008fdff27bf06e7e123956e2fe03b63342e381565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102d8575f5ffd5b506102ec6102e736600461312b565b6108fd565b60405190151581526020016102c4565b348015610307575f5ffd5b5061031b610316366004613161565b61091c565b005b348015610328575f5ffd5b5060115461033c906001600160401b031681565b6040516001600160401b0390911681526020016102c4565b34801561035f575f5ffd5b50610368610932565b6040516102c491906131cf565b348015610380575f5ffd5b506102b061038f3660046131e1565b6109c2565b34801561039f575f5ffd5b5061031b6103ae36600461320e565b6109e7565b3480156103be575f5ffd5b5061031b6103cd36600461323f565b610a59565b3480156103dd575f5ffd5b506102b0610b72565b3480156103f1575f5ffd5b506040805163657711f560e11b815260016020820152016102c4565b348015610418575f5ffd5b5061042260135481565b6040519081526020016102c4565b34801561043b575f5ffd5b5061031b61044a366004613276565b610bac565b34801561045a575f5ffd5b50610422600e5481565b34801561046f575f5ffd5b5061031b61047e36600461328f565b610c0c565b34801561048e575f5ffd5b506104a261049d3660046132c9565b610c3d565b604080516001600160a01b0390931683526020830191909152016102c4565b3480156104cc575f5ffd5b5061042260125481565b3480156104e1575f5ffd5b5061042261520881565b3480156104f6575f5ffd5b506102ec6105053660046131e1565b610ce9565b348015610515575f5ffd5b5061031b610cf3565b348015610529575f5ffd5b506104226105383660046132e9565b60156020525f908152604090205481565b348015610554575f5ffd5b5061031b61056336600461328f565b610df4565b348015610573575f5ffd5b5061057d6101f481565b6040516001600160601b0390911681526020016102c4565b3480156105a0575f5ffd5b50610422600d5481565b3480156105b5575f5ffd5b5061042260105481565b3480156105ca575f5ffd5b5061031b6105d93660046131e1565b610e0e565b3480156105e9575f5ffd5b506011546102ec90600160801b900460ff1681565b348015610609575f5ffd5b506008546102ec90600160a81b900460ff1681565b348015610629575f5ffd5b506102b06106383660046131e1565b610e68565b348015610648575f5ffd5b5061042260145481565b34801561065d575f5ffd5b5061042261066c3660046132e9565b610e9b565b34801561067c575f5ffd5b5061031b610f1f565b348015610690575f5ffd5b50610368610f30565b3480156106a4575f5ffd5b5061031b6106b3366004613342565b610fbc565b3480156106c3575f5ffd5b5061031b6106d23660046132e9565b6110f5565b3480156106e2575f5ffd5b5061031b6106f13660046131e1565b611210565b348015610701575f5ffd5b5061031b6107103660046132c9565b61124d565b348015610720575f5ffd5b506102b0611260565b348015610734575f5ffd5b5061031b6107433660046133bd565b61126f565b348015610753575f5ffd5b50610368611284565b348015610767575f5ffd5b5061031b610776366004613276565b611293565b348015610786575f5ffd5b5061031b6107953660046131e1565b6112e8565b3480156107a5575f5ffd5b5061031b6107b43660046133ef565b61136b565b3480156107c4575f5ffd5b5060115461033c90600160401b90046001600160401b031681565b3480156107ea575f5ffd5b506102b06107f93660046131e1565b611376565b348015610809575f5ffd5b5061031b6108183660046132e9565b61139e565b348015610828575f5ffd5b5061031b6108373660046133bd565b611457565b348015610847575f5ffd5b50610850611598565b60405160ff90911681526020016102c4565b34801561086d575f5ffd5b5061031b61087c36600461342b565b611623565b34801561088c575f5ffd5b5061036861089b3660046131e1565b61165b565b3480156108ab575f5ffd5b5061031b6108ba366004613505565b61173c565b3480156108ca575f5ffd5b506102ec6108d936600461354c565b61181e565b3480156108e9575f5ffd5b5061031b6108f83660046132e9565b611881565b5f610907826118f7565b80610916575061091682611936565b92915050565b61092461195a565b61092e82826119b9565b5050565b60606006805461094190613574565b80601f016020809104026020016040519081016040528092919081815260200182805461096d90613574565b80156109b85780601f1061098f576101008083540402835291602001916109b8565b820191905f5260205f20905b81548152906001019060200180831161099b57829003601f168201915b5050505050905090565b5f6109cc82611a0e565b505f908152600460205260409020546001600160a01b031690565b6109ef61195a565b601180546001600160401b038481166001600160801b03199092168217600160401b918516918202179092556040805191825260208201929092527fff736bf2e9a6fab3767727aed4d7b0ebc9b7cfdce6b8e00d641c76184f2015fe910160405180910390a15050565b5f610a6382610e68565b9050806001600160a01b0316836001600160a01b031603610ad55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610af15750610af1813361181e565b610b635760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610acc565b610b6d8383611a33565b505050565b60085461010090046001600160a01b031680610ba95760085460ff16610ba9575073721c008fdff27bf06e7e123956e2fe03b63342e35b90565b610bb461195a565b60118054821515600160801b0260ff60801b199091161790556040517f40db37ff5c0bdc2c427fbb2078c8f24afea940abac0e3c23bb4ea3bf2da2b21290610c0190831515815260200190565b60405180910390a150565b610c163382611aa0565b610c325760405162461bcd60e51b8152600401610acc906135a6565b610b6d838383611afe565b5f828152600a602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610cb15750604080518082019091526009546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610ccf906001600160601b031687613607565b610cd99190613632565b91519350909150505b9250929050565b5f61091682611c75565b610cfb61195a565b610d03611c91565b475f819003610d2557604051630686827b60e51b815260040160405180910390fd5b5f610d2e611260565b6001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610d75576040519150601f19603f3d011682016040523d82523d5f602084013e610d7a565b606091505b5050905080610d9c57604051631d42c86760e21b815260040160405180910390fd5b610da4611260565b6001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610dde91815260200190565b60405180910390a25050610df26001600c55565b565b610b6d83838360405180602001604052805f815250611623565b610e1661195a565b600e548110158015610e2a57506152088111155b610e635760405162461bcd60e51b815260206004820152600a60248201526962616420737570706c7960b01b6044820152606401610acc565b600d55565b5f5f610e7383611cea565b90506001600160a01b0381166109165760405162461bcd60e51b8152600401610acc90613645565b5f6001600160a01b038216610f045760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610acc565b506001600160a01b03165f9081526003602052604090205490565b610f2761195a565b610df25f611d04565b60168054610f3d90613574565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6990613574565b8015610fb45780601f10610f8b57610100808354040283529160200191610fb4565b820191905f5260205f20905b815481529060010190602001808311610f9757829003601f168201915b505050505081565b610fc461195a565b600d54600e54829190610fd8908390613677565b1115610ff7576040516352df9fe560e01b815260040160405180910390fd5b5f5b818110156110b1575f8484838181106110145761101461368a565b905060200201602081019061102991906132e9565b90506001600160a01b0381166110525760405163d92e233d60e01b815260040160405180910390fd5b5f600e5f81546110619061369e565b918290555090506110728282611d55565b60405181906001600160a01b038416907ff5bfe2c47201d9b174eb541f714cc5ba5acbeb056cfcdd39b720853a38b624cf905f90a35050600101610ff9565b50600e546040805183815260208101929092527fcf920e91425238e78b56f92b129e3171ba644fe6a1b2e632d1d30b5c450113bb91015b60405180910390a1505050565b6110fd61195a565b611105611c91565b6001600160a01b03811661112c5760405163d92e233d60e01b815260040160405180910390fd5b475f81900361114e57604051630686827b60e51b815260040160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611197576040519150601f19603f3d011682016040523d82523d5f602084013e61119c565b606091505b50509050806111be57604051631d42c86760e21b815260040160405180910390fd5b826001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5836040516111f991815260200190565b60405180910390a2505061120d6001600c55565b50565b61121861195a565b60128190556040518181527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b90602001610c01565b61125561195a565b601391909155601455565b600b546001600160a01b031690565b61127761195a565b6016610b6d828483613704565b60606007805461094190613574565b61129b611e77565b60088054821515600160a81b0260ff60a81b199091161790556040517f6787c7f9a80aa0f5ceddab2c54f1f5169c0b88e75dd5e19d5e858a64144c7dbc90610c0190831515815260200190565b6112f0611c91565b6112f8611598565b60ff1660021461131b5760405163f80c2fa960e01b815260040160405180910390fd5b601454335f90815260156020526040902054611338908390613677565b11156113575760405163426d5b2360e11b815260040160405180910390fd5b6113613382611e7f565b61120d6001600c55565b61092e338383611f64565b600f8181548110611385575f80fd5b5f918252602090912001546001600160a01b0316905081565b6113a6611e77565b6001600160a01b038116803b151590158015906113c1575080155b156113df576040516332483afb60e01b815260040160405180910390fd5b7fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac611408610b72565b604080516001600160a01b03928316815291851660208301520160405180910390a1600880546001600160a01b038416610100026001600160a81b031990911617600117905561092e8261202d565b61145f61195a565b80158061147557506114726014826137bd565b15155b15611493576040516334b27e4760e11b815260040160405180910390fd5b5f6114d283838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506120ab92505050565b600f80546001810182555f919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0383161790559050611529601483613632565b60105f8282546115399190613677565b9091555050600f547fff1370bb9f96e3c9877b3674c34cf43d84898515fbd042a3f46d01dbfdc5b4ce9061156f906001906137d0565b61157a601485613632565b601054604080519384526020840192909252908201526060016110e8565b6011545f90600160801b900460ff16156115b157505f90565b6011546001600160401b03165f036115c857505f90565b601154600160401b90046001600160401b0316158015906115fb5750601154600160401b90046001600160401b03164210155b156116065750600290565b6011546001600160401b0316421061161e5750600190565b505f90565b61162d3383611aa0565b6116495760405162461bcd60e51b8152600401610acc906135a6565b6116558484848461212d565b50505050565b606061166682611c75565b6116835760405163163a09e160e31b815260040160405180910390fd5b5f5f5f61168f85612160565b5050509250925092505f6116ad6116a8878686866121d5565b61238e565b6040516020016116bd91906137fa565b60405160208183030381529060405290505f6116d8876124dc565b60166116e38961256c565b846040516020016116f79493929190613828565b60405160208183030381529060405290506117118161238e565b604051602001611721919061393d565b60405160208183030381529060405295505050505050919050565b611744611c91565b61174c611598565b60ff1660011461176f576040516395086b7760e01b815260040160405180910390fd5b6040516001600160601b03193360601b1660208201525f906034016040516020818303038152906040528051906020012090506117b08383601254846125de565b6117cd57604051630b094f2760e31b815260040160405180910390fd5b601354335f908152601560205260409020546117ea908690613677565b11156118095760405163426d5b2360e11b815260040160405180910390fd5b6118133385611e7f565b50610b6d6001600c55565b6001600160a01b038281165f9081526005602090815260408083209385168352929052205460ff168061091657600854600160a81b900460ff161561091657611865610b72565b6001600160a01b0316826001600160a01b031614905092915050565b61188961195a565b6001600160a01b0381166118ee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610acc565b61120d81611d04565b5f6001600160e01b03198216632b435fdb60e21b148061192757506001600160e01b0319821663503e914d60e11b145b806109165750610916826125f5565b5f6001600160e01b0319821663152a902d60e11b14806109165750610916826118f7565b33611963611260565b6001600160a01b031614610df25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610acc565b6119c38282612644565b6040516001600160601b03821681526001600160a01b038316907f8a8bae378cb731c5c40b632330c6836c2f916f48edb967699c86736f9a6a76ef9060200160405180910390a25050565b611a1781611c75565b61120d5760405162461bcd60e51b8152600401610acc90613645565b5f81815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a6782610e68565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f5f611aab83610e68565b9050806001600160a01b0316846001600160a01b03161480611ad25750611ad2818561181e565b80611af65750836001600160a01b0316611aeb846109c2565b6001600160a01b0316145b949350505050565b826001600160a01b0316611b1182610e68565b6001600160a01b031614611b375760405162461bcd60e51b8152600401610acc9061396e565b6001600160a01b038216611b995760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610acc565b611ba6838383600161273d565b826001600160a01b0316611bb982610e68565b6001600160a01b031614611bdf5760405162461bcd60e51b8152600401610acc9061396e565b5f81815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080545f1901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610b6d838383600161276a565b5f80611c8083611cea565b6001600160a01b0316141592915050565b6002600c5403611ce35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610acc565b6002600c55565b5f908152600260205260409020546001600160a01b031690565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216611dab5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610acc565b611db481611c75565b15611dd15760405162461bcd60e51b8152600401610acc906139b3565b611dde5f8383600161273d565b611de781611c75565b15611e045760405162461bcd60e51b8152600401610acc906139b3565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461092e5f8383600161276a565b610df261195a565b805f03611e9f57604051637db3aba760e01b815260040160405180910390fd5b600d5481600e54611eb09190613677565b1115611ecf576040516352df9fe560e01b815260040160405180910390fd5b6001600160a01b0382165f9081526015602052604081208054839290611ef6908490613677565b909155505f90505b81811015610b6d575f600e5f8154611f159061369e565b91829055509050611f268482611d55565b60405181906001600160a01b038616907ff5bfe2c47201d9b174eb541f714cc5ba5acbeb056cfcdd39b720853a38b624cf905f90a350600101611efe565b816001600160a01b0316836001600160a01b031603611fc15760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610acc565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0381161561120d57803b801561092e576040805163fb2de5d760e01b81523060048201526102d1602482015290516001600160a01b0384169163fb2de5d7916044808301925f92919082900301818387803b158015612091575f5ffd5b505af19250505080156120a2575060015b1561092e575050565b5f5f826040516020016120be91906139ea565b60405160208183030381529060405290508051602082015ff091506001600160a01b0382166121275760405162461bcd60e51b815260206004820152601560248201527414d4d513d4914c8e881ddc9a5d194819985a5b1959605a1b6044820152606401610acc565b50919050565b612138848484611afe565b61214484848484612790565b6116555760405162461bcd60e51b8152600401610acc90613a09565b5f5f5f5f5f5f5f6121708861288a565b905061217e815f60046129af565b965061218d81600460026129af565b955061219c81600660026129af565b94506121ab81600860046129af565b93506121ba81600c60046129af565b92506121c981601060046129af565b91505091939550919395565b60605f61017c8510156121ff5761017c6121f0866064613607565b6121fa9190613632565b612202565b60645b90505f606461221283603c613607565b61221c9190613632565b90506122266130f6565b60408051602081019091525f8082525b601081101561235f575f5b6010811015612356578381612257846010613607565b6122619190613677565b61010081106122725761227261368a565b602002015161234e575f8b82612289856010613607565b6122939190613677565b60408051602081019390935282015260600160408051601f198184030181529190528051602090910120905060646122cc886055613607565b6122d69190613632565b6122e16064836137bd565b11156122ed575061234e565b5f6122fa8284868a6129f1565b905061230886848684612a6e565b612310575060015b61231c86848684612ae3565b8461232983858785612b4f565b60405160200161233a929190613a5b565b604051602081830303815290604052945050505b600101612241565b50600101612236565b50806040516020016123719190613a6f565b604051602081830303815290604052945050505050949350505050565b606081515f036123ab57505060408051602081019091525f815290565b5f604051806060016040528060408152602001613e366040913990505f6003845160026123d89190613677565b6123e29190613632565b6123ed906004613607565b6001600160401b0381111561240457612404613417565b6040519080825280601f01601f19166020018201604052801561242e576020820181803683370190505b509050600182016020820185865187015b8082101561249a576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061243f565b50506003865106600181146124b657600281146124c9576124d1565b603d6001830353603d60028303536124d1565b603d60018303535b509195945050505050565b60605f6124e883612dab565b60010190505f816001600160401b0381111561250657612506613417565b6040519080825280601f01601f191660200182016040528015612530576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461253a575b509392505050565b60605f5f5f5f5f5f61257d88612160565b955095509550955095509550612592866124dc565b61259b866124dc565b6125a4866124dc565b6125af868686612e80565b6040516020016125c29493929190613b42565b6040516020818303038152906040529650505050505050919050565b5f826125eb868685612ec7565b1495945050505050565b5f6001600160e01b031982166380ac58cd60e01b148061262557506001600160e01b03198216635b5e139f60e01b145b8061091657506301ffc9a760e01b6001600160e01b0319831614610916565b6127106001600160601b03821611156126b25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610acc565b6001600160a01b0382166127045760405162461bcd60e51b815260206004820152601960248201527822a921991c9c189d1034b73b30b634b2103932b1b2b4bb32b960391b6044820152606401610acc565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600955565b5f5b818110156127635761275b85856127568487613677565b612f08565b60010161273f565b5050505050565b5f5b818110156127635761278885856127838487613677565b612f5e565b60010161276c565b5f6001600160a01b0384163b1561288257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127d3903390899088908890600401613c1f565b6020604051808303815f875af192505050801561280d575060408051601f3d908101601f1916820190925261280a91810190613c5b565b60015b612868573d80801561283a576040519150601f19603f3d011682016040523d82523d5f602084013e61283f565b606091505b5080515f036128605760405162461bcd60e51b8152600401610acc90613a09565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611af6565b506001611af6565b60605f6128986001846137d0565b905060105481106128bc5760405163731eab5760e01b815260040160405180910390fd5b5f805b600f54811015612995575f60146128fb600f84815481106128e2576128e261368a565b5f918252602090912001546001600160a01b0316612fa5565b6129059190613632565b90506129118184613677565b841015612980575f61292384866137d0565b9050612975600f848154811061293b5761293b61368a565b5f918252602090912001546001600160a01b031661295a601484613607565b60146129668186613607565b6129709190613677565b612fbb565b979650505050505050565b61298a8184613677565b9250506001016128bf565b5060405163731eab5760e01b815260040160405180910390fd5b5f805b8281101561256457846129c58286613677565b815181106129d5576129d561368a565b60209101015160f81c60089290921b91909117906001016129b2565b5f80612a026064601088901c6137bd565b90508281108015612a135750600e85105b8015612a1f5750600e84105b15612a2e576003915050611af6565b612a39836016613677565b81108015612a475750600f85105b8015612a535750600f84105b15612a62576002915050611af6565b50600195945050505050565b5f805b82811015612a62575f5b83811015612ada5786612a8e8288613677565b612a988488613677565b612aa3906010613607565b612aad9190613677565b6101008110612abe57612abe61368a565b602002015115612ad2575f92505050611af6565b600101612a7b565b50600101612a71565b5f5b81811015612763575f5b82811015612b4657600186612b048388613677565b612b0e8588613677565b612b19906010613607565b612b239190613677565b6101008110612b3457612b3461368a565b91151560209092020152600101612aef565b50600101612ae5565b60605f612b616064600888901c6137bd565b9050606080605a83118015612b7e5750612b7c6009896137bd565b155b15612bc95760405180604001604052806007815260200166046ccc2ccccca760cb1b815250915060405180604001604052806004815260200163302e393560e01b8152509050612cde565b604051806040016040528060078152602001660236363666630360cc1b815250915060038510612c14575060408051808201909152600481526318171c9960e11b6020820152612cde565b60028510612c6a5760328311612c465760405180604001604052806004815260200163302e353560e01b815250612c63565b604051806040016040528060038152602001620605c760eb1b8152505b9050612cde565b603c8311612cbe57601e8311612c9c57604051806040016040528060048152602001630605c64760e31b815250612cdb565b60405180604001604052806004815260200163302e343560e01b815250612cdb565b60405180604001604052806003815260200162302e3760e81b8152505b90505b612cfc612cec88601e613607565b612cf790600a613677565b6124dc565b612d0a612cec88601e613607565b612d246002612d1a89601e613607565b612cf791906137d0565b612d346002612d1a8a601e613607565b6002891015612d5c57604051806040016040528060018152602001601960f91b815250612d77565b604051806040016040528060018152602001600d60fa1b8152505b8686604051602001612d8f9796959493929190613c76565b6040516020818303038152906040529350505050949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612de95772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310612e13576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310612e3157662386f26fc10000830492506010015b6305f5e1008310612e49576305f5e100830492506008015b6127108310612e5d57612710830492506004015b60648310612e6f576064830492506002015b600a83106109165760010192915050565b6060612e8b846124dc565b612e94846124dc565b612e9d846124dc565b604051602001612eaf93929190613d5f565b60405160208183030381529060405290509392505050565b5f81815b84811015612eff57612ef582878784818110612ee957612ee961368a565b90506020020135613022565b9150600101612ecb565b50949350505050565b6001600160a01b038381161590831615818015612f225750805b15612f4057604051635cbd944160e01b815260040160405180910390fd5b8115612f4c575b612763565b80612f47576127633386868634613051565b6001600160a01b038381161590831615818015612f785750805b15612f9657604051635cbd944160e01b815260040160405180910390fd5b81612f475780612f4757612763565b5f61091660016001600160a01b0384163b6137d0565b60605f612fc884846137d0565b9050806001600160401b03811115612fe257612fe2613417565b6040519080825280601f01601f19166020018201604052801561300c576020820181803683370190505b509150806001850160208401873c509392505050565b5f81831061303c575f82815260208490526040902061304a565b5f8381526020839052604090205b9392505050565b5f61305a610b72565b90506001600160a01b038116156130ee576001600160a01b03811633036130815750612763565b60405163657711f560e11b81526001600160a01b038781166004830152868116602483015285811660448301526064820185905282169063caee23ea906084015f6040518083038186803b1580156130d7575f5ffd5b505afa1580156130e9573d5f5f3e3d5ffd5b505050505b505050505050565b604051806120000160405280610100906020820280368337509192915050565b6001600160e01b03198116811461120d575f5ffd5b5f6020828403121561313b575f5ffd5b813561304a81613116565b80356001600160a01b038116811461315c575f5ffd5b919050565b5f5f60408385031215613172575f5ffd5b61317b83613146565b915060208301356001600160601b0381168114613196575f5ffd5b809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61304a60208301846131a1565b5f602082840312156131f1575f5ffd5b5035919050565b80356001600160401b038116811461315c575f5ffd5b5f5f6040838503121561321f575f5ffd5b613228836131f8565b9150613236602084016131f8565b90509250929050565b5f5f60408385031215613250575f5ffd5b61325983613146565b946020939093013593505050565b8035801515811461315c575f5ffd5b5f60208284031215613286575f5ffd5b61304a82613267565b5f5f5f606084860312156132a1575f5ffd5b6132aa84613146565b92506132b860208501613146565b929592945050506040919091013590565b5f5f604083850312156132da575f5ffd5b50508035926020909101359150565b5f602082840312156132f9575f5ffd5b61304a82613146565b5f5f83601f840112613312575f5ffd5b5081356001600160401b03811115613328575f5ffd5b6020830191508360208260051b8501011115610ce2575f5ffd5b5f5f60208385031215613353575f5ffd5b82356001600160401b03811115613368575f5ffd5b61337485828601613302565b90969095509350505050565b5f5f83601f840112613390575f5ffd5b5081356001600160401b038111156133a6575f5ffd5b602083019150836020828501011115610ce2575f5ffd5b5f5f602083850312156133ce575f5ffd5b82356001600160401b038111156133e3575f5ffd5b61337485828601613380565b5f5f60408385031215613400575f5ffd5b61340983613146565b915061323660208401613267565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f6080858703121561343e575f5ffd5b61344785613146565b935061345560208601613146565b92506040850135915060608501356001600160401b03811115613476575f5ffd5b8501601f81018713613486575f5ffd5b80356001600160401b0381111561349f5761349f613417565b604051601f8201601f19908116603f011681016001600160401b03811182821017156134cd576134cd613417565b6040528181528282016020018910156134e4575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f5f5f60408486031215613517575f5ffd5b8335925060208401356001600160401b03811115613533575f5ffd5b61353f86828701613302565b9497909650939450505050565b5f5f6040838503121561355d575f5ffd5b61356683613146565b915061323660208401613146565b600181811c9082168061358857607f821691505b60208210810361212757634e487b7160e01b5f52602260045260245ffd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610916576109166135f3565b634e487b7160e01b5f52601260045260245ffd5b5f826136405761364061361e565b500490565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b80820180821115610916576109166135f3565b634e487b7160e01b5f52603260045260245ffd5b5f600182016136af576136af6135f3565b5060010190565b601f821115610b6d5782821115610b6d57805f5260205f20601f840160051c60208510156136e157505f5b90810190601f840160051c035f5b818110156130ee575f838201556001016136ef565b6001600160401b0383111561371b5761371b613417565b61372f836137298354613574565b836136b6565b5f601f841160018114613760575f85156137495750838201355b5f19600387901b1c1916600186901b178355612763565b5f83815260208120601f198716915b8281101561378f578685013582556020948501946001909201910161376f565b50868210156137ab575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f826137cb576137cb61361e565b500690565b81810381811115610916576109166135f3565b5f81518060208401855e5f93019283525090919050565b7919185d184e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60321b81525f61304a601a8301846137e3565b717b226e616d65223a22486f6f644d6170202360701b81525f61384e60128301876137e3565b701116113232b9b1b934b83a34b7b7111d1160791b815285545f9061387281613574565b60018216801561388957600181146138a4576138d7565b60ff19831660118601526011821515830286010193506138d7565b895f5260205f205f5b838110156138cc578154878201601101526001909101906020016138ad565b505060118286010193505b50506f222c2261747472696275746573223a5b60801b82525061393161392361391d613906601085018a6137e3565b6a2e961134b6b0b3b2911d1160a91b8152600b0190565b876137e3565b61227d60f01b815260020190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f61304a601d8301846137e3565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6a600b5981380380925939f360a81b81525f61304a600c8301846137e3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f611af6613a6983866137e3565b846137e3565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222077696474683d2235303022206865696768743d2235303022602082015276103b34b2bba137bc1e91181018101a9818101a9818111f60491b60408201527f3c726563742077696474683d2235303022206865696768743d223530302220726057820152763c1e91191b11103334b6361e911198181818181811179f60491b60778201525f613b2c608e8301846137e3565b651e17b9bb339f60d11b81526006019392505050565b7f7b2274726169745f74797065223a225472616e73616374696f6e73222c227661815264363ab2911d60d91b60208201525f613b8160258301876137e3565b611f4b60f21b81527f7b2274726169745f74797065223a22426c6f636b73222c2276616c7565223a006002820152613bbc60218201876137e3565b611f4b60f21b81527f7b2274726169745f74797065223a224275736965737420426c6f636b222c227660028201526530b63ab2911d60d11b60228201529050613c0860288201866137e3565b9050611f4b60f21b815261297560028201856137e3565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90613c51908301846131a1565b9695505050505050565b5f60208284031215613c6b575f5ffd5b815161304a81613116565b681e3932b1ba103c1e9160b91b81525f613c93600983018a6137e3565b6411103c9e9160d91b8152613cab600582018a6137e3565b6811103bb4b23a341e9160b91b81529050613cc960098201896137e3565b6911103432b4b3b43a1e9160b11b81529050613ce8600a8201886137e3565b651110393c1e9160d11b81529050613d0360068201876137e3565b6711103334b6361e9160c11b81529050613d2060088201866137e3565b6f11103334b63616b7b830b1b4ba3c9e9160811b81529050613d4560108201856137e3565b6211179f60e91b81526003019a9950505050505050505050565b7f7b2274726169745f74797065223a2247617320286b29222c2276616c7565223a81525f613d9060208301866137e3565b611f4b60f21b81527f7b2274726169745f74797065223a22466972737420426c6f636b222c2276616c6002820152633ab2911d60e11b6022820152613dd860268201866137e3565b611f4b60f21b81527f7b2274726169745f74797065223a224c61737420426c6f636b222c2276616c7560028201526232911d60e91b60228201529050613e2160258201856137e3565b607d60f81b8152600101969550505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212203f6e05ad3dab15f2653935e35f489da49c4f235c8d2be9788e880de15360e96c64736f6c63430008210033486f6f644d61707320697320612066756c6c79206f6e2d636861696e20636f6c6c656374696f6e206d617070696e67207468652067656e65736973206163746976697479206f6620526f62696e686f6f6420436861696e2e204561636820706c6f742069732061207265616c20736c696365206f662074686520636861696e2c2072656e6465726564206f6e2d636861696e2066726f6d20697473206f776e207472616e73616374696f6e20646174612e00000000000000000000000031e47136648547fa6ac6fac2e9b33dcb4460c7c5
0x60806040526004361061027e575f3560e01c80636221d13c1161014d5780639e05d240116100ba5780639e05d2401461075c578063a0712d681461077b578063a22cb4651461079a578063a5f4c6ff146107b9578063a689c48c146107df578063a9fc664e146107fe578063ae42de581461081d578063b1c9fe6e1461083c578063b88d4fde14610862578063c87b56dd14610881578063d2cab056146108a0578063e985e9c5146108bf578063f2fde38b146108de575f5ffd5b80636221d13c146105fe5780636352211e1461061e5780636bfb7d241461063d57806370a0823114610652578063715018a6146106715780637284e41614610685578063729ad39e1461069957806372b0d90c146106b85780637cb64759146106d757806387d2437f146106f65780638da5cb5b1461071557806390c3f38f1461072957806395d89b4114610748575f5ffd5b806323b872dd116101eb57806323b872dd146104645780632a55205a146104835780632eb4a7ab146104c157806332cb6b0c146104d657806333c41a90146104eb5780633ccfd60b1461050a5780633cef28d21461051e57806342842e0e1461054957806349c657db146105685780634bbf179b146105955780635a020716146105aa5780635c69cbac146105bf5780635c975abb146105de575f5ffd5b8063014635461461028957806301ffc9a7146102cd57806302fa7c47146102fc5780630489cf6e1461031d57806306fdde0314610354578063081812fc1461037557806308e5d4f414610394578063095ea7b3146103b3578063098144d4146103d25780630d705df6146103e65780630ee83bbd1461040d57806316c38b3c1461043057806318160ddd1461044f575f5ffd5b3661028557005b5f5ffd5b348015610294575f5ffd5b506102b073721c008fdff27bf06e7e123956e2fe03b63342e381565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102d8575f5ffd5b506102ec6102e736600461312b565b6108fd565b60405190151581526020016102c4565b348015610307575f5ffd5b5061031b610316366004613161565b61091c565b005b348015610328575f5ffd5b5060115461033c906001600160401b031681565b6040516001600160401b0390911681526020016102c4565b34801561035f575f5ffd5b50610368610932565b6040516102c491906131cf565b348015610380575f5ffd5b506102b061038f3660046131e1565b6109c2565b34801561039f575f5ffd5b5061031b6103ae36600461320e565b6109e7565b3480156103be575f5ffd5b5061031b6103cd36600461323f565b610a59565b3480156103dd575f5ffd5b506102b0610b72565b3480156103f1575f5ffd5b506040805163657711f560e11b815260016020820152016102c4565b348015610418575f5ffd5b5061042260135481565b6040519081526020016102c4565b34801561043b575f5ffd5b5061031b61044a366004613276565b610bac565b34801561045a575f5ffd5b50610422600e5481565b34801561046f575f5ffd5b5061031b61047e36600461328f565b610c0c565b34801561048e575f5ffd5b506104a261049d3660046132c9565b610c3d565b604080516001600160a01b0390931683526020830191909152016102c4565b3480156104cc575f5ffd5b5061042260125481565b3480156104e1575f5ffd5b5061042261520881565b3480156104f6575f5ffd5b506102ec6105053660046131e1565b610ce9565b348015610515575f5ffd5b5061031b610cf3565b348015610529575f5ffd5b506104226105383660046132e9565b60156020525f908152604090205481565b348015610554575f5ffd5b5061031b61056336600461328f565b610df4565b348015610573575f5ffd5b5061057d6101f481565b6040516001600160601b0390911681526020016102c4565b3480156105a0575f5ffd5b50610422600d5481565b3480156105b5575f5ffd5b5061042260105481565b3480156105ca575f5ffd5b5061031b6105d93660046131e1565b610e0e565b3480156105e9575f5ffd5b506011546102ec90600160801b900460ff1681565b348015610609575f5ffd5b506008546102ec90600160a81b900460ff1681565b348015610629575f5ffd5b506102b06106383660046131e1565b610e68565b348015610648575f5ffd5b5061042260145481565b34801561065d575f5ffd5b5061042261066c3660046132e9565b610e9b565b34801561067c575f5ffd5b5061031b610f1f565b348015610690575f5ffd5b50610368610f30565b3480156106a4575f5ffd5b5061031b6106b3366004613342565b610fbc565b3480156106c3575f5ffd5b5061031b6106d23660046132e9565b6110f5565b3480156106e2575f5ffd5b5061031b6106f13660046131e1565b611210565b348015610701575f5ffd5b5061031b6107103660046132c9565b61124d565b348015610720575f5ffd5b506102b0611260565b348015610734575f5ffd5b5061031b6107433660046133bd565b61126f565b348015610753575f5ffd5b50610368611284565b348015610767575f5ffd5b5061031b610776366004613276565b611293565b348015610786575f5ffd5b5061031b6107953660046131e1565b6112e8565b3480156107a5575f5ffd5b5061031b6107b43660046133ef565b61136b565b3480156107c4575f5ffd5b5060115461033c90600160401b90046001600160401b031681565b3480156107ea575f5ffd5b506102b06107f93660046131e1565b611376565b348015610809575f5ffd5b5061031b6108183660046132e9565b61139e565b348015610828575f5ffd5b5061031b6108373660046133bd565b611457565b348015610847575f5ffd5b50610850611598565b60405160ff90911681526020016102c4565b34801561086d575f5ffd5b5061031b61087c36600461342b565b611623565b34801561088c575f5ffd5b5061036861089b3660046131e1565b61165b565b3480156108ab575f5ffd5b5061031b6108ba366004613505565b61173c565b3480156108ca575f5ffd5b506102ec6108d936600461354c565b61181e565b3480156108e9575f5ffd5b5061031b6108f83660046132e9565b611881565b5f610907826118f7565b80610916575061091682611936565b92915050565b61092461195a565b61092e82826119b9565b5050565b60606006805461094190613574565b80601f016020809104026020016040519081016040528092919081815260200182805461096d90613574565b80156109b85780601f1061098f576101008083540402835291602001916109b8565b820191905f5260205f20905b81548152906001019060200180831161099b57829003601f168201915b5050505050905090565b5f6109cc82611a0e565b505f908152600460205260409020546001600160a01b031690565b6109ef61195a565b601180546001600160401b038481166001600160801b03199092168217600160401b918516918202179092556040805191825260208201929092527fff736bf2e9a6fab3767727aed4d7b0ebc9b7cfdce6b8e00d641c76184f2015fe910160405180910390a15050565b5f610a6382610e68565b9050806001600160a01b0316836001600160a01b031603610ad55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610af15750610af1813361181e565b610b635760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610acc565b610b6d8383611a33565b505050565b60085461010090046001600160a01b031680610ba95760085460ff16610ba9575073721c008fdff27bf06e7e123956e2fe03b63342e35b90565b610bb461195a565b60118054821515600160801b0260ff60801b199091161790556040517f40db37ff5c0bdc2c427fbb2078c8f24afea940abac0e3c23bb4ea3bf2da2b21290610c0190831515815260200190565b60405180910390a150565b610c163382611aa0565b610c325760405162461bcd60e51b8152600401610acc906135a6565b610b6d838383611afe565b5f828152600a602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610cb15750604080518082019091526009546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610ccf906001600160601b031687613607565b610cd99190613632565b91519350909150505b9250929050565b5f61091682611c75565b610cfb61195a565b610d03611c91565b475f819003610d2557604051630686827b60e51b815260040160405180910390fd5b5f610d2e611260565b6001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610d75576040519150601f19603f3d011682016040523d82523d5f602084013e610d7a565b606091505b5050905080610d9c57604051631d42c86760e21b815260040160405180910390fd5b610da4611260565b6001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610dde91815260200190565b60405180910390a25050610df26001600c55565b565b610b6d83838360405180602001604052805f815250611623565b610e1661195a565b600e548110158015610e2a57506152088111155b610e635760405162461bcd60e51b815260206004820152600a60248201526962616420737570706c7960b01b6044820152606401610acc565b600d55565b5f5f610e7383611cea565b90506001600160a01b0381166109165760405162461bcd60e51b8152600401610acc90613645565b5f6001600160a01b038216610f045760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610acc565b506001600160a01b03165f9081526003602052604090205490565b610f2761195a565b610df25f611d04565b60168054610f3d90613574565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6990613574565b8015610fb45780601f10610f8b57610100808354040283529160200191610fb4565b820191905f5260205f20905b815481529060010190602001808311610f9757829003601f168201915b505050505081565b610fc461195a565b600d54600e54829190610fd8908390613677565b1115610ff7576040516352df9fe560e01b815260040160405180910390fd5b5f5b818110156110b1575f8484838181106110145761101461368a565b905060200201602081019061102991906132e9565b90506001600160a01b0381166110525760405163d92e233d60e01b815260040160405180910390fd5b5f600e5f81546110619061369e565b918290555090506110728282611d55565b60405181906001600160a01b038416907ff5bfe2c47201d9b174eb541f714cc5ba5acbeb056cfcdd39b720853a38b624cf905f90a35050600101610ff9565b50600e546040805183815260208101929092527fcf920e91425238e78b56f92b129e3171ba644fe6a1b2e632d1d30b5c450113bb91015b60405180910390a1505050565b6110fd61195a565b611105611c91565b6001600160a01b03811661112c5760405163d92e233d60e01b815260040160405180910390fd5b475f81900361114e57604051630686827b60e51b815260040160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611197576040519150601f19603f3d011682016040523d82523d5f602084013e61119c565b606091505b50509050806111be57604051631d42c86760e21b815260040160405180910390fd5b826001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5836040516111f991815260200190565b60405180910390a2505061120d6001600c55565b50565b61121861195a565b60128190556040518181527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b90602001610c01565b61125561195a565b601391909155601455565b600b546001600160a01b031690565b61127761195a565b6016610b6d828483613704565b60606007805461094190613574565b61129b611e77565b60088054821515600160a81b0260ff60a81b199091161790556040517f6787c7f9a80aa0f5ceddab2c54f1f5169c0b88e75dd5e19d5e858a64144c7dbc90610c0190831515815260200190565b6112f0611c91565b6112f8611598565b60ff1660021461131b5760405163f80c2fa960e01b815260040160405180910390fd5b601454335f90815260156020526040902054611338908390613677565b11156113575760405163426d5b2360e11b815260040160405180910390fd5b6113613382611e7f565b61120d6001600c55565b61092e338383611f64565b600f8181548110611385575f80fd5b5f918252602090912001546001600160a01b0316905081565b6113a6611e77565b6001600160a01b038116803b151590158015906113c1575080155b156113df576040516332483afb60e01b815260040160405180910390fd5b7fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac611408610b72565b604080516001600160a01b03928316815291851660208301520160405180910390a1600880546001600160a01b038416610100026001600160a81b031990911617600117905561092e8261202d565b61145f61195a565b80158061147557506114726014826137bd565b15155b15611493576040516334b27e4760e11b815260040160405180910390fd5b5f6114d283838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506120ab92505050565b600f80546001810182555f919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0383161790559050611529601483613632565b60105f8282546115399190613677565b9091555050600f547fff1370bb9f96e3c9877b3674c34cf43d84898515fbd042a3f46d01dbfdc5b4ce9061156f906001906137d0565b61157a601485613632565b601054604080519384526020840192909252908201526060016110e8565b6011545f90600160801b900460ff16156115b157505f90565b6011546001600160401b03165f036115c857505f90565b601154600160401b90046001600160401b0316158015906115fb5750601154600160401b90046001600160401b03164210155b156116065750600290565b6011546001600160401b0316421061161e5750600190565b505f90565b61162d3383611aa0565b6116495760405162461bcd60e51b8152600401610acc906135a6565b6116558484848461212d565b50505050565b606061166682611c75565b6116835760405163163a09e160e31b815260040160405180910390fd5b5f5f5f61168f85612160565b5050509250925092505f6116ad6116a8878686866121d5565b61238e565b6040516020016116bd91906137fa565b60405160208183030381529060405290505f6116d8876124dc565b60166116e38961256c565b846040516020016116f79493929190613828565b60405160208183030381529060405290506117118161238e565b604051602001611721919061393d565b60405160208183030381529060405295505050505050919050565b611744611c91565b61174c611598565b60ff1660011461176f576040516395086b7760e01b815260040160405180910390fd5b6040516001600160601b03193360601b1660208201525f906034016040516020818303038152906040528051906020012090506117b08383601254846125de565b6117cd57604051630b094f2760e31b815260040160405180910390fd5b601354335f908152601560205260409020546117ea908690613677565b11156118095760405163426d5b2360e11b815260040160405180910390fd5b6118133385611e7f565b50610b6d6001600c55565b6001600160a01b038281165f9081526005602090815260408083209385168352929052205460ff168061091657600854600160a81b900460ff161561091657611865610b72565b6001600160a01b0316826001600160a01b031614905092915050565b61188961195a565b6001600160a01b0381166118ee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610acc565b61120d81611d04565b5f6001600160e01b03198216632b435fdb60e21b148061192757506001600160e01b0319821663503e914d60e11b145b806109165750610916826125f5565b5f6001600160e01b0319821663152a902d60e11b14806109165750610916826118f7565b33611963611260565b6001600160a01b031614610df25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610acc565b6119c38282612644565b6040516001600160601b03821681526001600160a01b038316907f8a8bae378cb731c5c40b632330c6836c2f916f48edb967699c86736f9a6a76ef9060200160405180910390a25050565b611a1781611c75565b61120d5760405162461bcd60e51b8152600401610acc90613645565b5f81815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a6782610e68565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f5f611aab83610e68565b9050806001600160a01b0316846001600160a01b03161480611ad25750611ad2818561181e565b80611af65750836001600160a01b0316611aeb846109c2565b6001600160a01b0316145b949350505050565b826001600160a01b0316611b1182610e68565b6001600160a01b031614611b375760405162461bcd60e51b8152600401610acc9061396e565b6001600160a01b038216611b995760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610acc565b611ba6838383600161273d565b826001600160a01b0316611bb982610e68565b6001600160a01b031614611bdf5760405162461bcd60e51b8152600401610acc9061396e565b5f81815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080545f1901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610b6d838383600161276a565b5f80611c8083611cea565b6001600160a01b0316141592915050565b6002600c5403611ce35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610acc565b6002600c55565b5f908152600260205260409020546001600160a01b031690565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216611dab5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610acc565b611db481611c75565b15611dd15760405162461bcd60e51b8152600401610acc906139b3565b611dde5f8383600161273d565b611de781611c75565b15611e045760405162461bcd60e51b8152600401610acc906139b3565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461092e5f8383600161276a565b610df261195a565b805f03611e9f57604051637db3aba760e01b815260040160405180910390fd5b600d5481600e54611eb09190613677565b1115611ecf576040516352df9fe560e01b815260040160405180910390fd5b6001600160a01b0382165f9081526015602052604081208054839290611ef6908490613677565b909155505f90505b81811015610b6d575f600e5f8154611f159061369e565b91829055509050611f268482611d55565b60405181906001600160a01b038616907ff5bfe2c47201d9b174eb541f714cc5ba5acbeb056cfcdd39b720853a38b624cf905f90a350600101611efe565b816001600160a01b0316836001600160a01b031603611fc15760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610acc565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0381161561120d57803b801561092e576040805163fb2de5d760e01b81523060048201526102d1602482015290516001600160a01b0384169163fb2de5d7916044808301925f92919082900301818387803b158015612091575f5ffd5b505af19250505080156120a2575060015b1561092e575050565b5f5f826040516020016120be91906139ea565b60405160208183030381529060405290508051602082015ff091506001600160a01b0382166121275760405162461bcd60e51b815260206004820152601560248201527414d4d513d4914c8e881ddc9a5d194819985a5b1959605a1b6044820152606401610acc565b50919050565b612138848484611afe565b61214484848484612790565b6116555760405162461bcd60e51b8152600401610acc90613a09565b5f5f5f5f5f5f5f6121708861288a565b905061217e815f60046129af565b965061218d81600460026129af565b955061219c81600660026129af565b94506121ab81600860046129af565b93506121ba81600c60046129af565b92506121c981601060046129af565b91505091939550919395565b60605f61017c8510156121ff5761017c6121f0866064613607565b6121fa9190613632565b612202565b60645b90505f606461221283603c613607565b61221c9190613632565b90506122266130f6565b60408051602081019091525f8082525b601081101561235f575f5b6010811015612356578381612257846010613607565b6122619190613677565b61010081106122725761227261368a565b602002015161234e575f8b82612289856010613607565b6122939190613677565b60408051602081019390935282015260600160408051601f198184030181529190528051602090910120905060646122cc886055613607565b6122d69190613632565b6122e16064836137bd565b11156122ed575061234e565b5f6122fa8284868a6129f1565b905061230886848684612a6e565b612310575060015b61231c86848684612ae3565b8461232983858785612b4f565b60405160200161233a929190613a5b565b604051602081830303815290604052945050505b600101612241565b50600101612236565b50806040516020016123719190613a6f565b604051602081830303815290604052945050505050949350505050565b606081515f036123ab57505060408051602081019091525f815290565b5f604051806060016040528060408152602001613e366040913990505f6003845160026123d89190613677565b6123e29190613632565b6123ed906004613607565b6001600160401b0381111561240457612404613417565b6040519080825280601f01601f19166020018201604052801561242e576020820181803683370190505b509050600182016020820185865187015b8082101561249a576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061243f565b50506003865106600181146124b657600281146124c9576124d1565b603d6001830353603d60028303536124d1565b603d60018303535b509195945050505050565b60605f6124e883612dab565b60010190505f816001600160401b0381111561250657612506613417565b6040519080825280601f01601f191660200182016040528015612530576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461253a575b509392505050565b60605f5f5f5f5f5f61257d88612160565b955095509550955095509550612592866124dc565b61259b866124dc565b6125a4866124dc565b6125af868686612e80565b6040516020016125c29493929190613b42565b6040516020818303038152906040529650505050505050919050565b5f826125eb868685612ec7565b1495945050505050565b5f6001600160e01b031982166380ac58cd60e01b148061262557506001600160e01b03198216635b5e139f60e01b145b8061091657506301ffc9a760e01b6001600160e01b0319831614610916565b6127106001600160601b03821611156126b25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610acc565b6001600160a01b0382166127045760405162461bcd60e51b815260206004820152601960248201527822a921991c9c189d1034b73b30b634b2103932b1b2b4bb32b960391b6044820152606401610acc565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600955565b5f5b818110156127635761275b85856127568487613677565b612f08565b60010161273f565b5050505050565b5f5b818110156127635761278885856127838487613677565b612f5e565b60010161276c565b5f6001600160a01b0384163b1561288257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127d3903390899088908890600401613c1f565b6020604051808303815f875af192505050801561280d575060408051601f3d908101601f1916820190925261280a91810190613c5b565b60015b612868573d80801561283a576040519150601f19603f3d011682016040523d82523d5f602084013e61283f565b606091505b5080515f036128605760405162461bcd60e51b8152600401610acc90613a09565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611af6565b506001611af6565b60605f6128986001846137d0565b905060105481106128bc5760405163731eab5760e01b815260040160405180910390fd5b5f805b600f54811015612995575f60146128fb600f84815481106128e2576128e261368a565b5f918252602090912001546001600160a01b0316612fa5565b6129059190613632565b90506129118184613677565b841015612980575f61292384866137d0565b9050612975600f848154811061293b5761293b61368a565b5f918252602090912001546001600160a01b031661295a601484613607565b60146129668186613607565b6129709190613677565b612fbb565b979650505050505050565b61298a8184613677565b9250506001016128bf565b5060405163731eab5760e01b815260040160405180910390fd5b5f805b8281101561256457846129c58286613677565b815181106129d5576129d561368a565b60209101015160f81c60089290921b91909117906001016129b2565b5f80612a026064601088901c6137bd565b90508281108015612a135750600e85105b8015612a1f5750600e84105b15612a2e576003915050611af6565b612a39836016613677565b81108015612a475750600f85105b8015612a535750600f84105b15612a62576002915050611af6565b50600195945050505050565b5f805b82811015612a62575f5b83811015612ada5786612a8e8288613677565b612a988488613677565b612aa3906010613607565b612aad9190613677565b6101008110612abe57612abe61368a565b602002015115612ad2575f92505050611af6565b600101612a7b565b50600101612a71565b5f5b81811015612763575f5b82811015612b4657600186612b048388613677565b612b0e8588613677565b612b19906010613607565b612b239190613677565b6101008110612b3457612b3461368a565b91151560209092020152600101612aef565b50600101612ae5565b60605f612b616064600888901c6137bd565b9050606080605a83118015612b7e5750612b7c6009896137bd565b155b15612bc95760405180604001604052806007815260200166046ccc2ccccca760cb1b815250915060405180604001604052806004815260200163302e393560e01b8152509050612cde565b604051806040016040528060078152602001660236363666630360cc1b815250915060038510612c14575060408051808201909152600481526318171c9960e11b6020820152612cde565b60028510612c6a5760328311612c465760405180604001604052806004815260200163302e353560e01b815250612c63565b604051806040016040528060038152602001620605c760eb1b8152505b9050612cde565b603c8311612cbe57601e8311612c9c57604051806040016040528060048152602001630605c64760e31b815250612cdb565b60405180604001604052806004815260200163302e343560e01b815250612cdb565b60405180604001604052806003815260200162302e3760e81b8152505b90505b612cfc612cec88601e613607565b612cf790600a613677565b6124dc565b612d0a612cec88601e613607565b612d246002612d1a89601e613607565b612cf791906137d0565b612d346002612d1a8a601e613607565b6002891015612d5c57604051806040016040528060018152602001601960f91b815250612d77565b604051806040016040528060018152602001600d60fa1b8152505b8686604051602001612d8f9796959493929190613c76565b6040516020818303038152906040529350505050949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612de95772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310612e13576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310612e3157662386f26fc10000830492506010015b6305f5e1008310612e49576305f5e100830492506008015b6127108310612e5d57612710830492506004015b60648310612e6f576064830492506002015b600a83106109165760010192915050565b6060612e8b846124dc565b612e94846124dc565b612e9d846124dc565b604051602001612eaf93929190613d5f565b60405160208183030381529060405290509392505050565b5f81815b84811015612eff57612ef582878784818110612ee957612ee961368a565b90506020020135613022565b9150600101612ecb565b50949350505050565b6001600160a01b038381161590831615818015612f225750805b15612f4057604051635cbd944160e01b815260040160405180910390fd5b8115612f4c575b612763565b80612f47576127633386868634613051565b6001600160a01b038381161590831615818015612f785750805b15612f9657604051635cbd944160e01b815260040160405180910390fd5b81612f475780612f4757612763565b5f61091660016001600160a01b0384163b6137d0565b60605f612fc884846137d0565b9050806001600160401b03811115612fe257612fe2613417565b6040519080825280601f01601f19166020018201604052801561300c576020820181803683370190505b509150806001850160208401873c509392505050565b5f81831061303c575f82815260208490526040902061304a565b5f8381526020839052604090205b9392505050565b5f61305a610b72565b90506001600160a01b038116156130ee576001600160a01b03811633036130815750612763565b60405163657711f560e11b81526001600160a01b038781166004830152868116602483015285811660448301526064820185905282169063caee23ea906084015f6040518083038186803b1580156130d7575f5ffd5b505afa1580156130e9573d5f5f3e3d5ffd5b505050505b505050505050565b604051806120000160405280610100906020820280368337509192915050565b6001600160e01b03198116811461120d575f5ffd5b5f6020828403121561313b575f5ffd5b813561304a81613116565b80356001600160a01b038116811461315c575f5ffd5b919050565b5f5f60408385031215613172575f5ffd5b61317b83613146565b915060208301356001600160601b0381168114613196575f5ffd5b809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61304a60208301846131a1565b5f602082840312156131f1575f5ffd5b5035919050565b80356001600160401b038116811461315c575f5ffd5b5f5f6040838503121561321f575f5ffd5b613228836131f8565b9150613236602084016131f8565b90509250929050565b5f5f60408385031215613250575f5ffd5b61325983613146565b946020939093013593505050565b8035801515811461315c575f5ffd5b5f60208284031215613286575f5ffd5b61304a82613267565b5f5f5f606084860312156132a1575f5ffd5b6132aa84613146565b92506132b860208501613146565b929592945050506040919091013590565b5f5f604083850312156132da575f5ffd5b50508035926020909101359150565b5f602082840312156132f9575f5ffd5b61304a82613146565b5f5f83601f840112613312575f5ffd5b5081356001600160401b03811115613328575f5ffd5b6020830191508360208260051b8501011115610ce2575f5ffd5b5f5f60208385031215613353575f5ffd5b82356001600160401b03811115613368575f5ffd5b61337485828601613302565b90969095509350505050565b5f5f83601f840112613390575f5ffd5b5081356001600160401b038111156133a6575f5ffd5b602083019150836020828501011115610ce2575f5ffd5b5f5f602083850312156133ce575f5ffd5b82356001600160401b038111156133e3575f5ffd5b61337485828601613380565b5f5f60408385031215613400575f5ffd5b61340983613146565b915061323660208401613267565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f6080858703121561343e575f5ffd5b61344785613146565b935061345560208601613146565b92506040850135915060608501356001600160401b03811115613476575f5ffd5b8501601f81018713613486575f5ffd5b80356001600160401b0381111561349f5761349f613417565b604051601f8201601f19908116603f011681016001600160401b03811182821017156134cd576134cd613417565b6040528181528282016020018910156134e4575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f5f5f60408486031215613517575f5ffd5b8335925060208401356001600160401b03811115613533575f5ffd5b61353f86828701613302565b9497909650939450505050565b5f5f6040838503121561355d575f5ffd5b61356683613146565b915061323660208401613146565b600181811c9082168061358857607f821691505b60208210810361212757634e487b7160e01b5f52602260045260245ffd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610916576109166135f3565b634e487b7160e01b5f52601260045260245ffd5b5f826136405761364061361e565b500490565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b80820180821115610916576109166135f3565b634e487b7160e01b5f52603260045260245ffd5b5f600182016136af576136af6135f3565b5060010190565b601f821115610b6d5782821115610b6d57805f5260205f20601f840160051c60208510156136e157505f5b90810190601f840160051c035f5b818110156130ee575f838201556001016136ef565b6001600160401b0383111561371b5761371b613417565b61372f836137298354613574565b836136b6565b5f601f841160018114613760575f85156137495750838201355b5f19600387901b1c1916600186901b178355612763565b5f83815260208120601f198716915b8281101561378f578685013582556020948501946001909201910161376f565b50868210156137ab575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f826137cb576137cb61361e565b500690565b81810381811115610916576109166135f3565b5f81518060208401855e5f93019283525090919050565b7919185d184e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60321b81525f61304a601a8301846137e3565b717b226e616d65223a22486f6f644d6170202360701b81525f61384e60128301876137e3565b701116113232b9b1b934b83a34b7b7111d1160791b815285545f9061387281613574565b60018216801561388957600181146138a4576138d7565b60ff19831660118601526011821515830286010193506138d7565b895f5260205f205f5b838110156138cc578154878201601101526001909101906020016138ad565b505060118286010193505b50506f222c2261747472696275746573223a5b60801b82525061393161392361391d613906601085018a6137e3565b6a2e961134b6b0b3b2911d1160a91b8152600b0190565b876137e3565b61227d60f01b815260020190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f61304a601d8301846137e3565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6a600b5981380380925939f360a81b81525f61304a600c8301846137e3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f611af6613a6983866137e3565b846137e3565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222077696474683d2235303022206865696768743d2235303022602082015276103b34b2bba137bc1e91181018101a9818101a9818111f60491b60408201527f3c726563742077696474683d2235303022206865696768743d223530302220726057820152763c1e91191b11103334b6361e911198181818181811179f60491b60778201525f613b2c608e8301846137e3565b651e17b9bb339f60d11b81526006019392505050565b7f7b2274726169745f74797065223a225472616e73616374696f6e73222c227661815264363ab2911d60d91b60208201525f613b8160258301876137e3565b611f4b60f21b81527f7b2274726169745f74797065223a22426c6f636b73222c2276616c7565223a006002820152613bbc60218201876137e3565b611f4b60f21b81527f7b2274726169745f74797065223a224275736965737420426c6f636b222c227660028201526530b63ab2911d60d11b60228201529050613c0860288201866137e3565b9050611f4b60f21b815261297560028201856137e3565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90613c51908301846131a1565b9695505050505050565b5f60208284031215613c6b575f5ffd5b815161304a81613116565b681e3932b1ba103c1e9160b91b81525f613c93600983018a6137e3565b6411103c9e9160d91b8152613cab600582018a6137e3565b6811103bb4b23a341e9160b91b81529050613cc960098201896137e3565b6911103432b4b3b43a1e9160b11b81529050613ce8600a8201886137e3565b651110393c1e9160d11b81529050613d0360068201876137e3565b6711103334b6361e9160c11b81529050613d2060088201866137e3565b6f11103334b63616b7b830b1b4ba3c9e9160811b81529050613d4560108201856137e3565b6211179f60e91b81526003019a9950505050505050505050565b7f7b2274726169745f74797065223a2247617320286b29222c2276616c7565223a81525f613d9060208301866137e3565b611f4b60f21b81527f7b2274726169745f74797065223a22466972737420426c6f636b222c2276616c6002820152633ab2911d60e11b6022820152613dd860268201866137e3565b611f4b60f21b81527f7b2274726169745f74797065223a224c61737420426c6f636b222c2276616c7560028201526232911d60e91b60228201529050613e2160258201856137e3565b607d60f81b8152600101969550505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212203f6e05ad3dab15f2653935e35f489da49c4f235c8d2be9788e880de15360e96c64736f6c63430008210033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x58ffc199…3be17a | Transfer | 17,310,481 | 25 days agoThu, 23 Jul 2026 13:06:57 UTC | 0xcaf7…5d11 | IN | 0x3637…26ab | $0.001 DIH |
| 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) | ||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x1f88bb…ccca44 | 4 hrs agoMon, 17 Aug 2026 17:02:45 UTC | ApprovalForAll | [0] 0x000000000000…009427ec [1] 0x000000000000…0000c300 data: 0x000000000000000000…00000000 |
| 0xf67332…4cc78e | 4 hrs agoMon, 17 Aug 2026 16:47:01 UTC | ApprovalForAll | [0] 0x000000000000…4b27f9e6 [1] 0x000000000000…0000c300 data: 0x000000000000000000…00000000 |
| 0xac6a3f…1bac7c | 19 hrs agoMon, 17 Aug 2026 02:01:42 UTC | ApprovalForAll | [0] 0x000000000000…1207ef67 [1] 0x000000000000…0000c300 data: 0x000000000000000000…00000001 |
| 0x2fdd08…ab4d95 | 1 day agoSun, 16 Aug 2026 20:09:30 UTC | Transfer | [0] 0x000000000000…58472a69 [1] 0x000000000000…37f4725c [2] 0x000000000000…000001f0 |
| 0xfb9d7b…31265c | 1 day agoSun, 16 Aug 2026 19:53:32 UTC | Transfer | [0] 0x000000000000…6078d9be [1] 0x000000000000…58472a69 [2] 0x000000000000…000001f0 |
| 0xd76c0b…e6a98d | 1 day agoSun, 16 Aug 2026 18:55:14 UTC | Transfer | [0] 0x000000000000…22ec75b5 [1] 0x000000000000…818f579e [2] 0x000000000000…000000f5 |
| 0xd76c0b…e6a98d | 1 day agoSun, 16 Aug 2026 18:55:14 UTC | Transfer | [0] 0x000000000000…22ec75b5 [1] 0x000000000000…818f579e [2] 0x000000000000…00000161 |
| 0x2cae93…85ff19 | 1 day agoSun, 16 Aug 2026 17:15:13 UTC | Transfer | [0] 0x000000000000…e8e93b41 [1] 0x000000000000…cec05bf7 [2] 0x000000000000…00000bb3 |
| 0x329cc6…b274e9 | 1 day agoSun, 16 Aug 2026 14:19:57 UTC | Transfer | [0] 0x000000000000…3f1b7d0d [1] 0x000000000000…818f579e [2] 0x000000000000…00000b55 |
| 0x329cc6…b274e9 | 1 day agoSun, 16 Aug 2026 14:19:57 UTC | Transfer | [0] 0x000000000000…3f1b7d0d [1] 0x000000000000…818f579e [2] 0x000000000000…00000286 |
| 0xe6fdc7…e0e8c1 | 1 day agoSun, 16 Aug 2026 14:19:47 UTC | ApprovalForAll | [0] 0x000000000000…3f1b7d0d [1] 0x000000000000…0000c300 data: 0x000000000000000000…00000001 |
| 0x09c813…50de89 | 1 day agoSat, 15 Aug 2026 23:15:06 UTC | Transfer | [0] 0x000000000000…fface137 [1] 0x000000000000…818f579e [2] 0x000000000000…0000026e |
| 0x09c813…50de89 | 1 day agoSat, 15 Aug 2026 23:15:06 UTC | Transfer | [0] 0x000000000000…fface137 [1] 0x000000000000…818f579e [2] 0x000000000000…00000a22 |
| 0x09c813…50de89 | 1 day agoSat, 15 Aug 2026 23:15:06 UTC | Transfer | [0] 0x000000000000…fface137 [1] 0x000000000000…818f579e [2] 0x000000000000…000002ea |
| 0xc0df48…e091b2 | 1 day agoSat, 15 Aug 2026 23:15:03 UTC | ApprovalForAll | [0] 0x000000000000…fface137 [1] 0x000000000000…0000c300 data: 0x000000000000000000…00000001 |
| 0x4101cd…c69b6a | 2 days agoSat, 15 Aug 2026 19:43:53 UTC | Transfer | [0] 0x000000000000…84d05891 [1] 0x000000000000…818f579e [2] 0x000000000000…000007b8 |
| 0x6855fc…f602e9 | 2 days agoSat, 15 Aug 2026 19:43:45 UTC | ApprovalForAll | [0] 0x000000000000…84d05891 [1] 0x000000000000…0000c300 data: 0x000000000000000000…00000001 |
| 0xc55304…7fbc16 | 2 days agoSat, 15 Aug 2026 16:19:09 UTC | ApprovalForAll | [0] 0x000000000000…a9ecc368 [1] 0x000000000000…0000c300 data: 0x000000000000000000…00000000 |
| 0x58ac26…c15508 | 3 days agoFri, 14 Aug 2026 15:28:01 UTC | Transfer | [0] 0x000000000000…d670113e [1] 0x000000000000…134a2682 [2] 0x000000000000…000008de |
| 0x34a4c0…77e4ae | 3 days agoFri, 14 Aug 2026 07:39:40 UTC | Transfer | [0] 0x000000000000…4dfca567 [1] 0x000000000000…818f579e [2] 0x000000000000…000003e0 |
| 0x34a4c0…77e4ae | 3 days agoFri, 14 Aug 2026 07:39:40 UTC | Transfer | [0] 0x000000000000…4dfca567 [1] 0x000000000000…818f579e [2] 0x000000000000…00000506 |
| 0x0c4609…b463d2 | 3 days agoFri, 14 Aug 2026 07:39:15 UTC | ApprovalForAll | [0] 0x000000000000…4dfca567 [1] 0x000000000000…0000c300 data: 0x000000000000000000…00000001 |
| 0x621d59…952a4a | 3 days agoThu, 13 Aug 2026 21:53:09 UTC | Transfer | [0] 0x000000000000…c15308be [1] 0x000000000000…c197ff55 [2] 0x000000000000…00000859 |
| 0x621d59…952a4a | 3 days agoThu, 13 Aug 2026 21:53:09 UTC | Transfer | [0] 0x000000000000…c15308be [1] 0x000000000000…c197ff55 [2] 0x000000000000…00000443 |
| 0xb8f1ee…92e84b | 3 days agoThu, 13 Aug 2026 21:50:04 UTC | Transfer | [0] 0x000000000000…c15308be [1] 0x000000000000…1c0484dc [2] 0x000000000000…00000c2d |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x1f88bb…ccca44 | Set Approval For All | 39,000,954 | 4 hrs agoMon, 17 Aug 2026 17:02:45 UTC | 0x00fb…27ec | IN | HoodMaps | $0.000 ETH | 0.00000049 | |
| 0xf67332…4cc78e | Set Approval For All | 38,991,540 | 4 hrs agoMon, 17 Aug 2026 16:47:01 UTC | 0x9c3e…f9e6 | IN | HoodMaps | $0.000 ETH | 0.00000048 | |
| 0xac6a3f…1bac7c | Set Approval For All | 38,462,028 | 19 hrs agoMon, 17 Aug 2026 02:01:42 UTC | 0x7c85…ef67 | IN | HoodMaps | $0.000 ETH | 0.00000093 | |
| 0x2fdd08…ab4d95 | Safe Transfer From | 38,251,411 | 1 day agoSun, 16 Aug 2026 20:09:30 UTC | 0xf3c1…2a69 | IN | HoodMaps | $0.000 ETH | 0.00000123 | |
| 0xfb9d7b…31265c | Safe Transfer From | 38,241,845 | 1 day agoSun, 16 Aug 2026 19:53:32 UTC | 0x055e…d9be | IN | HoodMaps | $0.000 ETH | 0.00000132 | |
| 0xe6fdc7…e0e8c1 | Set Approval For All | 38,042,238 | 1 day agoSun, 16 Aug 2026 14:19:47 UTC | 0x3f56…7d0d | IN | HoodMaps | $0.000 ETH | 0.00000094 | |
| 0xc0df48…e091b2 | Set Approval For All | 37,501,600 | 1 day agoSat, 15 Aug 2026 23:15:03 UTC | 0x0fa5…e137 | IN | HoodMaps | $0.000 ETH | 0.00000129 | |
| 0x6855fc…f602e9 | Set Approval For All | 37,375,205 | 2 days agoSat, 15 Aug 2026 19:43:45 UTC | 0x2b5b…5891 | IN | HoodMaps | $0.000 ETH | 0.00000134 | |
| 0xc55304…7fbc16 | Set Approval For All | 37,252,676 | 2 days agoSat, 15 Aug 2026 16:19:09 UTC | 0x854b…c368 | IN | HoodMaps | $0.000 ETH | 0.00000073 | |
| 0x0c4609…b463d2 | Set Approval For All | 36,079,675 | 3 days agoFri, 14 Aug 2026 07:39:15 UTC | 0x58b7…a567 | IN | HoodMaps | $0.000 ETH | 0.00000199 | |
| 0x2ab138…bf9b64 | Set Approval For All | 35,658,379 | 4 days agoThu, 13 Aug 2026 19:55:58 UTC | 0xb0d9…bd5d | IN | HoodMaps | $0.000 ETH | 0.00000201 | |
| 0x9e950c…f71103 | Set Approval For All | 35,059,645 | 4 days agoThu, 13 Aug 2026 03:15:04 UTC | 0x573d…c00f | IN | HoodMaps | $0.000 ETH | 0.00000129 | |
| 0x46f6ce…1d6268 | Set Approval For All | 34,992,481 | 4 days agoThu, 13 Aug 2026 01:22:54 UTC | 0x8873…df8c | IN | HoodMaps | $0.000 ETH | 0.00000131 | |
| 0x8f88ef…cb32c9 | Set Approval For All | 34,769,126 | 5 days agoWed, 12 Aug 2026 19:10:03 UTC | 0xe09f…cee9 | IN | HoodMaps | $0.000 ETH | 0.00000122 | |
| 0xb2b4af…bbd518 | Set Approval For All | 34,693,692 | 5 days agoWed, 12 Aug 2026 17:04:13 UTC | 0xae7c…0e46 | IN | HoodMaps | $0.000 ETH | 0.00000233 | |
| 0x51ea02…0950ac | Set Approval For All | 34,598,051 | 5 days agoWed, 12 Aug 2026 14:24:30 UTC | 0xdd87…1e43 | IN | HoodMaps | $0.000 ETH | 0.00000234 | |
| 0x2c01ce…1c3e51 | Set Approval For All | 34,065,929 | 5 days agoTue, 11 Aug 2026 23:41:02 UTC | 0xc23e…7846 | IN | HoodMaps | $0.000 ETH | 0.00000086 | |
| 0x1d8acf…1118ac | Set Approval For All | 33,526,093 | 6 days agoTue, 11 Aug 2026 08:42:17 UTC | 0xe09f…cee9 | IN | HoodMaps | $0.000 ETH | 0.00000125 | |
| 0x4542f5…aa3333 | Set Approval For All | 33,516,792 | 6 days agoTue, 11 Aug 2026 08:26:44 UTC | 0x29bc…9907 | IN | HoodMaps | $0.000 ETH | 0.00000126 | |
| 0x2e3c81…6977bc | Set Approval For All | 33,096,402 | 7 days agoMon, 10 Aug 2026 20:45:36 UTC | 0x11b6…5b9e | IN | HoodMaps | $0.000 ETH | 0.00000065 | |
| 0xc8299c…55d551 | Set Approval For All | 32,931,665 | 7 days agoMon, 10 Aug 2026 16:10:46 UTC | 0xe1ce…0bca | IN | HoodMaps | $0.000 ETH | 0.00000121 | |
| 0x3ec4af…c15e49 | Set Approval For All | 32,910,477 | 7 days agoMon, 10 Aug 2026 15:35:25 UTC | 0xa10c…cd95 | IN | HoodMaps | $0.000 ETH | 0.00000064 | |
| 0x231152…c4978a | Set Approval For All | 32,886,798 | 7 days agoMon, 10 Aug 2026 14:55:54 UTC | 0xa3ba…8949 | IN | HoodMaps | $0.000 ETH | 0.00000121 | |
| 0x545915…0f48cd | Set Approval For All | 32,325,920 | 7 days agoSun, 09 Aug 2026 23:19:14 UTC | 0x31f4…c27a | IN | HoodMaps | $0.000 ETH | 0.00000070 | |
| 0xd8b072…2ee6b3 | Set Approval For All | 32,102,593 | 8 days agoSun, 09 Aug 2026 17:06:47 UTC | 0x2088…dab2 | IN | HoodMaps | $0.000 ETH | 0.00000067 |