| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/token/common/ERC2981.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "erc6551/interfaces/IERC6551Registry.sol";
interface IFolioFeeDeskHook {
function depositFees() external payable;
function onFusion(uint256 survivor, uint256 absorbed) external;
}
interface ITokenBoundAccountView {
function token() external view returns (uint256 chainId, address tokenContract, uint256 tokenId);
}
contract FolioXNFT is ERC721Enumerable, ERC2981, Ownable, ReentrancyGuard {
using Strings for uint256;
uint256 public constant MAX_SUPPLY = 888;
uint256 public constant MINT_PRICE = 0.0025 ether;
uint256 public constant MAX_PER_WALLET = 5;
bytes32 public constant ACCOUNT_SALT = keccak256("FOLIO_X_ACCOUNT_V1");
IERC6551Registry public immutable registry;
address public immutable accountImplementation;
address payable public treasury;
address public gameEngine;
address public feeDesk;
bool public mintOpen;
bool public metadataFrozen;
bytes32 public collectionProvenanceHash;
uint256 public nextTokenId = 1;
string private baseTokenURI;
string private collectionContractURI;
struct Player {
uint64 xp;
uint32 streak;
uint32 bestStreak;
uint32 lastClockDay;
uint32 fusionCount;
uint16 powerBps;
uint8 rarity;
bool revealed;
}
mapping(uint256 => Player) public player;
mapping(uint256 => uint256) public mintBlock;
mapping(uint256 => bytes32) public revealEntropy;
mapping(uint256 => uint256) public fusedInto;
mapping(address => uint256) public mintedBy;
event FolioMinted(address indexed owner, uint256 indexed tokenId, address account);
event FolioRevealed(uint256 indexed tokenId, uint8 rarity, bytes32 seed);
event RevealEntropyCaptured(uint256 indexed tokenId, uint256 indexed targetBlock, bytes32 entropy);
event ClockedIn(uint256 indexed tokenId, uint32 streak, uint64 xpAwarded);
event Fusion(uint256 indexed survivor, uint256 indexed absorbed, uint16 newPowerBps);
event GameEngineUpdated(address indexed engine);
event FeeDeskUpdated(address indexed desk);
event MetadataFrozen(string baseURI, bytes32 indexed provenanceHash);
event ContractURIUpdated();
error MintClosed();
error InvalidQuantity();
error SupplyExceeded();
error WalletLimit();
error WrongPayment();
error NotTokenOwner();
error AlreadyClockedIn();
error RevealNotReady();
error RevealExpired();
error AlreadyRevealed();
error InvalidFusion();
error TreasuryTransferFailed();
error DeskNotSet();
error MetadataNotFrozen();
error ConfigurationLocked();
error OwnershipCycle();
constructor(address registry_, address implementation_, address payable treasury_)
ERC721("STOCKIO", "STOCKIO")
{
require(registry_ != address(0) && implementation_ != address(0) && treasury_ != address(0), "zero address");
registry = IERC6551Registry(registry_);
accountImplementation = implementation_;
treasury = treasury_;
_setDefaultRoyalty(treasury_, 333);
}
function mint(uint256 quantity) external payable nonReentrant {
if (!mintOpen) revert MintClosed();
if (feeDesk == address(0)) revert DeskNotSet();
if (!metadataFrozen) revert MetadataNotFrozen();
if (quantity == 0 || quantity > 5) revert InvalidQuantity();
if (nextTokenId + quantity - 1 > MAX_SUPPLY) revert SupplyExceeded();
if (mintedBy[msg.sender] + quantity > MAX_PER_WALLET) revert WalletLimit();
if (msg.value != MINT_PRICE * quantity) revert WrongPayment();
mintedBy[msg.sender] += quantity;
for (uint256 i; i < quantity; ++i) {
uint256 tokenId = nextTokenId++;
_safeMint(msg.sender, tokenId);
mintBlock[tokenId] = block.number;
player[tokenId].powerBps = 10_000;
address account = registry.createAccount(
accountImplementation, ACCOUNT_SALT, block.chainid, address(this), tokenId
);
emit FolioMinted(msg.sender, tokenId, account);
}
IFolioFeeDeskHook(feeDesk).depositFees{value: msg.value}();
}
/// @notice Permissionless capture prevents a later block producer or caller from substituting entropy.
function captureRevealEntropy(uint256 tokenId) external {
if (!_exists(tokenId)) revert InvalidFusion();
Player storage p = player[tokenId];
if (p.revealed) revert AlreadyRevealed();
if (revealEntropy[tokenId] != bytes32(0)) revert AlreadyRevealed();
uint256 target = mintBlock[tokenId] + 1;
if (block.number <= target) revert RevealNotReady();
bytes32 entropy = blockhash(target);
if (entropy == bytes32(0)) revert RevealExpired();
revealEntropy[tokenId] = entropy;
emit RevealEntropyCaptured(tokenId, target, entropy);
}
/// @notice Reveal uses the committed future block. A keeper must capture it within 256 blocks.
function reveal(uint256 tokenId) external {
if (!_exists(tokenId)) revert InvalidFusion();
Player storage p = player[tokenId];
if (p.revealed) revert AlreadyRevealed();
bytes32 entropy = revealEntropy[tokenId];
if (entropy == bytes32(0)) {
uint256 target = mintBlock[tokenId] + 1;
if (block.number <= target) revert RevealNotReady();
entropy = blockhash(target);
if (entropy == bytes32(0)) revert RevealExpired();
revealEntropy[tokenId] = entropy;
emit RevealEntropyCaptured(tokenId, target, entropy);
}
bytes32 seed = keccak256(abi.encodePacked(entropy, address(this), tokenId));
uint256 roll = uint256(seed) % 10_000;
p.rarity = roll < 5_800 ? 0 : roll < 8_500 ? 1 : roll < 9_700 ? 2 : 3;
p.revealed = true;
emit FolioRevealed(tokenId, p.rarity, seed);
}
function clockIn(uint256 tokenId) external {
if (ownerOf(tokenId) != msg.sender) revert NotTokenOwner();
Player storage p = player[tokenId];
uint32 today = uint32(block.timestamp / 1 days);
if (p.lastClockDay == today) revert AlreadyClockedIn();
p.streak = p.lastClockDay + 1 == today ? p.streak + 1 : 1;
p.lastClockDay = today;
if (p.streak > p.bestStreak) p.bestStreak = p.streak;
uint64 earned = uint64(100 + (p.streak > 30 ? 30 : p.streak) * 10);
p.xp += earned;
emit ClockedIn(tokenId, p.streak, earned);
}
function fuse(uint256 survivor, uint256 absorbed) external nonReentrant {
if (survivor == absorbed || ownerOf(survivor) != msg.sender || ownerOf(absorbed) != msg.sender) revert InvalidFusion();
Player storage a = player[survivor];
Player storage b = player[absorbed];
if (!a.revealed || !b.revealed) revert InvalidFusion();
fusedInto[absorbed] = survivor;
a.xp += b.xp;
a.fusionCount += b.fusionCount + 1;
uint256 mergedPower = uint256(a.powerBps) + uint256(b.powerBps);
a.powerBps = uint16(mergedPower * 120 / 100 > type(uint16).max ? type(uint16).max : mergedPower * 120 / 100);
if (feeDesk != address(0)) IFolioFeeDeskHook(feeDesk).onFusion(survivor, absorbed);
_burn(absorbed);
emit Fusion(survivor, absorbed, a.powerBps);
}
function awardXp(uint256 tokenId, uint64 amount) external {
require(msg.sender == gameEngine, "engine only");
if (!_exists(tokenId)) revert InvalidFusion();
player[tokenId].xp += amount;
}
function accountOf(uint256 tokenId) public view returns (address) {
return registry.account(accountImplementation, ACCOUNT_SALT, block.chainid, address(this), tokenId);
}
function accountOwnerOf(uint256 tokenId) external view returns (address) {
uint256 cursor = tokenId;
for (uint256 i; i < 32; ++i) {
if (_exists(cursor)) return ownerOf(cursor);
cursor = fusedInto[cursor];
if (cursor == 0) return address(0);
}
return address(0);
}
function levelOf(uint256 tokenId) external view returns (uint256) {
return 1 + player[tokenId].xp / 1_000;
}
function powerBpsOf(uint256 tokenId) external view returns (uint256) {
if (!_exists(tokenId)) revert InvalidFusion();
return player[tokenId].powerBps;
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
require(_exists(tokenId), "nonexistent token");
return bytes(baseTokenURI).length == 0 ? "" : string.concat(baseTokenURI, _paddedTokenId(tokenId), ".json");
}
/// @notice ERC-7572/OpenSea collection-level metadata.
function contractURI() external view returns (string memory) { return collectionContractURI; }
function _paddedTokenId(uint256 tokenId) private pure returns (string memory) {
string memory id = tokenId.toString();
if (tokenId < 10) return string.concat("000", id);
if (tokenId < 100) return string.concat("00", id);
if (tokenId < 1_000) return string.concat("0", id);
return id;
}
/// @dev STOCKIO NFTs cannot be nested in any STOCKIO ERC-6551 account. Token nesting could make
/// both the NFT and its vault unreachable through a circular ownership graph.
function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize)
internal override
{
if (to != address(0)) {
for (uint256 i; i < batchSize; ++i) {
if (to == accountOf(firstTokenId + i)) revert OwnershipCycle();
}
if (to.code.length != 0) {
try ITokenBoundAccountView(to).token() returns (
uint256 chainId, address tokenContract, uint256
) {
if (chainId == block.chainid && tokenContract == address(this)) revert OwnershipCycle();
} catch {}
}
}
super._beforeTokenTransfer(from, to, firstTokenId, batchSize);
}
function setMintOpen(bool open) external onlyOwner {
if (open && (feeDesk == address(0) || !metadataFrozen)) revert ConfigurationLocked();
mintOpen = open;
}
function setBaseURI(string calldata uri) external onlyOwner {
if (metadataFrozen) revert ConfigurationLocked();
baseTokenURI = uri;
}
function setContractURI(string calldata uri) external onlyOwner {
if (metadataFrozen || bytes(uri).length == 0) revert ConfigurationLocked();
collectionContractURI = uri;
emit ContractURIUpdated();
}
function freezeMetadata(bytes32 provenanceHash) external onlyOwner {
if (metadataFrozen || bytes(baseTokenURI).length == 0 || bytes(collectionContractURI).length == 0 || provenanceHash == bytes32(0)) revert ConfigurationLocked();
metadataFrozen = true;
collectionProvenanceHash = provenanceHash;
emit MetadataFrozen(baseTokenURI, provenanceHash);
}
function setGameEngine(address engine) external onlyOwner {
if (engine == address(0) || gameEngine != address(0) || mintOpen) revert ConfigurationLocked();
gameEngine = engine;
emit GameEngineUpdated(engine);
}
function setFeeDesk(address desk) external onlyOwner {
if (desk == address(0) || feeDesk != address(0) || mintOpen) revert ConfigurationLocked();
feeDesk = desk;
emit FeeDeskUpdated(desk);
}
function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable, ERC2981) returns (bool) {
return super.supportsInterface(interfaceId);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "registry_",
"type": "address",
"internalType": "address"
},
{
"name": "implementation_",
"type": "address",
"internalType": "address"
},
{
"name": "treasury_",
"type": "address",
"internalType": "address payable"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyClockedIn",
"type": "error",
"inputs": []
},
{
"name": "AlreadyRevealed",
"type": "error",
"inputs": []
},
{
"name": "ConfigurationLocked",
"type": "error",
"inputs": []
},
{
"name": "DeskNotSet",
"type": "error",
"inputs": []
},
{
"name": "InvalidFusion",
"type": "error",
"inputs": []
},
{
"name": "InvalidQuantity",
"type": "error",
"inputs": []
},
{
"name": "MetadataNotFrozen",
"type": "error",
"inputs": []
},
{
"name": "MintClosed",
"type": "error",
"inputs": []
},
{
"name": "NotTokenOwner",
"type": "error",
"inputs": []
},
{
"name": "OwnershipCycle",
"type": "error",
"inputs": []
},
{
"name": "RevealExpired",
"type": "error",
"inputs": []
},
{
"name": "RevealNotReady",
"type": "error",
"inputs": []
},
{
"name": "SupplyExceeded",
"type": "error",
"inputs": []
},
{
"name": "TreasuryTransferFailed",
"type": "error",
"inputs": []
},
{
"name": "WalletLimit",
"type": "error",
"inputs": []
},
{
"name": "WrongPayment",
"type": "error",
"inputs": []
},
{
"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": "ClockedIn",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "streak",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
},
{
"name": "xpAwarded",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "ContractURIUpdated",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "FeeDeskUpdated",
"type": "event",
"inputs": [
{
"name": "desk",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "FolioMinted",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "FolioRevealed",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "rarity",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "seed",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "Fusion",
"type": "event",
"inputs": [
{
"name": "survivor",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "absorbed",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "newPowerBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "GameEngineUpdated",
"type": "event",
"inputs": [
{
"name": "engine",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MetadataFrozen",
"type": "event",
"inputs": [
{
"name": "baseURI",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "provenanceHash",
"type": "bytes32",
"indexed": true,
"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": "RevealEntropyCaptured",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "targetBlock",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "entropy",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"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": "ACCOUNT_SALT",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "MAX_PER_WALLET",
"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": "MINT_PRICE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "accountImplementation",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "accountOf",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "accountOwnerOf",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "awardXp",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "captureRevealEntropy",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "clockIn",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "collectionProvenanceHash",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "contractURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "feeDesk",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "freezeMetadata",
"type": "function",
"inputs": [
{
"name": "provenanceHash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "fuse",
"type": "function",
"inputs": [
{
"name": "survivor",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "absorbed",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "fusedInto",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "gameEngine",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "getApproved",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "isApprovedForAll",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "operator",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "levelOf",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "metadataFrozen",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "mint",
"type": "function",
"inputs": [
{
"name": "quantity",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "mintBlock",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "mintOpen",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"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": "nextTokenId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "ownerOf",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "player",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "xp",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "streak",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "bestStreak",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "lastClockDay",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "fusionCount",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "powerBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "rarity",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "revealed",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "powerBpsOf",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "registry",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC6551Registry"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "reveal",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "revealEntropy",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"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": "setBaseURI",
"type": "function",
"inputs": [
{
"name": "uri",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setContractURI",
"type": "function",
"inputs": [
{
"name": "uri",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFeeDesk",
"type": "function",
"inputs": [
{
"name": "desk",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setGameEngine",
"type": "function",
"inputs": [
{
"name": "engine",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMintOpen",
"type": "function",
"inputs": [
{
"name": "open",
"type": "bool",
"internalType": "bool"
}
],
"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": "tokenByIndex",
"type": "function",
"inputs": [
{
"name": "index",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "tokenOfOwnerByIndex",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "index",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"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": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address payable"
}
],
"stateMutability": "view"
}
]0x60c06040526001601255348015610014575f5ffd5b50604051613f1d380380613f1d833981016040819052610033916102b6565b60408051808201825260078082526653544f434b494f60c81b6020808401829052845180860190955291845290830152905f61006f83826103a3565b50600161007c82826103a3565b50505061009561009061014d60201b60201c565b610151565b6001600d556001600160a01b038316158015906100ba57506001600160a01b03821615155b80156100ce57506001600160a01b03811615155b61010e5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064015b60405180910390fd5b6001600160a01b0383811660805282811660a052600e80546001600160a01b0319169183169190911790556101458161014d6101a2565b505050610461565b3390565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6127106001600160601b03821611156102105760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610105565b6001600160a01b0382166102665760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610105565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6001600160a01b03811681146102b3575f5ffd5b50565b5f5f5f606084860312156102c8575f5ffd5b83516102d38161029f565b60208501519093506102e48161029f565b60408501519092506102f58161029f565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061032857607f821691505b60208210810361034657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561039e578282111561039e57805f5260205f20601f840160051c602085101561037757505f5b90810190601f840160051c035f5b8181101561039a575f83820155600101610385565b5050505b505050565b81516001600160401b038111156103bc576103bc610300565b6103d0816103ca8454610314565b8461034c565b6020601f821160018114610402575f83156103eb5750848201515b5f19600385901b1c1916600184901b17845561045a565b5f84815260208120601f198516915b828110156104315787850151825560209485019460019092019101610411565b508482101561044e57868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b60805160a051613a7f61049e5f395f818161044401528181611645015261197801525f8181610782015281816116a801526119e20152613a7f5ff3fe608060405260043610610341575f3560e01c80636d6e1712116101bd578063b88d4fde116100f2578063e8a3d48511610092578063f2fde38b1161006d578063f2fde38b14610abe578063f68858e414610add578063f8004d3114610afc578063fb3cc6c214610b1b575f5ffd5b8063e8a3d48514610a38578063e985e9c514610a4c578063edf81cde14610a93575f5ffd5b8063c87b56dd116100cd578063c87b56dd146109a8578063d2716312146109c7578063e5336276146109fa578063e6bb60a714610a19575f5ffd5b8063b88d4fde14610950578063c002d23d1461096f578063c2ca0ac514610989575f5ffd5b80638da5cb5b1161015d57806395d89b411161013857806395d89b411461082a5780639e0551c61461083e578063a0712d681461091e578063a22cb46514610931575f5ffd5b80638da5cb5b146107cf5780638f4e4321146107ec578063938e3d7b1461080b575f5ffd5b8063716b319511610198578063716b31951461073d57806375794a3c1461075c5780637b10399914610771578063832f2b81146107a4575f5ffd5b80636d6e1712146106eb57806370a082311461070a578063715018a614610729575f5ffd5b80632f745c591161029357806355f804b31161023357806361d027b31161020e57806361d027b31461066f5780636352211e1461068e57806367dced1c146106ad5780636d5e3032146106cc575f5ffd5b806355f804b3146106065780635b706838146106255780635ecfb50f14610650575f5ffd5b806342842e0e1161026e57806342842e0e1461058a57806343e90b2b146105a95780634f6ccce7146105c857806350371095146105e7575f5ffd5b80632f745c591461052b57806332cb6b0c1461054a5780633cef28d21461055f575f5ffd5b806311464fbe116102fe5780631e1f34c7116102d95780631e1f34c71461049957806323b872dd146104ae57806324bbd049146104cd5780632a55205a146104ed575f5ffd5b806311464fbe1461043357806317bf18051461046657806318160ddd14610485575f5ffd5b806301ffc9a71461034557806306fdde0314610379578063081812fc1461039a578063095ea7b3146103d15780630f2cdd6c146103f25780630f6c431e14610414575b5f5ffd5b348015610350575f5ffd5b5061036461035f36600461315e565b610b3b565b60405190151581526020015b60405180910390f35b348015610384575f5ffd5b5061038d610b4b565b60405161037091906131ae565b3480156103a5575f5ffd5b506103b96103b43660046131c0565b610bda565b6040516001600160a01b039091168152602001610370565b3480156103dc575f5ffd5b506103f06103eb3660046131eb565b610bff565b005b3480156103fd575f5ffd5b50610406600581565b604051908152602001610370565b34801561041f575f5ffd5b506103f061042e3660046131c0565b610d18565b34801561043e575f5ffd5b506103b97f000000000000000000000000000000000000000000000000000000000000000081565b348015610471575f5ffd5b506103f0610480366004613215565b610f3f565b348015610490575f5ffd5b50600854610406565b3480156104a4575f5ffd5b5061040660115481565b3480156104b9575f5ffd5b506103f06104c8366004613230565b610fe2565b3480156104d8575f5ffd5b5060105461036490600160a01b900460ff1681565b3480156104f8575f5ffd5b5061050c61050736600461326e565b611013565b604080516001600160a01b039093168352602083019190915201610370565b348015610536575f5ffd5b506104066105453660046131eb565b6110bd565b348015610555575f5ffd5b5061040661037881565b34801561056a575f5ffd5b50610406610579366004613215565b60196020525f908152604090205481565b348015610595575f5ffd5b506103f06105a4366004613230565b611151565b3480156105b4575f5ffd5b506104066105c33660046131c0565b61116b565b3480156105d3575f5ffd5b506104066105e23660046131c0565b6111af565b3480156105f2575f5ffd5b506103f0610601366004613215565b61123f565b348015610611575f5ffd5b506103f061062036600461328e565b6112e2565b348015610630575f5ffd5b5061040661063f3660046131c0565b60166020525f908152604090205481565b34801561065b575f5ffd5b506103f061066a3660046131c0565b611322565b34801561067a575f5ffd5b50600e546103b9906001600160a01b031681565b348015610699575f5ffd5b506103b96106a83660046131c0565b6113e2565b3480156106b8575f5ffd5b506103f06106c73660046132fa565b611441565b3480156106d7575f5ffd5b506104066106e63660046131c0565b6114fd565b3480156106f6575f5ffd5b506103b96107053660046131c0565b61153b565b348015610715575f5ffd5b50610406610724366004613215565b611597565b348015610734575f5ffd5b506103f061161b565b348015610748575f5ffd5b506010546103b9906001600160a01b031681565b348015610767575f5ffd5b5061040660125481565b34801561077c575f5ffd5b506103b97f000000000000000000000000000000000000000000000000000000000000000081565b3480156107af575f5ffd5b506104066107be3660046131c0565b60176020525f908152604090205481565b3480156107da575f5ffd5b50600c546001600160a01b03166103b9565b3480156107f7575f5ffd5b506103b96108063660046131c0565b61162e565b348015610816575f5ffd5b506103f061082536600461328e565b611713565b348015610835575f5ffd5b5061038d611789565b348015610849575f5ffd5b506108c26108583660046131c0565b60156020525f90815260409020546001600160401b0381169063ffffffff600160401b8204811691600160601b8104821691600160801b8204811691600160a01b81049091169061ffff600160c01b8204169060ff600160d01b8204811691600160d81b90041688565b604080516001600160401b03909916895263ffffffff97881660208a01529587169588019590955292851660608701529316608085015261ffff90921660a084015260ff90911660c0830152151560e082015261010001610370565b6103f061092c3660046131c0565b611798565b34801561093c575f5ffd5b506103f061094b366004613347565b611b0b565b34801561095b575f5ffd5b506103f061096a36600461338e565b611b1a565b34801561097a575f5ffd5b506104066608e1bc9bf0400081565b348015610994575f5ffd5b506103f06109a33660046131c0565b611b52565b3480156109b3575f5ffd5b5061038d6109c23660046131c0565b611d69565b3480156109d2575f5ffd5b506104067fa7e6253b7c2afdc1f4b8db09d501f61b3eff43446662a292d9ea8127056cec9781565b348015610a05575f5ffd5b50600f546103b9906001600160a01b031681565b348015610a24575f5ffd5b506103f0610a333660046131c0565b611e0b565b348015610a43575f5ffd5b5061038d611f43565b348015610a57575f5ffd5b50610364610a6636600461346c565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b348015610a9e575f5ffd5b50610406610aad3660046131c0565b60186020525f908152604090205481565b348015610ac9575f5ffd5b506103f0610ad8366004613215565b611f52565b348015610ae8575f5ffd5b506103f0610af736600461326e565b611fc8565b348015610b07575f5ffd5b506103f0610b16366004613498565b612279565b348015610b26575f5ffd5b5060105461036490600160a81b900460ff1681565b5f610b45826122e7565b92915050565b60605f8054610b59906134b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b85906134b1565b8015610bd05780601f10610ba757610100808354040283529160200191610bd0565b820191905f5260205f20905b815481529060010190602001808311610bb357829003601f168201915b5050505050905090565b5f610be48261230b565b505f908152600460205260409020546001600160a01b031690565b5f610c09826113e2565b9050806001600160a01b0316836001600160a01b031603610c7b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610c975750610c978133610a66565b610d095760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610c72565b610d13838361235b565b505050565b33610d22826113e2565b6001600160a01b031614610d49576040516359dc379f60e01b815260040160405180910390fd5b5f81815260156020526040812090610d646201518042613511565b825490915063ffffffff808316600160801b9092041603610d9857604051636f25b5dd60e01b815260040160405180910390fd5b815463ffffffff80831691610db791600160801b909104166001613524565b63ffffffff1614610dc9576001610de3565b8154610de390600160401b900463ffffffff166001613524565b825473ffffffff00000000ffffffff00000000000000001916600160401b63ffffffff928316810263ffffffff60801b191691909117600160801b8484160217808555600160601b810483169190049091161115610e60578154600160601b63ffffffff600160401b8304160263ffffffff60601b199091161782555b81545f90601e600160401b90910463ffffffff1611610e8d578254600160401b900463ffffffff16610e90565b601e5b610e9b90600a613540565b610ea6906064613524565b835463ffffffff919091169150819084905f90610ecd9084906001600160401b0316613566565b82546101009290920a6001600160401b03818102199093169183160217909155845460408051600160401b90920463ffffffff16825291841660208201528692507f60d78962fffd0fc432a0c0503441471e226119a892fa196c87d8b1fe7999d47d910160405180910390a250505050565b610f476123c8565b6001600160a01b0381161580610f6757506010546001600160a01b031615155b80610f7b5750601054600160a01b900460ff165b15610f995760405163bef561f560e01b815260040160405180910390fd5b601080546001600160a01b0319166001600160a01b0383169081179091556040517fbea177d025695965fce1d5804b324482034e8f75d0e3242951585d97f6ac6f53905f90a250565b610fec3382612422565b6110085760405162461bcd60e51b8152600401610c7290613585565b610d1383838361249e565b5f828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611087575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f90612710906110a5906001600160601b0316876135d2565b6110af9190613511565b915196919550909350505050565b5f6110c783611597565b82106111295760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c72565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b610d1383838360405180602001604052805f815250611b1a565b5f6111758261260d565b611192576040516323f4f12360e01b815260040160405180910390fd5b505f90815260156020526040902054600160c01b900461ffff1690565b5f6111b960085490565b821061121c5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c72565b6008828154811061122f5761122f6135e9565b905f5260205f2001549050919050565b6112476123c8565b6001600160a01b03811615806112675750600f546001600160a01b031615155b8061127b5750601054600160a01b900460ff165b156112995760405163bef561f560e01b815260040160405180910390fd5b600f80546001600160a01b0319166001600160a01b0383169081179091556040517fbf9c220d39b3f9855515598460bfcd72fd10382c132338cc32ee08b0fc48f8be905f90a250565b6112ea6123c8565b601054600160a81b900460ff16156113155760405163bef561f560e01b815260040160405180910390fd5b6013610d13828483613653565b61132a6123c8565b601054600160a81b900460ff168061134e57506013805461134a906134b1565b1590505b80611365575060148054611361906134b1565b1590505b8061136e575080155b1561138c5760405163bef561f560e01b815260040160405180910390fd5b6010805460ff60a81b1916600160a81b179055601181905560405181907ffbe248ac283c609b12ad305f6d5688603fea171f6fe51b15df74333a2ee13c83906113d79060139061370c565b60405180910390a250565b5f818152600260205260408120546001600160a01b031680610b455760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610c72565b600f546001600160a01b031633146114895760405162461bcd60e51b815260206004820152600b60248201526a656e67696e65206f6e6c7960a81b6044820152606401610c72565b6114928261260d565b6114af576040516323f4f12360e01b815260040160405180910390fd5b5f82815260156020526040812080548392906114d59084906001600160401b0316613566565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505050565b5f81815260156020526040812054611521906103e8906001600160401b0316613793565b61152c906001613566565b6001600160401b031692915050565b5f81815b602081101561158e576115518261260d565b156115675761155f826113e2565b949350505050565b5f918252601860205260408220549182900361158657505f9392505050565b60010161153f565b505f9392505050565b5f6001600160a01b0382166116005760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610c72565b506001600160a01b03165f9081526003602052604090205490565b6116236123c8565b61162c5f612629565b565b60405163246a002160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527fa7e6253b7c2afdc1f4b8db09d501f61b3eff43446662a292d9ea8127056cec976024830152466044830152306064830152608482018390525f917f00000000000000000000000000000000000000000000000000000000000000009091169063246a00219060a401602060405180830381865afa1580156116ef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4591906137c0565b61171b6123c8565b601054600160a81b900460ff1680611731575080155b1561174f5760405163bef561f560e01b815260040160405180910390fd5b601461175c828483613653565b506040517fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962905f90a15050565b606060018054610b59906134b1565b6117a061267a565b601054600160a01b900460ff166117ca5760405163589ed34b60e01b815260040160405180910390fd5b6010546001600160a01b03166117f3576040516375c46c6d60e01b815260040160405180910390fd5b601054600160a81b900460ff1661181d57604051630dc799dd60e31b815260040160405180910390fd5b80158061182a5750600581115b156118485760405163524f409b60e01b815260040160405180910390fd5b61037860018260125461185b91906137db565b61186591906137ee565b111561188457604051637d3d824960e01b815260040160405180910390fd5b335f908152601960205260409020546005906118a19083906137db565b11156118bf5760405162a84d4b60e71b815260040160405180910390fd5b6118d0816608e1bc9bf040006135d2565b34146118ef5760405163788a686f60e01b815260040160405180910390fd5b335f908152601960205260408120805483929061190d9084906137db565b909155505f90505b81811015611a9957601280545f918261192d83613801565b91905055905061193d33826126d3565b5f8181526016602090815260408083204390556015909152808220805461ffff60c01b191661027160c41b17905551638a54c52f60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811660048301527fa7e6253b7c2afdc1f4b8db09d501f61b3eff43446662a292d9ea8127056cec976024830152466044830152306064830152608482018490527f00000000000000000000000000000000000000000000000000000000000000001690638a54c52f9060a4016020604051808303815f875af1158015611a28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4c91906137c0565b6040516001600160a01b0382168152909150829033907f58ccb10dc41d8fe6643da58c99bc4c8cddd20bdcdb5a83179c8e795a4499170e9060200160405180910390a35050600101611915565b5060105f9054906101000a90046001600160a01b03166001600160a01b03166326741e7d346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611ae7575f5ffd5b505af1158015611af9573d5f5f3e3d5ffd5b5050505050611b086001600d55565b50565b611b163383836126ec565b5050565b611b243383612422565b611b405760405162461bcd60e51b8152600401610c7290613585565b611b4c848484846127b9565b50505050565b611b5b8161260d565b611b78576040516323f4f12360e01b815260040160405180910390fd5b5f8181526015602052604090208054600160d81b900460ff1615611baf5760405163a89ac15160e01b815260040160405180910390fd5b5f8281526017602052604090205480611c6f575f83815260166020526040812054611bdb9060016137db565b9050804311611bfd576040516306a1cf6d60e31b815260040160405180910390fd5b8040915081611c1f57604051634d39f3ff60e11b815260040160405180910390fd5b5f848152601760205260409081902083905551819085907fdaef9c51ae4169abab1e477607355adf1140ba5f2d2a1025452dd02f7232ab6d90611c659086815260200190565b60405180910390a3505b6040805160208082018490523060601b6bffffffffffffffffffffffff191682840152605480830187905283518084039091018152607490920190925280519101205f611cbe61271083613819565b90506116a88110611cf0576121348110611ce9576125e48110611ce2576003611cf2565b6002611cf2565b6001611cf2565b5f5b8454600160d81b61ffff60d01b19909116600160d01b60ff938416810260ff60d81b19169190911791909117808755604080519290910490921681526020810184905286917f8ae8cf8c46e7b1fa6dc4b9a8ea2c4903fecfcc28a59c5729e80993677b337718910160405180910390a25050505050565b6060611d748261260d565b611db45760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c72565b60138054611dc1906134b1565b159050611df8576013611dd3836127ec565b604051602001611de4929190613843565b604051602081830303815290604052610b45565b505060408051602081019091525f815290565b611e148161260d565b611e31576040516323f4f12360e01b815260040160405180910390fd5b5f8181526015602052604090208054600160d81b900460ff1615611e685760405163a89ac15160e01b815260040160405180910390fd5b5f8281526017602052604090205415611e945760405163a89ac15160e01b815260040160405180910390fd5b5f82815260166020526040812054611ead9060016137db565b9050804311611ecf576040516306a1cf6d60e31b815260040160405180910390fd5b804080611eef57604051634d39f3ff60e11b815260040160405180910390fd5b5f848152601760205260409081902082905551829085907fdaef9c51ae4169abab1e477607355adf1140ba5f2d2a1025452dd02f7232ab6d90611f359085815260200190565b60405180910390a350505050565b606060148054610b59906134b1565b611f5a6123c8565b6001600160a01b038116611fbf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c72565b611b0881612629565b611fd061267a565b80821480611fef575033611fe3836113e2565b6001600160a01b031614155b8061200b575033611fff826113e2565b6001600160a01b031614155b15612029576040516323f4f12360e01b815260040160405180910390fd5b5f8281526015602052604080822083835291208154600160d81b900460ff16158061205d57508054600160d81b900460ff16155b1561207b576040516323f4f12360e01b815260040160405180910390fd5b5f838152601860205260408120859055815483546001600160401b0391821692859290916120ab91859116613566565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550805f0160149054906101000a900463ffffffff1660016120ef9190613524565b8254839060149061210e908490600160a01b900463ffffffff16613524565b825463ffffffff9182166101009390930a928302919092021990911617905550805482545f916121509161ffff600160c01b92839004811692909104166137db565b905061ffff60646121628360786135d2565b61216c9190613511565b1161218d57606461217e8260786135d2565b6121889190613511565b612191565b61ffff5b835461ffff91909116600160c01b0261ffff60c01b199091161783556010546001600160a01b03161561221f57601054604051635664b07960e11b815260048101879052602481018690526001600160a01b039091169063acc960f2906044015f604051808303815f87803b158015612208575f5ffd5b505af115801561221a573d5f5f3e3d5ffd5b505050505b61222884612860565b8254604051600160c01b90910461ffff168152849086907fd2c1c8da76ca150202ad4a1003966ccfc6b32a52128e66c4829af507cf2a5b4e9060200160405180910390a3505050611b166001600d55565b6122816123c8565b8080156122ab57506010546001600160a01b031615806122ab5750601054600160a81b900460ff16155b156122c95760405163bef561f560e01b815260040160405180910390fd5b60108054911515600160a01b0260ff60a01b19909216919091179055565b5f6001600160e01b0319821663152a902d60e11b1480610b455750610b45826128ff565b6123148161260d565b611b085760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610c72565b5f81815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061238f826113e2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c546001600160a01b0316331461162c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c72565b5f5f61242d836113e2565b9050806001600160a01b0316846001600160a01b0316148061247357506001600160a01b038082165f9081526005602090815260408083209388168352929052205460ff165b8061155f5750836001600160a01b031661248c84610bda565b6001600160a01b031614949350505050565b826001600160a01b03166124b1826113e2565b6001600160a01b0316146124d75760405162461bcd60e51b8152600401610c72906138cd565b6001600160a01b0382166125395760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c72565b6125468383836001612923565b826001600160a01b0316612559826113e2565b6001600160a01b03161461257f5760405162461bcd60e51b8152600401610c72906138cd565b5f81815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080545f1901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5f908152600260205260409020546001600160a01b0316151590565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6002600d54036126cc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c72565b6002600d55565b611b16828260405180602001604052805f815250612a37565b816001600160a01b0316836001600160a01b03160361274d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c72565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6127c484848461249e565b6127d084848484612a69565b611b4c5760405162461bcd60e51b8152600401610c7290613912565b60605f6127f883612b66565b9050600a83101561282b57806040516020016128149190613964565b604051602081830303815290604052915050919050565b60648310156128455780604051602001612814919061397b565b6103e8831015610b4557806040516020016128149190613991565b5f61286a826113e2565b9050612879815f846001612923565b612882826113e2565b5f83815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080545f190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b5f6001600160e01b0319821663780e9d6360e01b1480610b455750610b4582612bf5565b6001600160a01b03831615612a2b575f5b818110156129825761294961080682856137db565b6001600160a01b0316846001600160a01b03160361297a5760405163b79e3f3f60e01b815260040160405180910390fd5b600101612934565b506001600160a01b0383163b15612a2b57826001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401606060405180830381865afa9250505080156129ed575060408051601f3d908101601f191682019092526129ea918101906139a6565b60015b15612a2b574683148015612a0957506001600160a01b03821630145b15612a275760405163b79e3f3f60e01b815260040160405180910390fd5b5050505b611b4c84848484612c44565b612a418383612d77565b612a4d5f848484612a69565b610d135760405162461bcd60e51b8152600401610c7290613912565b5f6001600160a01b0384163b15612b5b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612aac9033908990889088906004016139de565b6020604051808303815f875af1925050508015612ae6575060408051601f3d908101601f19168201909252612ae391810190613a1a565b60015b612b41573d808015612b13576040519150601f19603f3d011682016040523d82523d5f602084013e612b18565b606091505b5080515f03612b395760405162461bcd60e51b8152600401610c7290613912565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061155f565b506001949350505050565b60605f612b7283612ef0565b60010190505f816001600160401b03811115612b9057612b9061337a565b6040519080825280601f01601f191660200182016040528015612bba576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612bc457509392505050565b5f6001600160e01b031982166380ac58cd60e01b1480612c2557506001600160e01b03198216635b5e139f60e01b145b80610b4557506301ffc9a760e01b6001600160e01b0319831614610b45565b6001811115612cb35760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610c72565b816001600160a01b038516612d0e57612d0981600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612d31565b836001600160a01b0316856001600160a01b031614612d3157612d318582612fc7565b6001600160a01b038416612d4d57612d4881613060565b612d70565b846001600160a01b0316846001600160a01b031614612d7057612d708482613107565b5050505050565b6001600160a01b038216612dcd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c72565b612dd68161260d565b15612e235760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c72565b612e305f83836001612923565b612e398161260d565b15612e865760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c72565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612f2e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612f5a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612f7857662386f26fc10000830492506010015b6305f5e1008310612f90576305f5e100830492506008015b6127108310612fa457612710830492506004015b60648310612fb6576064830492506002015b600a8310610b455760010192915050565b5f6001612fd384611597565b612fdd91906137ee565b5f8381526007602052604090205490915080821461302e576001600160a01b0384165f9081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b505f9182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008545f90613071906001906137ee565b5f8381526009602052604081205460088054939450909284908110613098576130986135e9565b905f5260205f200154905080600883815481106130b7576130b76135e9565b5f9182526020808320909101929092558281526009909152604080822084905585825281205560088054806130ee576130ee613a35565b600190038181905f5260205f20015f9055905550505050565b5f61311183611597565b6001600160a01b039093165f908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114611b08575f5ffd5b5f6020828403121561316e575f5ffd5b813561317981613149565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6131796020830184613180565b5f602082840312156131d0575f5ffd5b5035919050565b6001600160a01b0381168114611b08575f5ffd5b5f5f604083850312156131fc575f5ffd5b8235613207816131d7565b946020939093013593505050565b5f60208284031215613225575f5ffd5b8135613179816131d7565b5f5f5f60608486031215613242575f5ffd5b833561324d816131d7565b9250602084013561325d816131d7565b929592945050506040919091013590565b5f5f6040838503121561327f575f5ffd5b50508035926020909101359150565b5f5f6020838503121561329f575f5ffd5b82356001600160401b038111156132b4575f5ffd5b8301601f810185136132c4575f5ffd5b80356001600160401b038111156132d9575f5ffd5b8560208284010111156132ea575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561330b575f5ffd5b8235915060208301356001600160401b0381168114613328575f5ffd5b809150509250929050565b80358015158114613342575f5ffd5b919050565b5f5f60408385031215613358575f5ffd5b8235613363816131d7565b915061337160208401613333565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f608085870312156133a1575f5ffd5b84356133ac816131d7565b935060208501356133bc816131d7565b92506040850135915060608501356001600160401b038111156133dd575f5ffd5b8501601f810187136133ed575f5ffd5b80356001600160401b038111156134065761340661337a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156134345761343461337a565b60405281815282820160200189101561344b575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f5f6040838503121561347d575f5ffd5b8235613488816131d7565b91506020830135613328816131d7565b5f602082840312156134a8575f5ffd5b61317982613333565b600181811c908216806134c557607f821691505b6020821081036134e357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261351f5761351f6134e9565b500490565b63ffffffff8181168382160190811115610b4557610b456134fd565b63ffffffff818116838216029081169081811461355f5761355f6134fd565b5092915050565b6001600160401b038181168382160190811115610b4557610b456134fd565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8082028115828204841417610b4557610b456134fd565b634e487b7160e01b5f52603260045260245ffd5b601f821115610d135782821115610d1357805f5260205f20601f840160051c602085101561362857505f5b90810190601f840160051c035f5b8181101561364b575f83820155600101613636565b505050505050565b6001600160401b0383111561366a5761366a61337a565b61367e8361367883546134b1565b836135fd565b5f601f8411600181146136af575f85156136985750838201355b5f19600387901b1c1916600186901b178355612d70565b5f83815260208120601f198716915b828110156136de57868501358255602094850194600190920191016136be565b50868210156136fa575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b602081525f5f835461371d816134b1565b806020860152600182165f811461373b576001811461375757613788565b60ff1983166040870152604082151560051b8701019350613788565b865f5260205f205f5b8381101561377f57815488820160400152600190910190602001613760565b87016040019450505b509195945050505050565b5f6001600160401b038316806137ab576137ab6134e9565b806001600160401b0384160491505092915050565b5f602082840312156137d0575f5ffd5b8151613179816131d7565b80820180821115610b4557610b456134fd565b81810381811115610b4557610b456134fd565b5f60018201613812576138126134fd565b5060010190565b5f82613827576138276134e9565b500690565b5f81518060208401855e5f93019283525090919050565b5f5f8454613850816134b1565b600182168015613867576001811461387c576138a9565b60ff19831686528115158202860193506138a9565b875f5260205f205f5b838110156138a157815488820152600190910190602001613885565b505081860193505b5050506138b6818561382c565b64173539b7b760d91b815260050195945050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6203030360ec1b81525f613179600383018461382c565b61030360f41b81525f613179600283018461382c565b600360fc1b81525f613179600183018461382c565b5f5f5f606084860312156139b8575f5ffd5b835160208501519093506139cb816131d7565b6040949094015192959394509192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90613a1090830184613180565b9695505050505050565b5f60208284031215613a2a575f5ffd5b815161317981613149565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220a36607403cd5871a50737f26a9d6f1ac1175813b0592887a6bad0f89e0c6160d64736f6c63430008240033000000000000000000000000126171d328e8d981976dd3062a6059a8d49dab4300000000000000000000000010ddeb41f2f9637ca67cfbe0c990ca1a1528a2f600000000000000000000000048165f3cd6145c656a056cdee7be01ff97fe2b00
0x608060405260043610610341575f3560e01c80636d6e1712116101bd578063b88d4fde116100f2578063e8a3d48511610092578063f2fde38b1161006d578063f2fde38b14610abe578063f68858e414610add578063f8004d3114610afc578063fb3cc6c214610b1b575f5ffd5b8063e8a3d48514610a38578063e985e9c514610a4c578063edf81cde14610a93575f5ffd5b8063c87b56dd116100cd578063c87b56dd146109a8578063d2716312146109c7578063e5336276146109fa578063e6bb60a714610a19575f5ffd5b8063b88d4fde14610950578063c002d23d1461096f578063c2ca0ac514610989575f5ffd5b80638da5cb5b1161015d57806395d89b411161013857806395d89b411461082a5780639e0551c61461083e578063a0712d681461091e578063a22cb46514610931575f5ffd5b80638da5cb5b146107cf5780638f4e4321146107ec578063938e3d7b1461080b575f5ffd5b8063716b319511610198578063716b31951461073d57806375794a3c1461075c5780637b10399914610771578063832f2b81146107a4575f5ffd5b80636d6e1712146106eb57806370a082311461070a578063715018a614610729575f5ffd5b80632f745c591161029357806355f804b31161023357806361d027b31161020e57806361d027b31461066f5780636352211e1461068e57806367dced1c146106ad5780636d5e3032146106cc575f5ffd5b806355f804b3146106065780635b706838146106255780635ecfb50f14610650575f5ffd5b806342842e0e1161026e57806342842e0e1461058a57806343e90b2b146105a95780634f6ccce7146105c857806350371095146105e7575f5ffd5b80632f745c591461052b57806332cb6b0c1461054a5780633cef28d21461055f575f5ffd5b806311464fbe116102fe5780631e1f34c7116102d95780631e1f34c71461049957806323b872dd146104ae57806324bbd049146104cd5780632a55205a146104ed575f5ffd5b806311464fbe1461043357806317bf18051461046657806318160ddd14610485575f5ffd5b806301ffc9a71461034557806306fdde0314610379578063081812fc1461039a578063095ea7b3146103d15780630f2cdd6c146103f25780630f6c431e14610414575b5f5ffd5b348015610350575f5ffd5b5061036461035f36600461315e565b610b3b565b60405190151581526020015b60405180910390f35b348015610384575f5ffd5b5061038d610b4b565b60405161037091906131ae565b3480156103a5575f5ffd5b506103b96103b43660046131c0565b610bda565b6040516001600160a01b039091168152602001610370565b3480156103dc575f5ffd5b506103f06103eb3660046131eb565b610bff565b005b3480156103fd575f5ffd5b50610406600581565b604051908152602001610370565b34801561041f575f5ffd5b506103f061042e3660046131c0565b610d18565b34801561043e575f5ffd5b506103b97f00000000000000000000000010ddeb41f2f9637ca67cfbe0c990ca1a1528a2f681565b348015610471575f5ffd5b506103f0610480366004613215565b610f3f565b348015610490575f5ffd5b50600854610406565b3480156104a4575f5ffd5b5061040660115481565b3480156104b9575f5ffd5b506103f06104c8366004613230565b610fe2565b3480156104d8575f5ffd5b5060105461036490600160a01b900460ff1681565b3480156104f8575f5ffd5b5061050c61050736600461326e565b611013565b604080516001600160a01b039093168352602083019190915201610370565b348015610536575f5ffd5b506104066105453660046131eb565b6110bd565b348015610555575f5ffd5b5061040661037881565b34801561056a575f5ffd5b50610406610579366004613215565b60196020525f908152604090205481565b348015610595575f5ffd5b506103f06105a4366004613230565b611151565b3480156105b4575f5ffd5b506104066105c33660046131c0565b61116b565b3480156105d3575f5ffd5b506104066105e23660046131c0565b6111af565b3480156105f2575f5ffd5b506103f0610601366004613215565b61123f565b348015610611575f5ffd5b506103f061062036600461328e565b6112e2565b348015610630575f5ffd5b5061040661063f3660046131c0565b60166020525f908152604090205481565b34801561065b575f5ffd5b506103f061066a3660046131c0565b611322565b34801561067a575f5ffd5b50600e546103b9906001600160a01b031681565b348015610699575f5ffd5b506103b96106a83660046131c0565b6113e2565b3480156106b8575f5ffd5b506103f06106c73660046132fa565b611441565b3480156106d7575f5ffd5b506104066106e63660046131c0565b6114fd565b3480156106f6575f5ffd5b506103b96107053660046131c0565b61153b565b348015610715575f5ffd5b50610406610724366004613215565b611597565b348015610734575f5ffd5b506103f061161b565b348015610748575f5ffd5b506010546103b9906001600160a01b031681565b348015610767575f5ffd5b5061040660125481565b34801561077c575f5ffd5b506103b97f000000000000000000000000126171d328e8d981976dd3062a6059a8d49dab4381565b3480156107af575f5ffd5b506104066107be3660046131c0565b60176020525f908152604090205481565b3480156107da575f5ffd5b50600c546001600160a01b03166103b9565b3480156107f7575f5ffd5b506103b96108063660046131c0565b61162e565b348015610816575f5ffd5b506103f061082536600461328e565b611713565b348015610835575f5ffd5b5061038d611789565b348015610849575f5ffd5b506108c26108583660046131c0565b60156020525f90815260409020546001600160401b0381169063ffffffff600160401b8204811691600160601b8104821691600160801b8204811691600160a01b81049091169061ffff600160c01b8204169060ff600160d01b8204811691600160d81b90041688565b604080516001600160401b03909916895263ffffffff97881660208a01529587169588019590955292851660608701529316608085015261ffff90921660a084015260ff90911660c0830152151560e082015261010001610370565b6103f061092c3660046131c0565b611798565b34801561093c575f5ffd5b506103f061094b366004613347565b611b0b565b34801561095b575f5ffd5b506103f061096a36600461338e565b611b1a565b34801561097a575f5ffd5b506104066608e1bc9bf0400081565b348015610994575f5ffd5b506103f06109a33660046131c0565b611b52565b3480156109b3575f5ffd5b5061038d6109c23660046131c0565b611d69565b3480156109d2575f5ffd5b506104067fa7e6253b7c2afdc1f4b8db09d501f61b3eff43446662a292d9ea8127056cec9781565b348015610a05575f5ffd5b50600f546103b9906001600160a01b031681565b348015610a24575f5ffd5b506103f0610a333660046131c0565b611e0b565b348015610a43575f5ffd5b5061038d611f43565b348015610a57575f5ffd5b50610364610a6636600461346c565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b348015610a9e575f5ffd5b50610406610aad3660046131c0565b60186020525f908152604090205481565b348015610ac9575f5ffd5b506103f0610ad8366004613215565b611f52565b348015610ae8575f5ffd5b506103f0610af736600461326e565b611fc8565b348015610b07575f5ffd5b506103f0610b16366004613498565b612279565b348015610b26575f5ffd5b5060105461036490600160a81b900460ff1681565b5f610b45826122e7565b92915050565b60605f8054610b59906134b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b85906134b1565b8015610bd05780601f10610ba757610100808354040283529160200191610bd0565b820191905f5260205f20905b815481529060010190602001808311610bb357829003601f168201915b5050505050905090565b5f610be48261230b565b505f908152600460205260409020546001600160a01b031690565b5f610c09826113e2565b9050806001600160a01b0316836001600160a01b031603610c7b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610c975750610c978133610a66565b610d095760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610c72565b610d13838361235b565b505050565b33610d22826113e2565b6001600160a01b031614610d49576040516359dc379f60e01b815260040160405180910390fd5b5f81815260156020526040812090610d646201518042613511565b825490915063ffffffff808316600160801b9092041603610d9857604051636f25b5dd60e01b815260040160405180910390fd5b815463ffffffff80831691610db791600160801b909104166001613524565b63ffffffff1614610dc9576001610de3565b8154610de390600160401b900463ffffffff166001613524565b825473ffffffff00000000ffffffff00000000000000001916600160401b63ffffffff928316810263ffffffff60801b191691909117600160801b8484160217808555600160601b810483169190049091161115610e60578154600160601b63ffffffff600160401b8304160263ffffffff60601b199091161782555b81545f90601e600160401b90910463ffffffff1611610e8d578254600160401b900463ffffffff16610e90565b601e5b610e9b90600a613540565b610ea6906064613524565b835463ffffffff919091169150819084905f90610ecd9084906001600160401b0316613566565b82546101009290920a6001600160401b03818102199093169183160217909155845460408051600160401b90920463ffffffff16825291841660208201528692507f60d78962fffd0fc432a0c0503441471e226119a892fa196c87d8b1fe7999d47d910160405180910390a250505050565b610f476123c8565b6001600160a01b0381161580610f6757506010546001600160a01b031615155b80610f7b5750601054600160a01b900460ff165b15610f995760405163bef561f560e01b815260040160405180910390fd5b601080546001600160a01b0319166001600160a01b0383169081179091556040517fbea177d025695965fce1d5804b324482034e8f75d0e3242951585d97f6ac6f53905f90a250565b610fec3382612422565b6110085760405162461bcd60e51b8152600401610c7290613585565b610d1383838361249e565b5f828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611087575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f90612710906110a5906001600160601b0316876135d2565b6110af9190613511565b915196919550909350505050565b5f6110c783611597565b82106111295760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c72565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b610d1383838360405180602001604052805f815250611b1a565b5f6111758261260d565b611192576040516323f4f12360e01b815260040160405180910390fd5b505f90815260156020526040902054600160c01b900461ffff1690565b5f6111b960085490565b821061121c5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c72565b6008828154811061122f5761122f6135e9565b905f5260205f2001549050919050565b6112476123c8565b6001600160a01b03811615806112675750600f546001600160a01b031615155b8061127b5750601054600160a01b900460ff165b156112995760405163bef561f560e01b815260040160405180910390fd5b600f80546001600160a01b0319166001600160a01b0383169081179091556040517fbf9c220d39b3f9855515598460bfcd72fd10382c132338cc32ee08b0fc48f8be905f90a250565b6112ea6123c8565b601054600160a81b900460ff16156113155760405163bef561f560e01b815260040160405180910390fd5b6013610d13828483613653565b61132a6123c8565b601054600160a81b900460ff168061134e57506013805461134a906134b1565b1590505b80611365575060148054611361906134b1565b1590505b8061136e575080155b1561138c5760405163bef561f560e01b815260040160405180910390fd5b6010805460ff60a81b1916600160a81b179055601181905560405181907ffbe248ac283c609b12ad305f6d5688603fea171f6fe51b15df74333a2ee13c83906113d79060139061370c565b60405180910390a250565b5f818152600260205260408120546001600160a01b031680610b455760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610c72565b600f546001600160a01b031633146114895760405162461bcd60e51b815260206004820152600b60248201526a656e67696e65206f6e6c7960a81b6044820152606401610c72565b6114928261260d565b6114af576040516323f4f12360e01b815260040160405180910390fd5b5f82815260156020526040812080548392906114d59084906001600160401b0316613566565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505050565b5f81815260156020526040812054611521906103e8906001600160401b0316613793565b61152c906001613566565b6001600160401b031692915050565b5f81815b602081101561158e576115518261260d565b156115675761155f826113e2565b949350505050565b5f918252601860205260408220549182900361158657505f9392505050565b60010161153f565b505f9392505050565b5f6001600160a01b0382166116005760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610c72565b506001600160a01b03165f9081526003602052604090205490565b6116236123c8565b61162c5f612629565b565b60405163246a002160e01b81526001600160a01b037f00000000000000000000000010ddeb41f2f9637ca67cfbe0c990ca1a1528a2f6811660048301527fa7e6253b7c2afdc1f4b8db09d501f61b3eff43446662a292d9ea8127056cec976024830152466044830152306064830152608482018390525f917f000000000000000000000000126171d328e8d981976dd3062a6059a8d49dab439091169063246a00219060a401602060405180830381865afa1580156116ef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4591906137c0565b61171b6123c8565b601054600160a81b900460ff1680611731575080155b1561174f5760405163bef561f560e01b815260040160405180910390fd5b601461175c828483613653565b506040517fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962905f90a15050565b606060018054610b59906134b1565b6117a061267a565b601054600160a01b900460ff166117ca5760405163589ed34b60e01b815260040160405180910390fd5b6010546001600160a01b03166117f3576040516375c46c6d60e01b815260040160405180910390fd5b601054600160a81b900460ff1661181d57604051630dc799dd60e31b815260040160405180910390fd5b80158061182a5750600581115b156118485760405163524f409b60e01b815260040160405180910390fd5b61037860018260125461185b91906137db565b61186591906137ee565b111561188457604051637d3d824960e01b815260040160405180910390fd5b335f908152601960205260409020546005906118a19083906137db565b11156118bf5760405162a84d4b60e71b815260040160405180910390fd5b6118d0816608e1bc9bf040006135d2565b34146118ef5760405163788a686f60e01b815260040160405180910390fd5b335f908152601960205260408120805483929061190d9084906137db565b909155505f90505b81811015611a9957601280545f918261192d83613801565b91905055905061193d33826126d3565b5f8181526016602090815260408083204390556015909152808220805461ffff60c01b191661027160c41b17905551638a54c52f60e01b81527f00000000000000000000000010ddeb41f2f9637ca67cfbe0c990ca1a1528a2f66001600160a01b0390811660048301527fa7e6253b7c2afdc1f4b8db09d501f61b3eff43446662a292d9ea8127056cec976024830152466044830152306064830152608482018490527f000000000000000000000000126171d328e8d981976dd3062a6059a8d49dab431690638a54c52f9060a4016020604051808303815f875af1158015611a28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4c91906137c0565b6040516001600160a01b0382168152909150829033907f58ccb10dc41d8fe6643da58c99bc4c8cddd20bdcdb5a83179c8e795a4499170e9060200160405180910390a35050600101611915565b5060105f9054906101000a90046001600160a01b03166001600160a01b03166326741e7d346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611ae7575f5ffd5b505af1158015611af9573d5f5f3e3d5ffd5b5050505050611b086001600d55565b50565b611b163383836126ec565b5050565b611b243383612422565b611b405760405162461bcd60e51b8152600401610c7290613585565b611b4c848484846127b9565b50505050565b611b5b8161260d565b611b78576040516323f4f12360e01b815260040160405180910390fd5b5f8181526015602052604090208054600160d81b900460ff1615611baf5760405163a89ac15160e01b815260040160405180910390fd5b5f8281526017602052604090205480611c6f575f83815260166020526040812054611bdb9060016137db565b9050804311611bfd576040516306a1cf6d60e31b815260040160405180910390fd5b8040915081611c1f57604051634d39f3ff60e11b815260040160405180910390fd5b5f848152601760205260409081902083905551819085907fdaef9c51ae4169abab1e477607355adf1140ba5f2d2a1025452dd02f7232ab6d90611c659086815260200190565b60405180910390a3505b6040805160208082018490523060601b6bffffffffffffffffffffffff191682840152605480830187905283518084039091018152607490920190925280519101205f611cbe61271083613819565b90506116a88110611cf0576121348110611ce9576125e48110611ce2576003611cf2565b6002611cf2565b6001611cf2565b5f5b8454600160d81b61ffff60d01b19909116600160d01b60ff938416810260ff60d81b19169190911791909117808755604080519290910490921681526020810184905286917f8ae8cf8c46e7b1fa6dc4b9a8ea2c4903fecfcc28a59c5729e80993677b337718910160405180910390a25050505050565b6060611d748261260d565b611db45760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c72565b60138054611dc1906134b1565b159050611df8576013611dd3836127ec565b604051602001611de4929190613843565b604051602081830303815290604052610b45565b505060408051602081019091525f815290565b611e148161260d565b611e31576040516323f4f12360e01b815260040160405180910390fd5b5f8181526015602052604090208054600160d81b900460ff1615611e685760405163a89ac15160e01b815260040160405180910390fd5b5f8281526017602052604090205415611e945760405163a89ac15160e01b815260040160405180910390fd5b5f82815260166020526040812054611ead9060016137db565b9050804311611ecf576040516306a1cf6d60e31b815260040160405180910390fd5b804080611eef57604051634d39f3ff60e11b815260040160405180910390fd5b5f848152601760205260409081902082905551829085907fdaef9c51ae4169abab1e477607355adf1140ba5f2d2a1025452dd02f7232ab6d90611f359085815260200190565b60405180910390a350505050565b606060148054610b59906134b1565b611f5a6123c8565b6001600160a01b038116611fbf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c72565b611b0881612629565b611fd061267a565b80821480611fef575033611fe3836113e2565b6001600160a01b031614155b8061200b575033611fff826113e2565b6001600160a01b031614155b15612029576040516323f4f12360e01b815260040160405180910390fd5b5f8281526015602052604080822083835291208154600160d81b900460ff16158061205d57508054600160d81b900460ff16155b1561207b576040516323f4f12360e01b815260040160405180910390fd5b5f838152601860205260408120859055815483546001600160401b0391821692859290916120ab91859116613566565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550805f0160149054906101000a900463ffffffff1660016120ef9190613524565b8254839060149061210e908490600160a01b900463ffffffff16613524565b825463ffffffff9182166101009390930a928302919092021990911617905550805482545f916121509161ffff600160c01b92839004811692909104166137db565b905061ffff60646121628360786135d2565b61216c9190613511565b1161218d57606461217e8260786135d2565b6121889190613511565b612191565b61ffff5b835461ffff91909116600160c01b0261ffff60c01b199091161783556010546001600160a01b03161561221f57601054604051635664b07960e11b815260048101879052602481018690526001600160a01b039091169063acc960f2906044015f604051808303815f87803b158015612208575f5ffd5b505af115801561221a573d5f5f3e3d5ffd5b505050505b61222884612860565b8254604051600160c01b90910461ffff168152849086907fd2c1c8da76ca150202ad4a1003966ccfc6b32a52128e66c4829af507cf2a5b4e9060200160405180910390a3505050611b166001600d55565b6122816123c8565b8080156122ab57506010546001600160a01b031615806122ab5750601054600160a81b900460ff16155b156122c95760405163bef561f560e01b815260040160405180910390fd5b60108054911515600160a01b0260ff60a01b19909216919091179055565b5f6001600160e01b0319821663152a902d60e11b1480610b455750610b45826128ff565b6123148161260d565b611b085760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610c72565b5f81815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061238f826113e2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c546001600160a01b0316331461162c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c72565b5f5f61242d836113e2565b9050806001600160a01b0316846001600160a01b0316148061247357506001600160a01b038082165f9081526005602090815260408083209388168352929052205460ff165b8061155f5750836001600160a01b031661248c84610bda565b6001600160a01b031614949350505050565b826001600160a01b03166124b1826113e2565b6001600160a01b0316146124d75760405162461bcd60e51b8152600401610c72906138cd565b6001600160a01b0382166125395760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c72565b6125468383836001612923565b826001600160a01b0316612559826113e2565b6001600160a01b03161461257f5760405162461bcd60e51b8152600401610c72906138cd565b5f81815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080545f1901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5f908152600260205260409020546001600160a01b0316151590565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6002600d54036126cc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c72565b6002600d55565b611b16828260405180602001604052805f815250612a37565b816001600160a01b0316836001600160a01b03160361274d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c72565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6127c484848461249e565b6127d084848484612a69565b611b4c5760405162461bcd60e51b8152600401610c7290613912565b60605f6127f883612b66565b9050600a83101561282b57806040516020016128149190613964565b604051602081830303815290604052915050919050565b60648310156128455780604051602001612814919061397b565b6103e8831015610b4557806040516020016128149190613991565b5f61286a826113e2565b9050612879815f846001612923565b612882826113e2565b5f83815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080545f190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b5f6001600160e01b0319821663780e9d6360e01b1480610b455750610b4582612bf5565b6001600160a01b03831615612a2b575f5b818110156129825761294961080682856137db565b6001600160a01b0316846001600160a01b03160361297a5760405163b79e3f3f60e01b815260040160405180910390fd5b600101612934565b506001600160a01b0383163b15612a2b57826001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401606060405180830381865afa9250505080156129ed575060408051601f3d908101601f191682019092526129ea918101906139a6565b60015b15612a2b574683148015612a0957506001600160a01b03821630145b15612a275760405163b79e3f3f60e01b815260040160405180910390fd5b5050505b611b4c84848484612c44565b612a418383612d77565b612a4d5f848484612a69565b610d135760405162461bcd60e51b8152600401610c7290613912565b5f6001600160a01b0384163b15612b5b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612aac9033908990889088906004016139de565b6020604051808303815f875af1925050508015612ae6575060408051601f3d908101601f19168201909252612ae391810190613a1a565b60015b612b41573d808015612b13576040519150601f19603f3d011682016040523d82523d5f602084013e612b18565b606091505b5080515f03612b395760405162461bcd60e51b8152600401610c7290613912565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061155f565b506001949350505050565b60605f612b7283612ef0565b60010190505f816001600160401b03811115612b9057612b9061337a565b6040519080825280601f01601f191660200182016040528015612bba576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612bc457509392505050565b5f6001600160e01b031982166380ac58cd60e01b1480612c2557506001600160e01b03198216635b5e139f60e01b145b80610b4557506301ffc9a760e01b6001600160e01b0319831614610b45565b6001811115612cb35760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610c72565b816001600160a01b038516612d0e57612d0981600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612d31565b836001600160a01b0316856001600160a01b031614612d3157612d318582612fc7565b6001600160a01b038416612d4d57612d4881613060565b612d70565b846001600160a01b0316846001600160a01b031614612d7057612d708482613107565b5050505050565b6001600160a01b038216612dcd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c72565b612dd68161260d565b15612e235760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c72565b612e305f83836001612923565b612e398161260d565b15612e865760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c72565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612f2e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612f5a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612f7857662386f26fc10000830492506010015b6305f5e1008310612f90576305f5e100830492506008015b6127108310612fa457612710830492506004015b60648310612fb6576064830492506002015b600a8310610b455760010192915050565b5f6001612fd384611597565b612fdd91906137ee565b5f8381526007602052604090205490915080821461302e576001600160a01b0384165f9081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b505f9182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008545f90613071906001906137ee565b5f8381526009602052604081205460088054939450909284908110613098576130986135e9565b905f5260205f200154905080600883815481106130b7576130b76135e9565b5f9182526020808320909101929092558281526009909152604080822084905585825281205560088054806130ee576130ee613a35565b600190038181905f5260205f20015f9055905550505050565b5f61311183611597565b6001600160a01b039093165f908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114611b08575f5ffd5b5f6020828403121561316e575f5ffd5b813561317981613149565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6131796020830184613180565b5f602082840312156131d0575f5ffd5b5035919050565b6001600160a01b0381168114611b08575f5ffd5b5f5f604083850312156131fc575f5ffd5b8235613207816131d7565b946020939093013593505050565b5f60208284031215613225575f5ffd5b8135613179816131d7565b5f5f5f60608486031215613242575f5ffd5b833561324d816131d7565b9250602084013561325d816131d7565b929592945050506040919091013590565b5f5f6040838503121561327f575f5ffd5b50508035926020909101359150565b5f5f6020838503121561329f575f5ffd5b82356001600160401b038111156132b4575f5ffd5b8301601f810185136132c4575f5ffd5b80356001600160401b038111156132d9575f5ffd5b8560208284010111156132ea575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561330b575f5ffd5b8235915060208301356001600160401b0381168114613328575f5ffd5b809150509250929050565b80358015158114613342575f5ffd5b919050565b5f5f60408385031215613358575f5ffd5b8235613363816131d7565b915061337160208401613333565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f608085870312156133a1575f5ffd5b84356133ac816131d7565b935060208501356133bc816131d7565b92506040850135915060608501356001600160401b038111156133dd575f5ffd5b8501601f810187136133ed575f5ffd5b80356001600160401b038111156134065761340661337a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156134345761343461337a565b60405281815282820160200189101561344b575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f5f6040838503121561347d575f5ffd5b8235613488816131d7565b91506020830135613328816131d7565b5f602082840312156134a8575f5ffd5b61317982613333565b600181811c908216806134c557607f821691505b6020821081036134e357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261351f5761351f6134e9565b500490565b63ffffffff8181168382160190811115610b4557610b456134fd565b63ffffffff818116838216029081169081811461355f5761355f6134fd565b5092915050565b6001600160401b038181168382160190811115610b4557610b456134fd565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b8082028115828204841417610b4557610b456134fd565b634e487b7160e01b5f52603260045260245ffd5b601f821115610d135782821115610d1357805f5260205f20601f840160051c602085101561362857505f5b90810190601f840160051c035f5b8181101561364b575f83820155600101613636565b505050505050565b6001600160401b0383111561366a5761366a61337a565b61367e8361367883546134b1565b836135fd565b5f601f8411600181146136af575f85156136985750838201355b5f19600387901b1c1916600186901b178355612d70565b5f83815260208120601f198716915b828110156136de57868501358255602094850194600190920191016136be565b50868210156136fa575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b602081525f5f835461371d816134b1565b806020860152600182165f811461373b576001811461375757613788565b60ff1983166040870152604082151560051b8701019350613788565b865f5260205f205f5b8381101561377f57815488820160400152600190910190602001613760565b87016040019450505b509195945050505050565b5f6001600160401b038316806137ab576137ab6134e9565b806001600160401b0384160491505092915050565b5f602082840312156137d0575f5ffd5b8151613179816131d7565b80820180821115610b4557610b456134fd565b81810381811115610b4557610b456134fd565b5f60018201613812576138126134fd565b5060010190565b5f82613827576138276134e9565b500690565b5f81518060208401855e5f93019283525090919050565b5f5f8454613850816134b1565b600182168015613867576001811461387c576138a9565b60ff19831686528115158202860193506138a9565b875f5260205f205f5b838110156138a157815488820152600190910190602001613885565b505081860193505b5050506138b6818561382c565b64173539b7b760d91b815260050195945050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6203030360ec1b81525f613179600383018461382c565b61030360f41b81525f613179600283018461382c565b600360fc1b81525f613179600183018461382c565b5f5f5f606084860312156139b8575f5ffd5b835160208501519093506139cb816131d7565b6040949094015192959394509192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90613a1090830184613180565b9695505050505050565b5f60208284031215613a2a575f5ffd5b815161317981613149565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220a36607403cd5871a50737f26a9d6f1ac1175813b0592887a6bad0f89e0c6160d64736f6c63430008240033
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x9973fc…fa5b6b | 2 days agoSat, 15 Aug 2026 21:05:28 UTC | ApprovalForAll | [0] 0x000000000000…e4d023f9 [1] 0x000000000000…0000c300 data: 0x000000000000000000…00000001 |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | 0x58ccb1…170e | [0] 0x000000000000…0876920e [1] 0x000000000000…00000021 data: 0x000000000000000000…32eb385e |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…0876920e [2] 0x000000000000…00000021 |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | 0x58ccb1…170e | [0] 0x000000000000…0876920e [1] 0x000000000000…00000020 data: 0x000000000000000000…403f81ee |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…0876920e [2] 0x000000000000…00000020 |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | 0x58ccb1…170e | [0] 0x000000000000…0876920e [1] 0x000000000000…0000001f data: 0x000000000000000000…e7d68049 |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…0876920e [2] 0x000000000000…0000001f |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | 0x58ccb1…170e | [0] 0x000000000000…0876920e [1] 0x000000000000…0000001e data: 0x000000000000000000…5cf7e7b9 |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…0876920e [2] 0x000000000000…0000001e |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | 0x58ccb1…170e | [0] 0x000000000000…0876920e [1] 0x000000000000…0000001d data: 0x000000000000000000…71998810 |
| 0x1b6cdd…671838 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…0876920e [2] 0x000000000000…0000001d |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | 0x58ccb1…170e | [0] 0x000000000000…7c72cc87 [1] 0x000000000000…0000001c data: 0x000000000000000000…bc86c140 |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…7c72cc87 [2] 0x000000000000…0000001c |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | 0x58ccb1…170e | [0] 0x000000000000…7c72cc87 [1] 0x000000000000…0000001b data: 0x000000000000000000…6b1bbff2 |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…7c72cc87 [2] 0x000000000000…0000001b |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | 0x58ccb1…170e | [0] 0x000000000000…7c72cc87 [1] 0x000000000000…0000001a data: 0x000000000000000000…b086b73f |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…7c72cc87 [2] 0x000000000000…0000001a |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | 0x58ccb1…170e | [0] 0x000000000000…7c72cc87 [1] 0x000000000000…00000019 data: 0x000000000000000000…aaa0dc44 |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…7c72cc87 [2] 0x000000000000…00000019 |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | 0x58ccb1…170e | [0] 0x000000000000…7c72cc87 [1] 0x000000000000…00000018 data: 0x000000000000000000…e36d2dd9 |
| 0xb3058b…4368d5 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…7c72cc87 [2] 0x000000000000…00000018 |
| 0x4344b1…bc2ff4 | 2 days agoSat, 15 Aug 2026 10:58:33 UTC | 0x58ccb1…170e | [0] 0x000000000000…1c4f0527 [1] 0x000000000000…00000017 data: 0x000000000000000000…2787aa99 |
| 0x4344b1…bc2ff4 | 2 days agoSat, 15 Aug 2026 10:58:33 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…1c4f0527 [2] 0x000000000000…00000017 |
| 0xb21331…988861 | 2 days agoSat, 15 Aug 2026 10:54:36 UTC | 0x58ccb1…170e | [0] 0x000000000000…e4d023f9 [1] 0x000000000000…00000016 data: 0x000000000000000000…76c43521 |
| 0xb21331…988861 | 2 days agoSat, 15 Aug 2026 10:54:36 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…e4d023f9 [2] 0x000000000000…00000016 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x9973fc…fa5b6b | Set Approval For All | 37,424,075 | 2 days agoSat, 15 Aug 2026 21:05:28 UTC | 0x0007…23f9 | IN | STOCKIO | $0.000 ETH | 0.00000132 | |
| 0x1b6cdd…671838 | mint | 37,061,439 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | 0x939d…920e | IN | STOCKIO | $23.670.0125 ETH | 0.00004080 | |
| 0xb3058b…4368d5 | mint | 37,061,088 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | 0xa732…cc87 | IN | STOCKIO | $23.670.0125 ETH | 0.00004078 | |
| 0x4344b1…bc2ff4 | mint | 37,060,840 | 2 days agoSat, 15 Aug 2026 10:58:33 UTC | 0x1e61…0527 | IN | STOCKIO | $4.730.0025 ETH | 0.00001052 | |
| 0xb21331…988861 | mint | 37,058,477 | 2 days agoSat, 15 Aug 2026 10:54:36 UTC | 0x0007…23f9 | IN | STOCKIO | $18.940.01 ETH | 0.00003279 | |
| 0xd1d0a5…24817f | mint | 37,058,072 | 2 days agoSat, 15 Aug 2026 10:53:55 UTC | 0x0007…23f9 | IN | STOCKIO | $4.730.0025 ETH | 0.00001060 | |
| 0x18208a…105195 | mint | 37,057,948 | 2 days agoSat, 15 Aug 2026 10:53:43 UTC | 0xe418…8aee | IN | STOCKIO | $4.730.0025 ETH | 0.00001054 | |
| 0x662bf5…f926d9 | mint | 37,057,212 | 2 days agoSat, 15 Aug 2026 10:52:29 UTC | 0x6ea4…6f55 | IN | STOCKIO | $23.670.0125 ETH | 0.00004161 | |
| 0x8ac703…a12a54 | mint | 37,057,022 | 2 days agoSat, 15 Aug 2026 10:52:10 UTC | 0x5a8e…3874 | IN | STOCKIO | $4.730.0025 ETH | 0.00001082 | |
| 0xac030a…9fac2f | mint | 37,055,892 | 2 days agoSat, 15 Aug 2026 10:50:17 UTC | 0x891d…d416 | IN | STOCKIO | $23.670.0125 ETH | 0.00004164 | |
| 0x89c098…6b7d42 | mint | 37,055,263 | 2 days agoSat, 15 Aug 2026 10:49:13 UTC | 0x8367…f82d | IN | STOCKIO | $23.670.0125 ETH | 0.00004269 | |
| 0x361a89…4d821f | setMintOpen | 37,045,614 | 2 days agoSat, 15 Aug 2026 10:33:04 UTC | 0x4816…2b00 | IN | STOCKIO | $0.000 ETH | 0.00000095 | |
| 0xd1b062…9637f1 | transferOwnership | 37,018,848 | 2 days agoSat, 15 Aug 2026 09:48:18 UTC | 0x4816…2b00 | IN | STOCKIO | $0.000 ETH | 0.00000084 | |
| 0x850ed8…55a285 | freezeMetadata | 37,018,695 | 2 days agoSat, 15 Aug 2026 09:48:03 UTC | 0x4816…2b00 | IN | STOCKIO | $0.000 ETH | 0.00000214 | |
| 0x3bc57a…daca46 | setContractURI | 37,018,653 | 2 days agoSat, 15 Aug 2026 09:47:59 UTC | 0x4816…2b00 | IN | STOCKIO | $0.000 ETH | 0.00000389 | |
| 0x381891…17c0d2 | setBaseURI | 37,018,596 | 2 days agoSat, 15 Aug 2026 09:47:53 UTC | 0x4816…2b00 | IN | STOCKIO | $0.000 ETH | 0.00000382 | |
| 0x9f5c4e…830f97 | setGameEngine | 37,018,545 | 2 days agoSat, 15 Aug 2026 09:47:48 UTC | 0x4816…2b00 | IN | STOCKIO | $0.000 ETH | 0.00000162 | |
| 0xf74a03…3899b5 | setFeeDesk | 37,018,484 | 2 days agoSat, 15 Aug 2026 09:47:42 UTC | 0x4816…2b00 | IN | STOCKIO | $0.000 ETH | 0.00000157 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 37,061,439 | 2 days agoSat, 15 Aug 2026 10:59:33 UTC | 0x1b6cdd…671838 | CALL | mint | 0x7db5…afac | OUT | 0x8148…02bc | 0.0125 ETH |
| 37,061,088 | 2 days agoSat, 15 Aug 2026 10:58:58 UTC | 0xb3058b…4368d5 | CALL | mint | 0x7db5…afac | OUT | 0x8148…02bc | 0.0125 ETH |
| 37,060,840 | 2 days agoSat, 15 Aug 2026 10:58:33 UTC | 0x4344b1…bc2ff4 | CALL | mint | 0x7db5…afac | OUT | 0x8148…02bc | 0.0025 ETH |
| 37,058,477 | 2 days agoSat, 15 Aug 2026 10:54:36 UTC | 0xb21331…988861 | CALL | mint | 0x7db5…afac | OUT | 0x8148…02bc | 0.01 ETH |
| 37,058,072 | 2 days agoSat, 15 Aug 2026 10:53:55 UTC | 0xd1d0a5…24817f | CALL | mint | 0x7db5…afac | OUT | 0x8148…02bc | 0.0025 ETH |
| 37,057,948 | 2 days agoSat, 15 Aug 2026 10:53:43 UTC | 0x18208a…105195 | CALL | mint | 0x7db5…afac | OUT | 0x8148…02bc | 0.0025 ETH |
| 37,057,212 | 2 days agoSat, 15 Aug 2026 10:52:29 UTC | 0x662bf5…f926d9 | CALL | mint | 0x7db5…afac | OUT | 0x8148…02bc | 0.0125 ETH |
| 37,055,263 | 2 days agoSat, 15 Aug 2026 10:49:13 UTC | 0x89c098…6b7d42 | CALL | mint | 0x7db5…afac | OUT | 0x8148…02bc | 0.0125 ETH |