// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";
import {AccessControlDefaultAdminRules} from "@openzeppelin/contracts/access/extensions/AccessControlDefaultAdminRules.sol";
import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
/// @title HOODT v5 — Hoodmap reward token (Plot edition)
/// @notice ERC-20 emitted to Hoodmap Plot claimers (100 HOODT per plot claimed).
/// @dev v5 changes vs v4:
/// - **MAX_SUPPLY reduced 1_000_000_000 → 50_000_000** (1B → 50M, 95% smaller).
/// Rationale: original 1B cap was paired with 10 HOODT/block × 50M blocks
/// → 500M = 50% community. New plot model is 100 HOODT/plot × 200K plots
/// → 20M = 40% community at 50M cap. Other 60% (30M) intended split:
/// - 10M Aerodrome LP seed
/// - 8M legacy v1 minter airdrop / future incentives
/// - 7M treasury / partnerships
/// - 5M team (vested 12-24 months)
/// Exact split is admin-controlled post-deploy (mint-and-distribute by
/// DEFAULT_ADMIN holding MINTER_ADMIN_ROLE).
/// - Symbol kept as "HOODT" (continuity with v4 even though new address).
/// - All audit-hardened mechanics retained verbatim:
/// - AccessControlDefaultAdminRules (48h delay on DEFAULT_ADMIN rotation)
/// - Separation-of-duties: MINTER_ROLE is administered by MINTER_ADMIN_ROLE
/// (H-1 from v4 audit). Production: hold MINTER_ADMIN_ROLE on a DIFFERENT
/// multisig than DEFAULT_ADMIN_ROLE.
/// - mintBatch capped at MAX_MINT_BATCH = 500 (M-1, prevents OOG mid-loop)
/// - mintBatch rejects amount==0 entries (M-2, consistency with mint())
/// - Custom errors instead of strings (gas + uniformity)
///
/// IMPORTANT: do NOT deploy with an EOA holding DEFAULT_ADMIN_ROLE in prod.
/// The 48h delay only buys reaction time for admin handover — a compromised
/// default-admin EOA can still grant MINTER_ROLE in 2 steps and mint to cap.
/// Operational security requires DEFAULT_ADMIN_ROLE on a multisig + timelock
/// (see MAINNET_RUNBOOK §1 for v4 — same applies here).
contract HoodmapTokenV5 is ERC20, ERC20Permit, AccessControlDefaultAdminRules {
/// @notice 50,000,000 HOODT total cap. 18 decimals like every standard ERC-20.
uint256 public constant MAX_SUPPLY = 50_000_000 ether;
// M-1: bound mintBatch length to prevent OOG mid-loop (mirrors Claimer.MAX_CLAIM_MANY=100).
uint256 public constant MAX_MINT_BATCH = 500;
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
// H-1: dedicated admin role for MINTER_ROLE (separation-of-duties from DEFAULT_ADMIN_ROLE).
bytes32 public constant MINTER_ADMIN_ROLE = keccak256("MINTER_ADMIN_ROLE");
error MaxSupplyExceeded(uint256 requested, uint256 cap, uint256 current);
error ZeroAddress();
error ZeroAmount();
error LengthMismatch();
error MintBatchTooLarge(uint256 size, uint256 max);
constructor(address _initialOwner, uint48 _initialAdminDelay)
ERC20("Hoodmap Token", "HOODT")
ERC20Permit("Hoodmap Token")
AccessControlDefaultAdminRules(_initialAdminDelay, _initialOwner)
{
// Owner is also default minter; backend service can be added/removed by admin
// (subject to the AccessControlDefaultAdminRules flow for transferring DEFAULT_ADMIN).
_grantRole(MINTER_ROLE, _initialOwner);
// H-1: MINTER_ROLE is administered by MINTER_ADMIN_ROLE rather than
// DEFAULT_ADMIN_ROLE directly. Initial owner gets MINTER_ADMIN_ROLE so that
// bootstrap stays operational; production deployment should transfer it to
// a separate multisig (different signers than DEFAULT_ADMIN_ROLE).
_setRoleAdmin(MINTER_ROLE, MINTER_ADMIN_ROLE);
_grantRole(MINTER_ADMIN_ROLE, _initialOwner);
}
function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) {
if (to == address(0)) revert ZeroAddress();
if (amount == 0) revert ZeroAmount();
uint256 supply = totalSupply();
if (supply + amount > MAX_SUPPLY) revert MaxSupplyExceeded(amount, MAX_SUPPLY, supply);
_mint(to, amount);
}
function mintBatch(address[] calldata recipients, uint256[] calldata amounts) external onlyRole(MINTER_ROLE) {
uint256 len = recipients.length;
// M-1: cap batch size BEFORE the length-mismatch check so that an oversized
// payload always reports the size error first (cheaper, clearer, and matches
// the Claimer.claimMany pattern).
if (len > MAX_MINT_BATCH) revert MintBatchTooLarge(len, MAX_MINT_BATCH);
if (len != amounts.length) revert LengthMismatch();
uint256 total;
for (uint256 i; i < len; ) {
total += amounts[i];
unchecked { ++i; }
}
uint256 supply = totalSupply();
if (supply + total > MAX_SUPPLY) revert MaxSupplyExceeded(total, MAX_SUPPLY, supply);
for (uint256 i; i < len; ) {
address to = recipients[i];
uint256 amt = amounts[i];
if (to == address(0)) revert ZeroAddress();
// M-2: reject amount==0 inside the batch — consistent with mint() and removes
// order-dependence with the ZeroAddress check.
if (amt == 0) revert ZeroAmount();
_mint(to, amt);
unchecked { ++i; }
}
}
// AccessControlDefaultAdminRules requires this disambiguation override.
function supportsInterface(bytes4 interfaceId)
public view virtual override(AccessControlDefaultAdminRules) returns (bool)
{
return super.supportsInterface(interfaceId);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_initialOwner",
"type": "address",
"internalType": "address"
},
{
"name": "_initialAdminDelay",
"type": "uint48",
"internalType": "uint48"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AccessControlBadConfirmation",
"type": "error",
"inputs": []
},
{
"name": "AccessControlEnforcedDefaultAdminDelay",
"type": "error",
"inputs": [
{
"name": "schedule",
"type": "uint48",
"internalType": "uint48"
}
]
},
{
"name": "AccessControlEnforcedDefaultAdminRules",
"type": "error",
"inputs": []
},
{
"name": "AccessControlInvalidDefaultAdmin",
"type": "error",
"inputs": [
{
"name": "defaultAdmin",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "AccessControlUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "neededRole",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "ECDSAInvalidSignature",
"type": "error",
"inputs": []
},
{
"name": "ECDSAInvalidSignatureLength",
"type": "error",
"inputs": [
{
"name": "length",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ECDSAInvalidSignatureS",
"type": "error",
"inputs": [
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC2612ExpiredSignature",
"type": "error",
"inputs": [
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC2612InvalidSigner",
"type": "error",
"inputs": [
{
"name": "signer",
"type": "address",
"internalType": "address"
},
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "InvalidAccountNonce",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "currentNonce",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InvalidShortString",
"type": "error",
"inputs": []
},
{
"name": "LengthMismatch",
"type": "error",
"inputs": []
},
{
"name": "MaxSupplyExceeded",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "cap",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "current",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "MintBatchTooLarge",
"type": "error",
"inputs": [
{
"name": "size",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "max",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "SafeCastOverflowedUintDowncast",
"type": "error",
"inputs": [
{
"name": "bits",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "StringTooLong",
"type": "error",
"inputs": [
{
"name": "str",
"type": "string",
"internalType": "string"
}
]
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "ZeroAmount",
"type": "error",
"inputs": []
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "DefaultAdminDelayChangeCanceled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "DefaultAdminDelayChangeScheduled",
"type": "event",
"inputs": [
{
"name": "newDelay",
"type": "uint48",
"indexed": false,
"internalType": "uint48"
},
{
"name": "effectSchedule",
"type": "uint48",
"indexed": false,
"internalType": "uint48"
}
],
"anonymous": false
},
{
"name": "DefaultAdminTransferCanceled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "DefaultAdminTransferScheduled",
"type": "event",
"inputs": [
{
"name": "newAdmin",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "acceptSchedule",
"type": "uint48",
"indexed": false,
"internalType": "uint48"
}
],
"anonymous": false
},
{
"name": "EIP712DomainChanged",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "RoleAdminChanged",
"type": "event",
"inputs": [
{
"name": "role",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "previousAdminRole",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "newAdminRole",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "RoleGranted",
"type": "event",
"inputs": [
{
"name": "role",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RoleRevoked",
"type": "event",
"inputs": [
{
"name": "role",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "DEFAULT_ADMIN_ROLE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "DOMAIN_SEPARATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "MAX_MINT_BATCH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MINTER_ADMIN_ROLE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "MINTER_ROLE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "acceptDefaultAdminTransfer",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "beginDefaultAdminTransfer",
"type": "function",
"inputs": [
{
"name": "newAdmin",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "cancelDefaultAdminTransfer",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "changeDefaultAdminDelay",
"type": "function",
"inputs": [
{
"name": "newDelay",
"type": "uint48",
"internalType": "uint48"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "defaultAdmin",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "defaultAdminDelay",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint48",
"internalType": "uint48"
}
],
"stateMutability": "view"
},
{
"name": "defaultAdminDelayIncreaseWait",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint48",
"internalType": "uint48"
}
],
"stateMutability": "view"
},
{
"name": "eip712Domain",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "fields",
"type": "bytes1",
"internalType": "bytes1"
},
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "version",
"type": "string",
"internalType": "string"
},
{
"name": "chainId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "verifyingContract",
"type": "address",
"internalType": "address"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "extensions",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"stateMutability": "view"
},
{
"name": "getRoleAdmin",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "grantRole",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "hasRole",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "mint",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "mintBatch",
"type": "function",
"inputs": [
{
"name": "recipients",
"type": "address[]",
"internalType": "address[]"
},
{
"name": "amounts",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "nonces",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingDefaultAdmin",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "newAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "schedule",
"type": "uint48",
"internalType": "uint48"
}
],
"stateMutability": "view"
},
{
"name": "pendingDefaultAdminDelay",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "newDelay",
"type": "uint48",
"internalType": "uint48"
},
{
"name": "schedule",
"type": "uint48",
"internalType": "uint48"
}
],
"stateMutability": "view"
},
{
"name": "permit",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "v",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "r",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceRole",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "revokeRole",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rollbackDefaultAdminDelay",
"type": "function",
"inputs": [],
"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": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
}
]0x61016060405234801562000011575f80fd5b506040516200264238038062002642833981016040819052620000349162000496565b80826040518060400160405280600d81526020016c2437b7b236b0b8102a37b5b2b760991b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600d81526020016c2437b7b236b0b8102a37b5b2b760991b815250604051806040016040528060058152602001641213d3d11560da1b8152508160039081620000cc919062000584565b506004620000db828262000584565b50620000ed9150839050600562000282565b61012052620000fe81600662000282565b61014052815160208084019190912060e052815190820120610100524660a0526200018b60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c052506001600160a01b038116620001c457604051636116401160e11b81525f60048201526024015b60405180910390fd5b600980546001600160d01b0316600160d01b65ffffffffffff851602179055620001ef5f82620002ba565b505050620002125f805160206200262283398151915283620002ba60201b60201c565b506200024d5f80516020620026228339815191527f70480ee89cb38eff00b7d23da25713d52ce19c6ed428691d22c58b2f615e3d676200032c565b620002797f70480ee89cb38eff00b7d23da25713d52ce19c6ed428691d22c58b2f615e3d6783620002ba565b505050620006c2565b5f602083511015620002a15762000299836200035b565b9050620002b4565b81620002ae848262000584565b5060ff90505b92915050565b5f8262000319575f620002d5600a546001600160a01b031690565b6001600160a01b031614620002fd57604051631fe1e13d60e11b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0384161790555b6200032583836200039d565b9392505050565b816200034b57604051631fe1e13d60e11b815260040160405180910390fd5b6200035782826200044c565b5050565b5f80829050601f8151111562000388578260405163305a27a960e01b8152600401620001bb919062000650565b805162000395826200069e565b179392505050565b5f8281526008602090815260408083206001600160a01b038516845290915281205460ff1662000444575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff19166001179055620003fb3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001620002b4565b505f620002b4565b5f82815260086020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b5f8060408385031215620004a8575f80fd5b82516001600160a01b0381168114620004bf575f80fd5b602084015190925065ffffffffffff81168114620004db575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200050f57607f821691505b6020821081036200052e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200057f57805f5260205f20601f840160051c810160208510156200055b5750805b601f840160051c820191505b818110156200057c575f815560010162000567565b50505b505050565b81516001600160401b03811115620005a057620005a0620004e6565b620005b881620005b18454620004fa565b8462000534565b602080601f831160018114620005ee575f8415620005d65750858301515b5f19600386901b1c1916600185901b17855562000648565b5f85815260208120601f198616915b828110156200061e57888601518255948401946001909101908401620005fd565b50858210156200063c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602080835283518060208501525f5b818110156200067e5785810183015185820160400152820162000660565b505f604082860101526040601f19601f8301168501019250505092915050565b805160208083015191908110156200052e575f1960209190910360031b1b16919050565b60805160a05160c05160e051610100516101205161014051611f0e620007145f395f61111901525f6110ec01525f610f4d01525f610f2501525f610e8001525f610eaa01525f610ed40152611f0e5ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c80637c88e3d91161012a578063a217fddf116100b4578063d505accf11610079578063d505accf146104cb578063d5391393146104de578063d547741f14610505578063d602b9fd14610518578063dd62ed3e14610520575f80fd5b8063a217fddf14610473578063a9059cbb1461047a578063cc8463c81461048d578063cefc142914610495578063cf6eefb71461049d575f80fd5b806384ef8ffc116100fa57806384ef8ffc146104045780638da5cb5b1461042957806391d148541461043157806395d89b4114610444578063a1eda53c1461044c575f80fd5b80637c88e3d9146103ba5780637ecebe00146103cd5780637f7fa5ff146103e057806384b0196e146103e9575f80fd5b80632f2ff15d116101ab57806336568abe1161017b57806336568abe1461034657806340c10f1914610359578063634e93da1461036c578063649a5ec71461037f57806370a0823114610392575f80fd5b80632f2ff15d1461030a578063313ce5671461031d57806332cb6b0c1461032c5780633644e5151461033e575f80fd5b80630aa6220b116101f15780630aa6220b1461028e5780631339324b1461029857806318160ddd146102cd57806323b872dd146102d5578063248a9ca3146102e8575f80fd5b806301ffc9a714610222578063022d63fb1461024a57806306fdde0314610266578063095ea7b31461027b575b5f80fd5b610235610230366004611aba565b610558565b60405190151581526020015b60405180910390f35b620697805b60405165ffffffffffff9091168152602001610241565b61026e610568565b6040516102419190611b24565b610235610289366004611b51565b6105f8565b61029661060f565b005b6102bf7f70480ee89cb38eff00b7d23da25713d52ce19c6ed428691d22c58b2f615e3d6781565b604051908152602001610241565b6002546102bf565b6102356102e3366004611b79565b610624565b6102bf6102f6366004611bb2565b5f9081526008602052604090206001015490565b610296610318366004611bc9565b610647565b60405160128152602001610241565b6102bf6a295be96e6406697200000081565b6102bf610673565b610296610354366004611bc9565b610681565b610296610367366004611b51565b61072c565b61029661037a366004611bf3565b610809565b61029661038d366004611c0c565b61081c565b6102bf6103a0366004611bf3565b6001600160a01b03165f9081526020819052604090205490565b6102966103c8366004611c79565b61082f565b6102bf6103db366004611bf3565b6109f9565b6102bf6101f481565b6103f1610a16565b6040516102419796959493929190611ce0565b600a546001600160a01b03165b6040516001600160a01b039091168152602001610241565b610411610a58565b61023561043f366004611bc9565b610a6b565b61026e610a95565b610454610aa4565b6040805165ffffffffffff938416815292909116602083015201610241565b6102bf5f81565b610235610488366004611b51565b610af6565b61024f610b03565b610296610b61565b6104a5610ba0565b604080516001600160a01b03909316835265ffffffffffff909116602083015201610241565b6102966104d9366004611d77565b610bc1565b6102bf7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610296610513366004611bc9565b610cf7565b610296610d1f565b6102bf61052e366004611de4565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f61056282610d31565b92915050565b60606003805461057790611e0c565b80601f01602080910402602001604051908101604052809291908181526020018280546105a390611e0c565b80156105ee5780601f106105c5576101008083540402835291602001916105ee565b820191905f5260205f20905b8154815290600101906020018083116105d157829003601f168201915b5050505050905090565b5f33610605818585610d55565b5060019392505050565b5f61061981610d67565b610621610d71565b50565b5f33610631858285610d7d565b61063c858585610df3565b506001949350505050565b8161066557604051631fe1e13d60e11b815260040160405180910390fd5b61066f8282610e50565b5050565b5f61067c610e74565b905090565b8115801561069c5750600a546001600160a01b038281169116145b15610722575f806106ab610ba0565b90925090506001600160a01b0382161515806106cd575065ffffffffffff8116155b806106e057504265ffffffffffff821610155b1561070d576040516319ca5ebb60e01b815265ffffffffffff821660048201526024015b60405180910390fd5b50506009805465ffffffffffff60a01b191690555b61066f8282610f9d565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661075681610d67565b6001600160a01b03831661077d5760405163d92e233d60e01b815260040160405180910390fd5b815f0361079d57604051631f2a200560e01b815260040160405180910390fd5b5f6107a760025490565b90506a295be96e640669720000006107bf8483611e58565b11156107f95760405163b14d3f5b60e01b8152600481018490526a295be96e64066972000000602482015260448101829052606401610704565b6108038484610fd0565b50505050565b5f61081381610d67565b61066f82611004565b5f61082681610d67565b61066f82611076565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661085981610d67565b836101f48111156108885760405163042ebe0f60e41b8152600481018290526101f46024820152604401610704565b8083146108ab576040516001621398b960e31b0319815260040160405180910390fd5b5f805b828110156108e4578585828181106108c8576108c8611e6b565b90506020020135826108da9190611e58565b91506001016108ae565b505f6108ef60025490565b90506a295be96e640669720000006109078383611e58565b11156109415760405163b14d3f5b60e01b8152600481018390526a295be96e64066972000000602482015260448101829052606401610704565b5f5b838110156109ee575f89898381811061095e5761095e611e6b565b90506020020160208101906109739190611bf3565b90505f88888481811061098857610988611e6b565b60200291909101359150506001600160a01b0382166109ba5760405163d92e233d60e01b815260040160405180910390fd5b805f036109da57604051631f2a200560e01b815260040160405180910390fd5b6109e48282610fd0565b5050600101610943565b505050505050505050565b6001600160a01b0381165f90815260076020526040812054610562565b5f6060805f805f6060610a276110e5565b610a2f611112565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f61067c600a546001600160a01b031690565b5f9182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461057790611e0c565b600a545f90600160d01b900465ffffffffffff168015158015610acf57504265ffffffffffff821610155b610ada575f80610aee565b600a54600160a01b900465ffffffffffff16815b915091509091565b5f33610605818585610df3565b600a545f90600160d01b900465ffffffffffff168015158015610b2d57504265ffffffffffff8216105b610b4857600954600160d01b900465ffffffffffff16610b5b565b600a54600160a01b900465ffffffffffff165b91505090565b5f610b6a610ba0565b509050336001600160a01b03821614610b9857604051636116401160e11b8152336004820152602401610704565b61062161113f565b6009546001600160a01b03811691600160a01b90910465ffffffffffff1690565b83421115610be55760405163313c898160e11b815260048101859052602401610704565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c308c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610c8a826111d5565b90505f610c9982878787611201565b9050896001600160a01b0316816001600160a01b031614610ce0576040516325c0072360e11b81526001600160a01b0380831660048301528b166024820152604401610704565b610ceb8a8a8a610d55565b50505050505050505050565b81610d1557604051631fe1e13d60e11b815260040160405180910390fd5b61066f828261122d565b5f610d2981610d67565b610621611251565b5f6001600160e01b031982166318a4c3c360e11b148061056257506105628261125b565b610d62838383600161128f565b505050565b6106218133611361565b610d7b5f8061139a565b565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156108035781811015610de557604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610704565b61080384848484035f61128f565b6001600160a01b038316610e1c57604051634b637e8f60e11b81525f6004820152602401610704565b6001600160a01b038216610e455760405163ec442f0560e01b81525f6004820152602401610704565b610d62838383611459565b5f82815260086020526040902060010154610e6a81610d67565b610803838361157f565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610ecc57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ef657507f000000000000000000000000000000000000000000000000000000000000000090565b61067c604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b6001600160a01b0381163314610fc65760405163334bd91960e11b815260040160405180910390fd5b610d6282826115ec565b6001600160a01b038216610ff95760405163ec442f0560e01b81525f6004820152602401610704565b61066f5f8383611459565b5f61100d610b03565b61101642611628565b6110209190611e7f565b905061102c828261165e565b60405165ffffffffffff821681526001600160a01b038316907f3377dc44241e779dd06afab5b788a35ca5f3b778836e2990bdb26a2a4b2e5ed69060200160405180910390a25050565b5f611080826116db565b61108942611628565b6110939190611e7f565b905061109f828261139a565b6040805165ffffffffffff8085168252831660208201527ff1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b910160405180910390a15050565b606061067c7f00000000000000000000000000000000000000000000000000000000000000006005611722565b606061067c7f00000000000000000000000000000000000000000000000000000000000000006006611722565b5f80611149610ba0565b9150915061115e8165ffffffffffff16151590565b158061117257504265ffffffffffff821610155b1561119a576040516319ca5ebb60e01b815265ffffffffffff82166004820152602401610704565b6111b55f6111b0600a546001600160a01b031690565b6115ec565b506111c05f8361157f565b5050600980546001600160d01b031916905550565b5f6105626111e1610e74565b8360405161190160f01b8152600281019290925260228201526042902090565b5f805f80611211888888886117cb565b9250925092506112218282611893565b50909695505050505050565b5f8281526008602052604090206001015461124781610d67565b61080383836115ec565b610d7b5f8061165e565b5f6001600160e01b03198216637965db0b60e01b148061056257506301ffc9a760e01b6001600160e01b0319831614610562565b6001600160a01b0384166112b85760405163e602df0560e01b81525f6004820152602401610704565b6001600160a01b0383166112e157604051634a1406b160e11b81525f6004820152602401610704565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561080357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161135391815260200190565b60405180910390a350505050565b61136b8282610a6b565b61066f5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610704565b600a54600160d01b900465ffffffffffff16801561141c574265ffffffffffff821610156113f357600a54600980546001600160d01b0316600160a01b90920465ffffffffffff16600160d01b0291909117905561141c565b6040517f2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec5905f90a15b50600a80546001600160a01b0316600160a01b65ffffffffffff948516026001600160d01b031617600160d01b9290931691909102919091179055565b6001600160a01b038316611483578060025f8282546114789190611e58565b909155506114f39050565b6001600160a01b0383165f90815260208190526040902054818110156114d55760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610704565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661150f5760028054829003905561152d565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161157291815260200190565b60405180910390a3505050565b5f826115db575f611598600a546001600160a01b031690565b6001600160a01b0316146115bf57604051631fe1e13d60e11b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0384161790555b6115e5838361194b565b9392505050565b5f821580156116085750600a546001600160a01b038381169116145b1561161e57600a80546001600160a01b03191690555b6115e583836119dc565b5f65ffffffffffff82111561165a576040516306dfcc6560e41b81526030600482015260248101839052604401610704565b5090565b5f611667610ba0565b6009805465ffffffffffff8616600160a01b026001600160d01b03199091166001600160a01b0388161717905591506116a990508165ffffffffffff16151590565b15610d62576040517f8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a9605109905f90a1505050565b5f806116e5610b03565b90508065ffffffffffff168365ffffffffffff161161170d576117088382611ea5565b6115e5565b6115e565ffffffffffff841662069780611a47565b606060ff831461173c5761173583611a56565b9050610562565b81805461174890611e0c565b80601f016020809104026020016040519081016040528092919081815260200182805461177490611e0c565b80156117bf5780601f10611796576101008083540402835291602001916117bf565b820191905f5260205f20905b8154815290600101906020018083116117a257829003601f168201915b50505050509050610562565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180457505f91506003905082611889565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611855573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661188057505f925060019150829050611889565b92505f91508190505b9450945094915050565b5f8260038111156118a6576118a6611ec4565b036118af575050565b60018260038111156118c3576118c3611ec4565b036118e15760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156118f5576118f5611ec4565b036119165760405163fce698f760e01b815260048101829052602401610704565b600382600381111561192a5761192a611ec4565b0361066f576040516335e2f38360e21b815260048101829052602401610704565b5f6119568383610a6b565b6119d5575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561198d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610562565b505f610562565b5f6119e78383610a6b565b156119d5575f8381526008602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610562565b5f8282188284100282186115e5565b60605f611a6283611a93565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f81111561056257604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215611aca575f80fd5b81356001600160e01b0319811681146115e5575f80fd5b5f81518084525f5b81811015611b0557602081850181015186830182015201611ae9565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6115e56020830184611ae1565b80356001600160a01b0381168114611b4c575f80fd5b919050565b5f8060408385031215611b62575f80fd5b611b6b83611b36565b946020939093013593505050565b5f805f60608486031215611b8b575f80fd5b611b9484611b36565b9250611ba260208501611b36565b9150604084013590509250925092565b5f60208284031215611bc2575f80fd5b5035919050565b5f8060408385031215611bda575f80fd5b82359150611bea60208401611b36565b90509250929050565b5f60208284031215611c03575f80fd5b6115e582611b36565b5f60208284031215611c1c575f80fd5b813565ffffffffffff811681146115e5575f80fd5b5f8083601f840112611c41575f80fd5b50813567ffffffffffffffff811115611c58575f80fd5b6020830191508360208260051b8501011115611c72575f80fd5b9250929050565b5f805f8060408587031215611c8c575f80fd5b843567ffffffffffffffff80821115611ca3575f80fd5b611caf88838901611c31565b90965094506020870135915080821115611cc7575f80fd5b50611cd487828801611c31565b95989497509550505050565b60ff60f81b881681525f602060e06020840152611d0060e084018a611ae1565b8381036040850152611d12818a611ae1565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015611d6557835183529284019291840191600101611d49565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611d8d575f80fd5b611d9688611b36565b9650611da460208901611b36565b95506040880135945060608801359350608088013560ff81168114611dc7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611df5575f80fd5b611dfe83611b36565b9150611bea60208401611b36565b600181811c90821680611e2057607f821691505b602082108103611e3e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561056257610562611e44565b634e487b7160e01b5f52603260045260245ffd5b65ffffffffffff818116838216019080821115611e9e57611e9e611e44565b5092915050565b65ffffffffffff828116828216039080821115611e9e57611e9e611e44565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220145871c3c1dd382ef6bfb61cf276f7c60c4568691dc3e66c3d1d2cee8e1ce31764736f6c634300081800339f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6000000000000000000000000e3a972cdd37ee5196d0baaf68e591b3f6bd1aa61000000000000000000000000000000000000000000000000000000000002a300
0x608060405234801561000f575f80fd5b506004361061021e575f3560e01c80637c88e3d91161012a578063a217fddf116100b4578063d505accf11610079578063d505accf146104cb578063d5391393146104de578063d547741f14610505578063d602b9fd14610518578063dd62ed3e14610520575f80fd5b8063a217fddf14610473578063a9059cbb1461047a578063cc8463c81461048d578063cefc142914610495578063cf6eefb71461049d575f80fd5b806384ef8ffc116100fa57806384ef8ffc146104045780638da5cb5b1461042957806391d148541461043157806395d89b4114610444578063a1eda53c1461044c575f80fd5b80637c88e3d9146103ba5780637ecebe00146103cd5780637f7fa5ff146103e057806384b0196e146103e9575f80fd5b80632f2ff15d116101ab57806336568abe1161017b57806336568abe1461034657806340c10f1914610359578063634e93da1461036c578063649a5ec71461037f57806370a0823114610392575f80fd5b80632f2ff15d1461030a578063313ce5671461031d57806332cb6b0c1461032c5780633644e5151461033e575f80fd5b80630aa6220b116101f15780630aa6220b1461028e5780631339324b1461029857806318160ddd146102cd57806323b872dd146102d5578063248a9ca3146102e8575f80fd5b806301ffc9a714610222578063022d63fb1461024a57806306fdde0314610266578063095ea7b31461027b575b5f80fd5b610235610230366004611aba565b610558565b60405190151581526020015b60405180910390f35b620697805b60405165ffffffffffff9091168152602001610241565b61026e610568565b6040516102419190611b24565b610235610289366004611b51565b6105f8565b61029661060f565b005b6102bf7f70480ee89cb38eff00b7d23da25713d52ce19c6ed428691d22c58b2f615e3d6781565b604051908152602001610241565b6002546102bf565b6102356102e3366004611b79565b610624565b6102bf6102f6366004611bb2565b5f9081526008602052604090206001015490565b610296610318366004611bc9565b610647565b60405160128152602001610241565b6102bf6a295be96e6406697200000081565b6102bf610673565b610296610354366004611bc9565b610681565b610296610367366004611b51565b61072c565b61029661037a366004611bf3565b610809565b61029661038d366004611c0c565b61081c565b6102bf6103a0366004611bf3565b6001600160a01b03165f9081526020819052604090205490565b6102966103c8366004611c79565b61082f565b6102bf6103db366004611bf3565b6109f9565b6102bf6101f481565b6103f1610a16565b6040516102419796959493929190611ce0565b600a546001600160a01b03165b6040516001600160a01b039091168152602001610241565b610411610a58565b61023561043f366004611bc9565b610a6b565b61026e610a95565b610454610aa4565b6040805165ffffffffffff938416815292909116602083015201610241565b6102bf5f81565b610235610488366004611b51565b610af6565b61024f610b03565b610296610b61565b6104a5610ba0565b604080516001600160a01b03909316835265ffffffffffff909116602083015201610241565b6102966104d9366004611d77565b610bc1565b6102bf7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610296610513366004611bc9565b610cf7565b610296610d1f565b6102bf61052e366004611de4565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f61056282610d31565b92915050565b60606003805461057790611e0c565b80601f01602080910402602001604051908101604052809291908181526020018280546105a390611e0c565b80156105ee5780601f106105c5576101008083540402835291602001916105ee565b820191905f5260205f20905b8154815290600101906020018083116105d157829003601f168201915b5050505050905090565b5f33610605818585610d55565b5060019392505050565b5f61061981610d67565b610621610d71565b50565b5f33610631858285610d7d565b61063c858585610df3565b506001949350505050565b8161066557604051631fe1e13d60e11b815260040160405180910390fd5b61066f8282610e50565b5050565b5f61067c610e74565b905090565b8115801561069c5750600a546001600160a01b038281169116145b15610722575f806106ab610ba0565b90925090506001600160a01b0382161515806106cd575065ffffffffffff8116155b806106e057504265ffffffffffff821610155b1561070d576040516319ca5ebb60e01b815265ffffffffffff821660048201526024015b60405180910390fd5b50506009805465ffffffffffff60a01b191690555b61066f8282610f9d565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661075681610d67565b6001600160a01b03831661077d5760405163d92e233d60e01b815260040160405180910390fd5b815f0361079d57604051631f2a200560e01b815260040160405180910390fd5b5f6107a760025490565b90506a295be96e640669720000006107bf8483611e58565b11156107f95760405163b14d3f5b60e01b8152600481018490526a295be96e64066972000000602482015260448101829052606401610704565b6108038484610fd0565b50505050565b5f61081381610d67565b61066f82611004565b5f61082681610d67565b61066f82611076565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661085981610d67565b836101f48111156108885760405163042ebe0f60e41b8152600481018290526101f46024820152604401610704565b8083146108ab576040516001621398b960e31b0319815260040160405180910390fd5b5f805b828110156108e4578585828181106108c8576108c8611e6b565b90506020020135826108da9190611e58565b91506001016108ae565b505f6108ef60025490565b90506a295be96e640669720000006109078383611e58565b11156109415760405163b14d3f5b60e01b8152600481018390526a295be96e64066972000000602482015260448101829052606401610704565b5f5b838110156109ee575f89898381811061095e5761095e611e6b565b90506020020160208101906109739190611bf3565b90505f88888481811061098857610988611e6b565b60200291909101359150506001600160a01b0382166109ba5760405163d92e233d60e01b815260040160405180910390fd5b805f036109da57604051631f2a200560e01b815260040160405180910390fd5b6109e48282610fd0565b5050600101610943565b505050505050505050565b6001600160a01b0381165f90815260076020526040812054610562565b5f6060805f805f6060610a276110e5565b610a2f611112565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f61067c600a546001600160a01b031690565b5f9182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461057790611e0c565b600a545f90600160d01b900465ffffffffffff168015158015610acf57504265ffffffffffff821610155b610ada575f80610aee565b600a54600160a01b900465ffffffffffff16815b915091509091565b5f33610605818585610df3565b600a545f90600160d01b900465ffffffffffff168015158015610b2d57504265ffffffffffff8216105b610b4857600954600160d01b900465ffffffffffff16610b5b565b600a54600160a01b900465ffffffffffff165b91505090565b5f610b6a610ba0565b509050336001600160a01b03821614610b9857604051636116401160e11b8152336004820152602401610704565b61062161113f565b6009546001600160a01b03811691600160a01b90910465ffffffffffff1690565b83421115610be55760405163313c898160e11b815260048101859052602401610704565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c308c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610c8a826111d5565b90505f610c9982878787611201565b9050896001600160a01b0316816001600160a01b031614610ce0576040516325c0072360e11b81526001600160a01b0380831660048301528b166024820152604401610704565b610ceb8a8a8a610d55565b50505050505050505050565b81610d1557604051631fe1e13d60e11b815260040160405180910390fd5b61066f828261122d565b5f610d2981610d67565b610621611251565b5f6001600160e01b031982166318a4c3c360e11b148061056257506105628261125b565b610d62838383600161128f565b505050565b6106218133611361565b610d7b5f8061139a565b565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156108035781811015610de557604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610704565b61080384848484035f61128f565b6001600160a01b038316610e1c57604051634b637e8f60e11b81525f6004820152602401610704565b6001600160a01b038216610e455760405163ec442f0560e01b81525f6004820152602401610704565b610d62838383611459565b5f82815260086020526040902060010154610e6a81610d67565b610803838361157f565b5f306001600160a01b037f000000000000000000000000bb18ed95778b4afeed4346cf212328c4ed5fefb616148015610ecc57507f000000000000000000000000000000000000000000000000000000000000123746145b15610ef657507fb0fb2e33aaf6a2499d75b27cee78c67a718b41cdc7ad020e28245d7d3c5208fc90565b61067c604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fdf2ca8319a1a47117122e45a589dfeb573ce5ec29c2a021ba861b8343b55fb9d918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b6001600160a01b0381163314610fc65760405163334bd91960e11b815260040160405180910390fd5b610d6282826115ec565b6001600160a01b038216610ff95760405163ec442f0560e01b81525f6004820152602401610704565b61066f5f8383611459565b5f61100d610b03565b61101642611628565b6110209190611e7f565b905061102c828261165e565b60405165ffffffffffff821681526001600160a01b038316907f3377dc44241e779dd06afab5b788a35ca5f3b778836e2990bdb26a2a4b2e5ed69060200160405180910390a25050565b5f611080826116db565b61108942611628565b6110939190611e7f565b905061109f828261139a565b6040805165ffffffffffff8085168252831660208201527ff1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b910160405180910390a15050565b606061067c7f486f6f646d617020546f6b656e0000000000000000000000000000000000000d6005611722565b606061067c7f31000000000000000000000000000000000000000000000000000000000000016006611722565b5f80611149610ba0565b9150915061115e8165ffffffffffff16151590565b158061117257504265ffffffffffff821610155b1561119a576040516319ca5ebb60e01b815265ffffffffffff82166004820152602401610704565b6111b55f6111b0600a546001600160a01b031690565b6115ec565b506111c05f8361157f565b5050600980546001600160d01b031916905550565b5f6105626111e1610e74565b8360405161190160f01b8152600281019290925260228201526042902090565b5f805f80611211888888886117cb565b9250925092506112218282611893565b50909695505050505050565b5f8281526008602052604090206001015461124781610d67565b61080383836115ec565b610d7b5f8061165e565b5f6001600160e01b03198216637965db0b60e01b148061056257506301ffc9a760e01b6001600160e01b0319831614610562565b6001600160a01b0384166112b85760405163e602df0560e01b81525f6004820152602401610704565b6001600160a01b0383166112e157604051634a1406b160e11b81525f6004820152602401610704565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561080357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161135391815260200190565b60405180910390a350505050565b61136b8282610a6b565b61066f5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610704565b600a54600160d01b900465ffffffffffff16801561141c574265ffffffffffff821610156113f357600a54600980546001600160d01b0316600160a01b90920465ffffffffffff16600160d01b0291909117905561141c565b6040517f2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec5905f90a15b50600a80546001600160a01b0316600160a01b65ffffffffffff948516026001600160d01b031617600160d01b9290931691909102919091179055565b6001600160a01b038316611483578060025f8282546114789190611e58565b909155506114f39050565b6001600160a01b0383165f90815260208190526040902054818110156114d55760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610704565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661150f5760028054829003905561152d565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161157291815260200190565b60405180910390a3505050565b5f826115db575f611598600a546001600160a01b031690565b6001600160a01b0316146115bf57604051631fe1e13d60e11b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0384161790555b6115e5838361194b565b9392505050565b5f821580156116085750600a546001600160a01b038381169116145b1561161e57600a80546001600160a01b03191690555b6115e583836119dc565b5f65ffffffffffff82111561165a576040516306dfcc6560e41b81526030600482015260248101839052604401610704565b5090565b5f611667610ba0565b6009805465ffffffffffff8616600160a01b026001600160d01b03199091166001600160a01b0388161717905591506116a990508165ffffffffffff16151590565b15610d62576040517f8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a9605109905f90a1505050565b5f806116e5610b03565b90508065ffffffffffff168365ffffffffffff161161170d576117088382611ea5565b6115e5565b6115e565ffffffffffff841662069780611a47565b606060ff831461173c5761173583611a56565b9050610562565b81805461174890611e0c565b80601f016020809104026020016040519081016040528092919081815260200182805461177490611e0c565b80156117bf5780601f10611796576101008083540402835291602001916117bf565b820191905f5260205f20905b8154815290600101906020018083116117a257829003601f168201915b50505050509050610562565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180457505f91506003905082611889565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611855573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661188057505f925060019150829050611889565b92505f91508190505b9450945094915050565b5f8260038111156118a6576118a6611ec4565b036118af575050565b60018260038111156118c3576118c3611ec4565b036118e15760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156118f5576118f5611ec4565b036119165760405163fce698f760e01b815260048101829052602401610704565b600382600381111561192a5761192a611ec4565b0361066f576040516335e2f38360e21b815260048101829052602401610704565b5f6119568383610a6b565b6119d5575f8381526008602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561198d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610562565b505f610562565b5f6119e78383610a6b565b156119d5575f8381526008602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610562565b5f8282188284100282186115e5565b60605f611a6283611a93565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f81111561056257604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215611aca575f80fd5b81356001600160e01b0319811681146115e5575f80fd5b5f81518084525f5b81811015611b0557602081850181015186830182015201611ae9565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6115e56020830184611ae1565b80356001600160a01b0381168114611b4c575f80fd5b919050565b5f8060408385031215611b62575f80fd5b611b6b83611b36565b946020939093013593505050565b5f805f60608486031215611b8b575f80fd5b611b9484611b36565b9250611ba260208501611b36565b9150604084013590509250925092565b5f60208284031215611bc2575f80fd5b5035919050565b5f8060408385031215611bda575f80fd5b82359150611bea60208401611b36565b90509250929050565b5f60208284031215611c03575f80fd5b6115e582611b36565b5f60208284031215611c1c575f80fd5b813565ffffffffffff811681146115e5575f80fd5b5f8083601f840112611c41575f80fd5b50813567ffffffffffffffff811115611c58575f80fd5b6020830191508360208260051b8501011115611c72575f80fd5b9250929050565b5f805f8060408587031215611c8c575f80fd5b843567ffffffffffffffff80821115611ca3575f80fd5b611caf88838901611c31565b90965094506020870135915080821115611cc7575f80fd5b50611cd487828801611c31565b95989497509550505050565b60ff60f81b881681525f602060e06020840152611d0060e084018a611ae1565b8381036040850152611d12818a611ae1565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015611d6557835183529284019291840191600101611d49565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611d8d575f80fd5b611d9688611b36565b9650611da460208901611b36565b95506040880135945060608801359350608088013560ff81168114611dc7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611df5575f80fd5b611dfe83611b36565b9150611bea60208401611b36565b600181811c90821680611e2057607f821691505b602082108103611e3e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561056257610562611e44565b634e487b7160e01b5f52603260045260245ffd5b65ffffffffffff818116838216019080821115611e9e57611e9e611e44565b5092915050565b65ffffffffffff828116828216039080821115611e9e57611e9e611e44565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220145871c3c1dd382ef6bfb61cf276f7c60c4568691dc3e66c3d1d2cee8e1ce31764736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x25d60e…5472fc | 30 days agoFri, 17 Jul 2026 10:33:53 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…6bd1aa61 data: 0x000000000000000000…63100000 |
| 0xb73228…cb71b3 | 32 days agoWed, 15 Jul 2026 17:47:16 UTC | 0x2f8788…6f0d | [0] 0x9f2df0fed2c7…1c8956a6 [1] 0x000000000000…059ab13f [2] 0x000000000000…6bd1aa61 |
| 0x8dbca1…15ca29 | 32 days agoWed, 15 Jul 2026 17:46:49 UTC | 0x2f8788…6f0d | [0] 0x70480ee89cb3…615e3d67 [1] 0x000000000000…6bd1aa61 [2] 0x000000000000…6bd1aa61 |
| 0x8dbca1…15ca29 | 32 days agoWed, 15 Jul 2026 17:46:49 UTC | 0xbd79b8…00ff | [0] 0x9f2df0fed2c7…1c8956a6 [1] 0x000000000000…00000000 [2] 0x70480ee89cb3…615e3d67 |
| 0x8dbca1…15ca29 | 32 days agoWed, 15 Jul 2026 17:46:49 UTC | 0x2f8788…6f0d | [0] 0x9f2df0fed2c7…1c8956a6 [1] 0x000000000000…6bd1aa61 [2] 0x000000000000…6bd1aa61 |
| 0x8dbca1…15ca29 | 32 days agoWed, 15 Jul 2026 17:46:49 UTC | 0x2f8788…6f0d | [0] 0x000000000000…00000000 [1] 0x000000000000…6bd1aa61 [2] 0x000000000000…6bd1aa61 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xb73228…cb71b3 | grantRole | 10,585,015 | 32 days agoWed, 15 Jul 2026 17:47:16 UTC | 0xe3a9…aa61 | IN | Hoodmap Token | $0.000 ETH | 0.00000336 |