Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
HuntingMainland
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 512 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; import {IFnG, IFBX, ICastle} from "./interfaces/InterfacesMigrated.sol"; import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; contract HuntingMainland is Initializable, UUPSUpgradeable, OwnableUpgradeable, ReentrancyGuardUpgradeable, PausableUpgradeable { using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; /*/////////////////////////////////////////////////////////////// DATA STRUCTURES //////////////////////////////////////////////////////////////*/ struct StakeFreak { uint256 tokenId; uint256 lastClaimTime; address owner; uint256 species; uint256 ffIndex; } struct StakeCelestial { uint256 tokenId; address owner; uint256 value; } struct Epoch { uint256 favoredFreak; uint256 epochStartTime; } struct PoolConfig { uint256 guildSize; uint256 rate; uint256 minToExit; } /*/////////////////////////////////////////////////////////////// Global STATE //////////////////////////////////////////////////////////////*/ // reference to the FnG NFT contract IFnG public fngNFT; // reference to the $FBX contract for minting $FBX earnings IFBX public fbx; // maps tokenId to stake observatory mapping(uint256 => StakeCelestial) private observatory; // maps pool id to mapping of address to deposits mapping(uint256 => mapping(address => EnumerableSetUpgradeable.UintSet)) private _deposits; // maps pool id to mapping of token id to staked freak struct mapping(uint256 => mapping(uint256 => StakeFreak)) private stakingPools; // maps pool id to pool config mapping(uint256 => PoolConfig) public _poolConfig; // maps pool id to amount of freaks staked mapping(uint256 => uint256) private freaksStaked; // maps pool id to epoch struct mapping(uint256 => Epoch[]) private favors; // any rewards distributed when no celestials are staked uint256 private unaccountedRewards; // amount of $FBX earned so far uint256 public totalFBXEarned; // timestamp of last epcoh change uint256 private lastEpoch; // number of celestials staked at a give time uint256 public cCounter; // unclaimed FBX pool for hunting observatory uint256 public fbxPerCelestial; // emergency rescue to allow unstaking without any checks but without $FBX bool public rescueEnabled; // reference to the CelestialCastle contract ICastle public castle; // boolean to allow the owner to disable characters from being staked in hunting grounds bool public huntingDisabled; // endTime to set so that no more fbx is accrued uint256 public endTime; /*/////////////////////////////////////////////////////////////// INITIALIZER //////////////////////////////////////////////////////////////*/ function initialize(address _fng, address _fbx) public changeFFEpoch initializer { __UUPSUpgradeable_init(); __Ownable_init(); __ReentrancyGuard_init(); __Pausable_init(); fngNFT = IFnG(_fng); fbx = IFBX(_fbx); _pause(); cCounter = 0; _poolConfig[0] = PoolConfig(1, 200 ether, 200 ether); _poolConfig[1] = PoolConfig(3, 300 ether, 1800 ether); _poolConfig[2] = PoolConfig(5, 400 ether, 6000 ether); freaksStaked[0] = 0; freaksStaked[1] = 0; freaksStaked[2] = 0; rescueEnabled = false; unaccountedRewards = 0; } function _authorizeUpgrade(address) internal onlyOwner override {} /// @custom:oz-upgrades-unsafe-allow constructor constructor() initializer {} /*/////////////////////////////////////////////////////////////// MODIFIERS //////////////////////////////////////////////////////////////*/ modifier changeFFEpoch() { if (block.timestamp - lastEpoch >= 72 hours) { uint256 rand = _rand(msg.sender); for (uint256 i = 0; i < 3; i++) { uint256 favoredFreak = (rand % 3) + 1; Epoch memory epoch = Epoch(favoredFreak, block.timestamp); favors[i].push(epoch); rand = uint256(keccak256(abi.encodePacked(msg.sender, rand))); } lastEpoch = block.timestamp; } _; } /*/////////////////////////////////////////////////////////////// PUBLIC FUNCTIONS //////////////////////////////////////////////////////////////*/ // returns config for specific pool function getPoolConfig(uint256 pool) external view returns (PoolConfig memory) { require(pool < 3, "pool not found"); return _poolConfig[pool]; } // returns total freaks staked in specific pool function getStakedFreaks(uint256 pool) external view returns (uint256) { require(pool < 3, "pool not found"); return freaksStaked[pool]; } // returns deposited tokens of an address for each hunting ground and observatory function depositsOf(address account) external view returns ( uint256[] memory, uint256[] memory, uint256[] memory, uint256[] memory ) { return ( _deposits[0][account].values(), _deposits[1][account].values(), _deposits[2][account].values(), _deposits[3][account].values() ); } // returns rewards for freaks currently staked in specific pool // pool = 0: enclave, pool = 1: summit, pool = 2: ano function calculateFBXRewards(uint256[] memory tokenIds, uint256 pool) external view returns (uint256) { require(pool < 3, "pool not found"); uint256 rewards = 0; for (uint256 i = 0; i < tokenIds.length; i++) { rewards += _calculateSingleFreakRewards(tokenIds[i], pool, _poolConfig[pool].rate); } return rewards; } // returns rewards for celestials currently staked in hunting observatory function calculateCelestialsRewards(uint256[] calldata tokenIds) external view returns (uint256 rewards) { rewards = 0; for (uint256 i; i < tokenIds.length; i++) { rewards += _calculateCelestialRewards(tokenIds[i]); } return rewards; } // returns current favored freak for specific pool // pool = 0: enclave, pool = 1: summit, pool = 2: ano function getFavoredFreak(uint256 pool) external view returns (uint256) { require(pool < 3, "pool not found"); return favors[pool][favors[pool].length - 1].favoredFreak; } // returns list of all favored freaks of a specific pool since genesis function getFavoredFreaks(uint256 pool) external view returns (Epoch[] memory) { require(pool < 3, "pool not found"); return favors[pool]; } // emergency rescue function to transfer tokens from contract to owner based on specific pool function rescue(uint256[] calldata tokenIds, uint256 pool) external nonReentrant { require(rescueEnabled, "RESCUE DISABLED"); require(pool <= 3, "Pool doesn't exist"); if (pool == 3) { //observatory for (uint256 i = 0; i < tokenIds.length; i++) { require(observatory[tokenIds[i]].owner == msg.sender, "You don't own this token ser"); delete observatory[tokenIds[i]]; _deposits[pool][msg.sender].remove(tokenIds[i]); cCounter -= 1; fngNFT.transferFrom(address(this), msg.sender, tokenIds[i]); } } else { uint256 newTotal = 0; for (uint256 l = 0; l < tokenIds.length; l++) { require(stakingPools[pool][tokenIds[l]].owner == msg.sender, "You don't own this token ser"); delete stakingPools[pool][tokenIds[l]]; _deposits[pool][msg.sender].remove(tokenIds[l]); newTotal += 1; fngNFT.transferFrom(address(this), msg.sender, tokenIds[l]); } freaksStaked[pool] = freaksStaked[pool] - newTotal; } } /*/////////////////////////////////////////////////////////////// STAKING FUNCTIONS //////////////////////////////////////////////////////////////*/ function observe(uint256[] calldata tokenIds) external changeFFEpoch nonReentrant whenNotPaused { for (uint256 i = 0; i < tokenIds.length; i++) { require(fngNFT.ownerOf(tokenIds[i]) == msg.sender, "You don't own this token"); require(!fngNFT.isFreak(tokenIds[i]), "CELESTIALS ONLY!!! You are not worthy FREAK!"); observatory[tokenIds[i]] = StakeCelestial({tokenId: tokenIds[i], owner: msg.sender, value: fbxPerCelestial}); _deposits[3][msg.sender].add(tokenIds[i]); fngNFT.transferFrom(msg.sender, address(this), tokenIds[i]); cCounter += 1; } } function hunt(uint256[] calldata tokenIds, uint256 pool) external changeFFEpoch nonReentrant whenNotPaused { require(pool <= 2, "pool doesn't exist ser"); require(tokenIds.length % _poolConfig[pool].guildSize == 0, "incorrect amount of freaks"); require(!huntingDisabled, "hunting is disabled"); uint256 newTotal = 0; for (uint256 i = 0; i < tokenIds.length; i++) { require(fngNFT.ownerOf(tokenIds[i]) == msg.sender, "You don't own this token"); require(fngNFT.isFreak(tokenIds[i]), "Can't get freaky without any freaks ser"); stakingPools[pool][tokenIds[i]] = StakeFreak({ tokenId: tokenIds[i], lastClaimTime: uint256(block.timestamp), owner: msg.sender, species: fngNFT.getSpecies(tokenIds[i]), ffIndex: favors[pool].length - 1 }); _deposits[pool][msg.sender].add(tokenIds[i]); newTotal += 1; fngNFT.transferFrom(msg.sender, address(this), tokenIds[i]); } freaksStaked[pool] = freaksStaked[pool] + newTotal; } /*/////////////////////////////////////////////////////////////// CLAIM/UNSTAKE FUNCTIONS //////////////////////////////////////////////////////////////*/ // unstake or claim from multiple freaks in a specific pool function claimUnstake( uint256[] calldata tokenIds, uint256 pool, bool collectTax ) external changeFFEpoch nonReentrant { require(pool <= 2, "pool doesn't exist ser"); require(tokenIds.length != 0, "can't claim no tokens"); uint256 rewards = 0; // uint256 rewardsPerGroup = 0; require(tokenIds.length % _poolConfig[pool].guildSize == 0); if (collectTax == true) { rewards = _calculateManyFreakRewards(tokenIds, pool, false); // rewardsPerGroup = rewards / (tokenIds.length / _poolConfig[pool].guildSize); // require(rewardsPerGroup >= _poolConfig[pool].minToExit, "Not enough $FBX earned per group"); _claimWithTax(rewards, pool, tokenIds); } else { rewards = _calculateManyFreakRewards(tokenIds, pool, true); // rewardsPerGroup = rewards / (tokenIds.length / _poolConfig[pool].guildSize); _claimEvadeTax(rewards, pool, tokenIds); } } function unobserve(uint256[] calldata tokenIds) external changeFFEpoch nonReentrant { uint256 newCounter = 0; uint256 rewards = 0; for (uint256 i = 0; i < tokenIds.length; i++) { require(observatory[tokenIds[i]].owner == msg.sender, "You don't own this token ser"); if (fbxPerCelestial != 0) { rewards += fbxPerCelestial - observatory[tokenIds[i]].value; } else { rewards += 0; } delete observatory[tokenIds[i]]; _deposits[3][msg.sender].remove(tokenIds[i]); fngNFT.transferFrom(address(this), msg.sender, tokenIds[i]); newCounter += 1; } fbx.mint(msg.sender, rewards); totalFBXEarned += rewards; cCounter = cCounter - newCounter; } function unobserveAndTravel(uint256[] calldata tokenIds) external changeFFEpoch nonReentrant{ uint256 newCounter = 0; uint256 rewards = 0; for (uint256 i = 0; i < tokenIds.length; i++) { require(observatory[tokenIds[i]].owner == msg.sender, "You don't own this token ser"); if (fbxPerCelestial != 0) { rewards += fbxPerCelestial - observatory[tokenIds[i]].value; } else { rewards += 0; } delete observatory[tokenIds[i]]; _deposits[3][msg.sender].remove(tokenIds[i]); // fngNFT.transferFrom(address(this), msg.sender, tokenIds[i]); newCounter += 1; } fbx.mint(address(this), rewards); uint256[] memory freakIds; castle.travelFromHunting(freakIds, tokenIds, rewards, msg.sender); totalFBXEarned += rewards; cCounter = cCounter - newCounter; } function unstakeAndTravel(uint256[] calldata tokenIds, uint256 pool) external changeFFEpoch nonReentrant { require(pool <= 2, "pool doesn't exist ser"); require(tokenIds.length != 0, "can't claim no tokens"); uint256 rewards = 0; uint256 rewardsPerGroup = 0; require(tokenIds.length % _poolConfig[pool].guildSize == 0); rewards = _calculateManyFreakRewards(tokenIds, pool, false); rewardsPerGroup = rewards / (tokenIds.length / _poolConfig[pool].guildSize); _claimForTravel(rewards, pool, tokenIds); } /*/////////////////////////////////////////////////////////////// HELPER FUNCTIONS //////////////////////////////////////////////////////////////*/ function _calculateManyFreakRewards(uint256[] memory tokenIds, uint256 pool, bool unstake) internal returns (uint256 owed) { uint256 rewards = 0; uint256 newTotal = 0; for (uint256 i = 0; i < tokenIds.length; i++) { require(stakingPools[pool][tokenIds[i]].owner == msg.sender, "You don't own this token ser"); rewards += _calculateSingleFreakRewards(tokenIds[i], pool, _poolConfig[pool].rate); newTotal += 1; } if (unstake == true) { freaksStaked[pool] = freaksStaked[pool] - newTotal; } return rewards; } function _calculateCelestialRewards(uint256 tokenId) internal view returns (uint256 reward) { if (fbxPerCelestial != 0) { reward = fbxPerCelestial - observatory[tokenId].value; } if (fbxPerCelestial == 0) { reward = 0; } return reward; } function _calculateSingleFreakRewards( uint256 tokenId, uint256 pool, uint256 rate ) internal view returns (uint256 owed) { uint256 timestamp = stakingPools[pool][tokenId].lastClaimTime; if (timestamp == 0) { return 0; } uint256 species = stakingPools[pool][tokenId].species; uint256 end; if(endTime == 0){ end = block.timestamp; }else{ end = Math.min(block.timestamp, endTime); } uint256 duration = 0; if(timestamp < end){ duration = end - timestamp; } uint256 favoredDuration = 0; for (uint256 j = stakingPools[pool][tokenId].ffIndex; j < favors[pool].length; j++) { uint256 startTime; if (j == stakingPools[pool][tokenId].ffIndex) { startTime = stakingPools[pool][tokenId].lastClaimTime; } else { startTime = favors[pool][j].epochStartTime; } if (favors[pool][j].favoredFreak == species && favors[pool][j].epochStartTime < end) { uint256 epochEndTime; if (favors[pool].length == j + 1 || favors[pool][j + 1].epochStartTime >= end) { epochEndTime = end; } else { epochEndTime = favors[pool][j + 1].epochStartTime; } if(startTime < epochEndTime){ favoredDuration += epochEndTime - startTime; } } } uint256 ffOwed = ((favoredDuration * (rate + 20 ether)) / 1 days); uint256 baseOwed = 0; if (duration - favoredDuration != 0) { baseOwed = (((duration - favoredDuration) * rate) / 1 days); } owed = ffOwed + baseOwed; return owed; } function _claimWithTax( uint256 rewards, uint256 pool, uint256[] memory tokenIds ) internal { uint256 celestialRewards; celestialRewards = rewards / 5; if (cCounter == 0) { unaccountedRewards += (celestialRewards); rewards = rewards - celestialRewards; fbx.mint(msg.sender, rewards); totalFBXEarned += rewards; } else { fbxPerCelestial += (unaccountedRewards + celestialRewards) / cCounter; rewards = rewards - celestialRewards; unaccountedRewards = 0; fbx.mint(msg.sender, rewards); totalFBXEarned += rewards; } for (uint256 i; i < tokenIds.length; i++) { stakingPools[pool][tokenIds[i]] = StakeFreak({ tokenId: tokenIds[i], lastClaimTime: uint256(block.timestamp), owner: msg.sender, species: fngNFT.getSpecies(tokenIds[i]), ffIndex: favors[pool].length - 1 }); } } function _claimEvadeTax( uint256 rewards, uint256 pool, uint256[] memory tokenIds ) internal { uint256 rNum = _rand(msg.sender) % 100; if (rNum < 33) { if (cCounter == 0) { unaccountedRewards += rewards; } else { fbxPerCelestial += (unaccountedRewards + rewards) / cCounter; unaccountedRewards = 0; } } else { fbx.mint(msg.sender, rewards); totalFBXEarned += rewards; } for (uint256 j; j < tokenIds.length; j++) { _deposits[pool][msg.sender].remove(tokenIds[j]); fngNFT.transferFrom(address(this), msg.sender, tokenIds[j]); delete stakingPools[pool][tokenIds[j]]; } } function _claimForTravel( uint256 rewards, uint256 pool, uint256[] memory tokenIds ) internal { uint256 celestialRewards; celestialRewards = rewards / 5; if (cCounter == 0) { unaccountedRewards += (celestialRewards); rewards = rewards - celestialRewards; fbx.mint(address(this), rewards); totalFBXEarned += rewards; } else { fbxPerCelestial += (unaccountedRewards + celestialRewards) / cCounter; rewards = rewards - celestialRewards; unaccountedRewards = 0; fbx.mint(address(this), rewards); totalFBXEarned += rewards; } uint256[] memory celestialIds; castle.travelFromHunting(tokenIds, celestialIds, rewards, msg.sender); for (uint256 i; i < tokenIds.length; i++) { _deposits[pool][msg.sender].remove(tokenIds[i]); delete stakingPools[pool][tokenIds[i]]; } } function _rand(address acc) internal view returns (uint256) { bytes32 _entropySauce = keccak256(abi.encodePacked(acc, block.coinbase)); return uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.basefee, block.timestamp, _entropySauce))); } /*/////////////////////////////////////////////////////////////// ADMIN FUNCTIONS //////////////////////////////////////////////////////////////*/ function setContracts(address _fngNFT, address _fbx, address _castle) external onlyOwner { fngNFT = IFnG(_fngNFT); fbx = IFBX(_fbx); castle = ICastle(_castle); } /** * allows owner to enable "rescue mode" * simplifies accounting, prioritizes tokens out in emergency */ function setRescueEnabled(bool _enabled) external onlyOwner { rescueEnabled = _enabled; } /** * enables owner to pause / unpause contract */ function setPaused(bool _paused) external onlyOwner { if (_paused) _pause(); else _unpause(); } /** * backup favored freak epoch changing function * in case it isn't triggered by claim/unstake function (unlikely) */ function backupEpochSet() public changeFFEpoch onlyOwner {} /** * manually set rates for each pool */ function setRates( uint256 _enclaveRate, uint256 _summitRate, uint256 _anoRate ) external onlyOwner { _poolConfig[0].rate = _enclaveRate; _poolConfig[1].rate = _summitRate; _poolConfig[2].rate = _anoRate; } /** * manually set minimum FBX required to exit each pool */ function setMinExits( uint256 _minExitEnclave, uint256 _minExitSummit, uint256 _minExitAno ) external onlyOwner { _poolConfig[0].minToExit = _minExitEnclave; _poolConfig[1].minToExit = _minExitSummit; _poolConfig[2].minToExit = _minExitAno; } /** disable / enable new character from being allowed to be staked in the hunting grounds */ function setHuntingDisabled(bool newHuntingDisabled) external onlyOwner{ huntingDisabled = newHuntingDisabled; } /** set endtime when fbx stops accruing */ function setEndTime(uint256 newEndTime) external onlyOwner{ endTime = newEndTime; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = _setInitializedVersion(1); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { bool isTopLevelCall = _setInitializedVersion(version); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(version); } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { _setInitializedVersion(type(uint8).max); } function _setInitializedVersion(uint8 version) private returns (bool) { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level // of initializers, because in other contexts the contract may have been reentered. if (_initializing) { require( version == 1 && !AddressUpgradeable.isContract(address(this)), "Initializable: contract is already initialized" ); return false; } else { require(_initialized < version, "Initializable: contract is already initialized"); _initialized = version; return true; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; import "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate that the this implementation remains valid after an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: Unlicense pragma solidity 0.8.11; import "./Structs.sol"; interface MetadataHandlerLike { function getCelestialTokenURI(uint256 id, CelestialV2 memory character) external view returns (string memory); function getFreakTokenURI(uint256 id, Freak memory character) external view returns (string memory); } interface InventoryCelestialsLike { function getAttributes(CelestialV2 memory character, uint256 id) external pure returns (bytes memory); function getImage(uint256 id, CelestialV2 memory character) external view returns (bytes memory); } interface InventoryFreaksLike { function getAttributes(Freak memory character, uint256 id) external view returns (bytes memory); function getImage(Freak memory character) external view returns (bytes memory); } interface IFnG { function transferFrom( address from, address to, uint256 id ) external; function ownerOf(uint256 id) external returns (address owner); function isFreak(uint256 tokenId) external view returns (bool); function getSpecies(uint256 tokenId) external view returns (uint8); function getFreakAttributes(uint256 tokenId) external view returns (Freak memory); function setFreakAttributes(uint256 tokenId, Freak memory attributes) external; function getCelestialAttributes(uint256 tokenId) external view returns (Celestial memory); function setCelestialAttributes(uint256 tokenId, Celestial memory attributes) external; function burn(uint256 tokenId) external; function transferOwnership(address newOwner) external; } interface IFnGMig { function transferFrom( address from, address to, uint256 id ) external; function ownerOf(uint256 id) external returns (address owner); function isFreak(uint256 tokenId) external view returns (bool); function getSpecies(uint256 tokenId) external view returns (uint8); function getFreakAttributes(uint256 tokenId) external view returns (Freak memory); function updateFreakAttributes(uint256 tokenId, Freak calldata attributes) external; function setFreakAttributes(uint256 tokenId, Freak memory attributes) external; function getCelestialAttributes(uint256 tokenId) external view returns (CelestialV2 memory celestial); function updateCelestialAttributes(uint256 tokenId, CelestialV2 calldata attributes) external; function setCelestialAttributes(uint256 tokenId, CelestialV2 memory attributes) external; function burn(uint256 tokenId) external; function transferOwnership(address newOwner) external; function mintFreak(address to, uint256 tokenId, Freak calldata attributes) external; function mintCelestial(address to, uint256 tokenId, CelestialV2 calldata attributes) external; } interface IFBX { function mint(address to, uint256 amount) external; function burn(address from, uint256 amount) external; function balanceOf(address from) external view returns (uint256 balance); } interface IItems { function mint(address to, uint256 id, uint256 amount) external; function burn(address from, uint256 id, uint256 amount) external; function balanceOf(address from) external view returns (uint256 balance); } interface ICKEY { function ownerOf(uint256 tokenId) external returns (address); } interface IVAULT { function depositsOf(address account) external view returns (uint256[] memory); function _depositedBlocks(address account, uint256 tokenId) external returns (uint256); } interface ERC20Like { function balanceOf(address from) external view returns (uint256 balance); function burn(address from, uint256 amount) external; function mint(address from, uint256 amount) external; function transfer(address to, uint256 amount) external; } interface ERC1155Like { function mint( address to, uint256 id, uint256 amount ) external; function burn( address from, uint256 id, uint256 amount ) external; } interface ERC721Like { function transferFrom( address from, address to, uint256 id ) external; function transfer(address to, uint256 id) external; function ownerOf(uint256 id) external returns (address owner); function mint(address to, uint256 tokenid) external; } interface PortalLike { function sendMessage(bytes calldata) external; } interface IHUNTING { function huntFromMigration( address owner, uint256[] calldata tokenIds, uint256 pool ) external; function observeFromMigration(address owner, uint256[] calldata tokenIds) external; } interface IChainlinkVRF { function isClaimed() external view returns (bool); function randomResult() external returns (uint256); function getRandomNumber() external returns (bytes32); } interface ICastle{ function travelFromHunting( uint256[] calldata freakIds, uint256[] calldata celestialIds, uint256 fbxAmount, address owner ) external; function travelFromMigration( uint256[] calldata freakIds, uint256[] calldata celestialIds, uint256 fbxAmount, address owner ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeaconUpgradeable.sol"; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/StorageSlotUpgradeable.sol"; import "../utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly { r.slot := slot } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; struct Freak { uint8 species; uint8 body; uint8 armor; uint8 mainHand; uint8 offHand; uint8 power; uint8 health; uint8 criticalStrikeMod; } struct Celestial { uint8 healthMod; uint8 powMod; uint8 cPP; uint8 cLevel; } struct CelestialV2 { uint8 healthMod; uint8 powMod; uint8 cPP; uint8 cLevel; uint8 forging; uint8 skill1; uint8 skill2; } struct Layer { string name; string data; } struct LayerInput { string name; string data; uint8 layerIndex; uint8 itemIndex; }
{ "optimizer": { "enabled": true, "runs": 512, "details": { "yul": false } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_poolConfig","outputs":[{"internalType":"uint256","name":"guildSize","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"minToExit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"backupEpochSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"calculateCelestialsRewards","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"calculateFBXRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"castle","outputs":[{"internalType":"contract ICastle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"pool","type":"uint256"},{"internalType":"bool","name":"collectTax","type":"bool"}],"name":"claimUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fbx","outputs":[{"internalType":"contract IFBX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fbxPerCelestial","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fngNFT","outputs":[{"internalType":"contract IFnG","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"getFavoredFreak","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"getFavoredFreaks","outputs":[{"components":[{"internalType":"uint256","name":"favoredFreak","type":"uint256"},{"internalType":"uint256","name":"epochStartTime","type":"uint256"}],"internalType":"struct HuntingMainland.Epoch[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"getPoolConfig","outputs":[{"components":[{"internalType":"uint256","name":"guildSize","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"minToExit","type":"uint256"}],"internalType":"struct HuntingMainland.PoolConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"getStakedFreaks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"hunt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"huntingDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fng","type":"address"},{"internalType":"address","name":"_fbx","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"observe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fngNFT","type":"address"},{"internalType":"address","name":"_fbx","type":"address"},{"internalType":"address","name":"_castle","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newEndTime","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newHuntingDisabled","type":"bool"}],"name":"setHuntingDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minExitEnclave","type":"uint256"},{"internalType":"uint256","name":"_minExitSummit","type":"uint256"},{"internalType":"uint256","name":"_minExitAno","type":"uint256"}],"name":"setMinExits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_enclaveRate","type":"uint256"},{"internalType":"uint256","name":"_summitRate","type":"uint256"},{"internalType":"uint256","name":"_anoRate","type":"uint256"}],"name":"setRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setRescueEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalFBXEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unobserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unobserveAndTravel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"unstakeAndTravel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a0604052306080523480156200001557600080fd5b50600062000024600162000092565b905080156200003d576000805461ff0019166101001790555b80156200008b576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989062000082906001906200016c565b60405180910390a15b50620001cf565b60008054610100900460ff1615620000fb578160ff166001148015620000cb5750620000c9306200013f60201b62002f021760201c565b155b620000f35760405162461bcd60e51b8152600401620000ea906200017c565b60405180910390fd5b506000919050565b60005460ff808416911610620001255760405162461bcd60e51b8152600401620000ea906200017c565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b600060ff82165b92915050565b62000166816200014e565b82525050565b602081016200015582846200015b565b602080825281016200015581602e81527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160208201526d191e481a5b9a5d1a585b1a5e995960921b604082015260600190565b60805161577a6200020760003960008181610b6c01528181610bac01528181611194015281816111d40152611279015261577a6000f3fe60806040526004361061023b5760003560e01c806378f9ff681161012e578063c4088d15116100ab578063d9a158c91161006f578063d9a158c9146106c9578063dea96b71146106e9578063df3b786814610709578063e3a9db1a14610729578063f2fde38b1461075957600080fd5b8063c4088d1514610627578063ccb98ffc14610647578063d004f38b14610667578063d1b670de14610687578063d90b7b12146106b457600080fd5b80639293a9ea116100f25780639293a9ea1461059857806394a6eb0f146105af57806397f1bcbf146105d0578063b3066d49146105e7578063ba4b14f21461060757600080fd5b806378f9ff68146104b957806389e5f8e4146105055780638da5cb5b146105255780638db8d47f1461054b57806391ab5c311461056b57600080fd5b80634f1ef286116101bc5780635c975abb116101805780635c975abb1461042c57806364d8b65514610444578063715018a614610464578063765310081461047957806376e9c7901461049957600080fd5b80634f1ef286146103a157806351dd48b1146103b457806352d1902d146103d5578063538349f3146103ea57806359e5113c1461040a57600080fd5b806339db714f1161020357806339db714f146102e65780633d5b10341461030e5780633f19ac881461032e578063434022c114610361578063485cc9551461038157600080fd5b806311e833aa1461024057806316c38b3c1461026d5780632ff6c8441461028f5780633197cbb6146102af5780633659cfe6146102c6575b600080fd5b34801561024c57600080fd5b506102576101385481565b60405161026491906143ef565b60405180910390f35b34801561027957600080fd5b5061028d610288366004614417565b610779565b005b34801561029b57600080fd5b5061028d6102aa366004614492565b6107c5565b3480156102bb57600080fd5b5061025761013b5481565b3480156102d257600080fd5b5061028d6102e13660046144ff565b610b61565b3480156102f257600080fd5b5061013a546103019060ff1681565b6040516102649190614528565b34801561031a57600080fd5b5061028d610329366004614547565b610c50565b34801561033a57600080fd5b5061013a546103549061010090046001600160a01b031681565b60405161026491906145b6565b34801561036d57600080fd5b5061025761037c3660046146c6565b610cf0565b34801561038d57600080fd5b5061028d61039c36600461471d565b610d82565b61028d6103af3660046147e7565b611189565b3480156103c057600080fd5b5061012e54610354906001600160a01b031681565b3480156103e157600080fd5b5061025761126c565b3480156103f657600080fd5b5061028d610405366004614835565b6112db565b34801561041657600080fd5b5061013a5461030190600160a81b900460ff1681565b34801561043857600080fd5b5060fb5460ff16610301565b34801561045057600080fd5b5061025761045f366004614492565b61155a565b34801561047057600080fd5b5061028d6115ac565b34801561048557600080fd5b5061028d610494366004614417565b6115e2565b3480156104a557600080fd5b506102576104b43660046148a4565b611620565b3480156104c557600080fd5b506104f66104d43660046148a4565b6101326020526000908152604090208054600182015460029092015490919083565b604051610264939291906148c5565b34801561051157600080fd5b5061028d6105203660046148ed565b611688565b34801561053157600080fd5b506097546001600160a01b03166040516102649190614947565b34801561055757600080fd5b5061028d6105663660046148ed565b611893565b34801561057757600080fd5b5061058b6105863660046148a4565b611c8c565b604051610264919061498c565b3480156105a457600080fd5b506102576101365481565b3480156105bb57600080fd5b5061012d54610354906001600160a01b031681565b3480156105dc57600080fd5b506102576101395481565b3480156105f357600080fd5b5061028d61060236600461499a565b611d0a565b34801561061357600080fd5b5061028d6106223660046148ed565b611d93565b34801561063357600080fd5b5061028d610642366004614417565b612304565b34801561065357600080fd5b5061028d6106623660046148a4565b61234d565b34801561067357600080fd5b5061028d610682366004614547565b61237d565b34801561069357600080fd5b506106a76106a23660046148a4565b61241d565b6040516102649190614a61565b3480156106c057600080fd5b5061028d6124ba565b3480156106d557600080fd5b506102576106e43660046148a4565b6125be565b3480156106f557600080fd5b5061028d610704366004614492565b6125f4565b34801561071557600080fd5b5061028d610724366004614492565b612a26565b34801561073557600080fd5b506107496107443660046144ff565b612d91565b6040516102649493929190614ac4565b34801561076557600080fd5b5061028d6107743660046144ff565b612ea9565b6097546001600160a01b031633146107ac5760405162461bcd60e51b81526004016107a390614b50565b60405180910390fd5b80156107bd576107ba612f11565b50565b6107ba612f80565b6203f48061013754426107d89190614b76565b1061089f5760006107e833612fd3565b905060005b6003811015610897576000610803600384614ba3565b61080e906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091610867913391879101614bfd565b6040516020818303038152906040528051906020012060001c93505050808061088f90614c23565b9150506107ed565b505042610137555b600260c95414156108c25760405162461bcd60e51b81526004016107a390614c72565b600260c955600080805b83811015610a52573361012f60008787858181106108ec576108ec614c82565b60209081029290920135835250810191909152604001600020600101546001600160a01b03161461092f5760405162461bcd60e51b81526004016107a390614ccc565b61013954156109875761012f600086868481811061094f5761094f614c82565b90506020020135815260200190815260200160002060020154610139546109769190614b76565b6109809083614bb7565b9150610995565b610992600083614bb7565b91505b61012f60008686848181106109ac576109ac614c82565b6020908102929092013583525081019190915260400160009081208181556001810180546001600160a01b031916905560020155610a328585838181106109f5576109f5614c82565b3360009081527f3122fe5b7d531425375ebfbec0198c35c854cd3c1f71c808c2cc488a3513b22b6020908152604090912093910201359050613039565b50610a3e600184614bb7565b925080610a4a81614c23565b9150506108cc565b5061012e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610a869030908590600401614cdc565b600060405180830381600087803b158015610aa057600080fd5b505af1158015610ab4573d6000803e3d6000fd5b505061013a5460405163f498639960e01b8152606093506101009091046001600160a01b0316915063f498639990610af89084908990899088903390600401614d49565b600060405180830381600087803b158015610b1257600080fd5b505af1158015610b26573d6000803e3d6000fd5b50505050816101366000828254610b3d9190614bb7565b909155505061013854610b51908490614b76565b610138555050600160c955505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610baa5760405162461bcd60e51b81526004016107a390614dd7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c057f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610c2b5760405162461bcd60e51b81526004016107a390614e30565b610c348161304c565b604080516000808252602082019092526107ba91839190613076565b6097546001600160a01b03163314610c7a5760405162461bcd60e51b81526004016107a390614b50565b6101326020527f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df2929092557fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc1940414663555560026000527f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60e55565b600060038210610d125760405162461bcd60e51b81526004016107a390614e74565b6000805b8451811015610d7857610d5a858281518110610d3457610d34614c82565b60200260200101518561013260008881526020019081526020016000206001015461316a565b610d649083614bb7565b915080610d7081614c23565b915050610d16565b5090505b92915050565b6203f4806101375442610d959190614b76565b10610e5c576000610da533612fd3565b905060005b6003811015610e54576000610dc0600384614ba3565b610dcb906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091610e24913391879101614bfd565b6040516020818303038152906040528051906020012060001c935050508080610e4c90614c23565b915050610daa565b505042610137555b6000610e686001613482565b90508015610e80576000805461ff0019166101001790555b610e8861350f565b610e90613536565b610e98613565565b610ea0613594565b61012d80546001600160a01b038086166001600160a01b03199283161790925561012e805492851692909116919091179055610eda612f11565b600061013881905560408051606080820183526001808352680ad78ebc5ac6200000602080850182815285870192835287805261013280835295517f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df055517f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df15590517f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df2558451808401865260038152681043561a8829300000818301908152686194049f30f720000082880190815293885285835290517fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc19404146635355517fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc1940414663545590517fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc1940414663555583519182018452600582526815af1d78b58c40000082820190815269014542ba12a337c000009483019485526002865292815290517f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60c5590517f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60d5590517f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60e5561013390527fa729f2b7e889b2ebf4d780e1fbffc38754bf520be086b132a2961d8dad3e68fe8190557f2268e5b55252839d7cb4baadda5cc1ac7a7ffea49b6689cd90f3df5e995ceb2e8190557f88920c679429b299cfeb539d1fa8eee51764f3c0e450924f49e2e00e7a1af7dd81905561013a805460ff19169055610135558015611184576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061117b90600190614e98565b60405180910390a15b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156111d25760405162461bcd60e51b81526004016107a390614dd7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661122d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112535760405162461bcd60e51b81526004016107a390614e30565b61125c8261304c565b61126882826001613076565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112b65760405162461bcd60e51b81526004016107a390614f00565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b6203f48061013754426112ee9190614b76565b106113b55760006112fe33612fd3565b905060005b60038110156113ad576000611319600384614ba3565b611324906001614bb7565b60408051808201825282815242602080830191825260008781526101348252848120805460018181018355918352918390208551600290930201918255925192019190915591519293509161137d913391879101614bfd565b6040516020818303038152906040528051906020012060001c9350505080806113a590614c23565b915050611303565b505042610137555b600260c95414156113d85760405162461bcd60e51b81526004016107a390614c72565b600260c98190558211156113fe5760405162461bcd60e51b81526004016107a390614f44565b8261141b5760405162461bcd60e51b81526004016107a390614f88565b600082815261013260205260408120546114359085614ba3565b1561143f57600080fd5b600182151514156114cd57611488858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525088935091506135c39050565b90506114c881848787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136e392505050565b61154e565b61150e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250600191506135c39050565b905061154e8184878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1c92505050565b5050600160c955505050565b6000805b828110156115a55761158784848381811061157b5761157b614c82565b90506020020135613c6e565b6115919083614bb7565b91508061159d81614c23565b91505061155e565b5092915050565b6097546001600160a01b031633146115d65760405162461bcd60e51b81526004016107a390614b50565b6115e06000613caf565b565b6097546001600160a01b0316331461160c5760405162461bcd60e51b81526004016107a390614b50565b61013a805460ff1916911515919091179055565b6000600382106116425760405162461bcd60e51b81526004016107a390614e74565b600082815261013460205260409020805461165f90600190614b76565b8154811061166f5761166f614c82565b9060005260206000209060020201600001549050919050565b6203f480610137544261169b9190614b76565b106117625760006116ab33612fd3565b905060005b600381101561175a5760006116c6600384614ba3565b6116d1906001614bb7565b60408051808201825282815242602080830191825260008781526101348252848120805460018181018355918352918390208551600290930201918255925192019190915591519293509161172a913391879101614bfd565b6040516020818303038152906040528051906020012060001c93505050808061175290614c23565b9150506116b0565b505042610137555b600260c95414156117855760405162461bcd60e51b81526004016107a390614c72565b600260c98190558111156117ab5760405162461bcd60e51b81526004016107a390614f44565b816117c85760405162461bcd60e51b81526004016107a390614f88565b6000818152610132602052604081205481906117e49085614ba3565b156117ee57600080fd5b61182c858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525088935091506135c39050565b600084815261013260205260409020549092506118499085614f98565b6118539083614f98565b905061154e8284878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613d0192505050565b600260c95414156118b65760405162461bcd60e51b81526004016107a390614c72565b600260c95561013a5460ff166118de5760405162461bcd60e51b81526004016107a390614fe0565b60038111156118ff5760405162461bcd60e51b81526004016107a390615024565b8060031415611aa45760005b82811015611a9e573361012f600086868581811061192b5761192b614c82565b60209081029290920135835250810191909152604001600020600101546001600160a01b03161461196e5760405162461bcd60e51b81526004016107a390614ccc565b61012f600085858481811061198557611985614c82565b6020908102929092013583525081019190915260400160009081208181556001810180546001600160a01b0319169055600201556119f48484838181106119ce576119ce614c82565b600086815261013060209081526040808320338452825290912093910201359050613039565b5060016101386000828254611a099190614b76565b909155505061012d546001600160a01b03166323b872dd3033878786818110611a3457611a34614c82565b905060200201356040518463ffffffff1660e01b8152600401611a5993929190615034565b600060405180830381600087803b158015611a7357600080fd5b505af1158015611a87573d6000803e3d6000fd5b505050508080611a9690614c23565b91505061190b565b50611c82565b6000805b83811015611c54576000838152610131602052604081203391878785818110611ad357611ad3614c82565b60209081029290920135835250810191909152604001600020600201546001600160a01b031614611b165760405162461bcd60e51b81526004016107a390614ccc565b60008381526101316020526040812090868684818110611b3857611b38614c82565b602090810292909201358352508101919091526040016000908120818155600181018290556002810180546001600160a01b03191690556003810182905560040155611bb5858583818110611b8f57611b8f614c82565b600087815261013060209081526040808320338452825290912093910201359050613039565b50611bc1600183614bb7565b61012d549092506001600160a01b03166323b872dd3033888886818110611bea57611bea614c82565b905060200201356040518463ffffffff1660e01b8152600401611c0f93929190615034565b600060405180830381600087803b158015611c2957600080fd5b505af1158015611c3d573d6000803e3d6000fd5b505050508080611c4c90614c23565b915050611aa8565b5060008281526101336020526040902054611c70908290614b76565b60008381526101336020526040902055505b5050600160c95550565b611cb060405180606001604052806000815260200160008152602001600081525090565b60038210611cd05760405162461bcd60e51b81526004016107a390614e74565b5060009081526101326020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b6097546001600160a01b03163314611d345760405162461bcd60e51b81526004016107a390614b50565b61012d80546001600160a01b039485166001600160a01b03199182161790915561012e8054938516939091169290921790915561013a8054919092166101000274ffffffffffffffffffffffffffffffffffffffff0019909116179055565b6203f4806101375442611da69190614b76565b10611e6d576000611db633612fd3565b905060005b6003811015611e65576000611dd1600384614ba3565b611ddc906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091611e35913391879101614bfd565b6040516020818303038152906040528051906020012060001c935050508080611e5d90614c23565b915050611dbb565b505042610137555b600260c9541415611e905760405162461bcd60e51b81526004016107a390614c72565b600260c95560fb5460ff1615611eb85760405162461bcd60e51b81526004016107a390615083565b6002811115611ed95760405162461bcd60e51b81526004016107a390614f44565b60008181526101326020526040902054611ef39083614ba3565b15611f105760405162461bcd60e51b81526004016107a3906150c7565b61013a54600160a81b900460ff1615611f3b5760405162461bcd60e51b81526004016107a39061510b565b6000805b838110156122e85761012d5433906001600160a01b0316636352211e878785818110611f6d57611f6d614c82565b905060200201356040518263ffffffff1660e01b8152600401611f9091906143ef565b6020604051808303816000875af1158015611faf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd39190615126565b6001600160a01b031614611ff95760405162461bcd60e51b81526004016107a39061517b565b61012d546001600160a01b0316637255e9aa86868481811061201d5761201d614c82565b905060200201356040518263ffffffff1660e01b815260040161204091906143ef565b602060405180830381865afa15801561205d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120819190615196565b61209d5760405162461bcd60e51b81526004016107a3906151fb565b6040518060a001604052808686848181106120ba576120ba614c82565b60209081029290920135835250429082015233604082015261012d546060909101906001600160a01b0316632be6a2a98888868181106120fc576120fc614c82565b905060200201356040518263ffffffff1660e01b815260040161211f91906143ef565b602060405180830381865afa15801561213c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612160919061521f565b60ff1681526000858152610134602090815260409091205491019061218790600190614b76565b9052600084815261013160205260408120908787858181106121ab576121ab614c82565b60209081029290920135835250818101929092526040908101600020835181559183015160018301558201516002820180546001600160a01b0319166001600160a01b039092169190911790556060820151600382015560809091015160049091015561224985858381811061222357612223614c82565b600087815261013060209081526040808320338452825290912093910201359050613fc8565b50612255600183614bb7565b61012d549092506001600160a01b03166323b872dd333088888681811061227e5761227e614c82565b905060200201356040518463ffffffff1660e01b81526004016122a393929190615034565b600060405180830381600087803b1580156122bd57600080fd5b505af11580156122d1573d6000803e3d6000fd5b5050505080806122e090614c23565b915050611f3f565b5060008281526101336020526040902054611c70908290614bb7565b6097546001600160a01b0316331461232e5760405162461bcd60e51b81526004016107a390614b50565b61013a8054911515600160a81b0260ff60a81b19909216919091179055565b6097546001600160a01b031633146123775760405162461bcd60e51b81526004016107a390614b50565b61013b55565b6097546001600160a01b031633146123a75760405162461bcd60e51b81526004016107a390614b50565b6101326020527f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df1929092557fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc1940414663545560026000527f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60d55565b60606003821061243f5760405162461bcd60e51b81526004016107a390614e74565b60008281526101346020908152604080832080548251818502810185019093528083529193909284015b828210156124af57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190612469565b505050509050919050565b6203f48061013754426124cd9190614b76565b106125945760006124dd33612fd3565b905060005b600381101561258c5760006124f8600384614ba3565b612503906001614bb7565b60408051808201825282815242602080830191825260008781526101348252848120805460018181018355918352918390208551600290930201918255925192019190915591519293509161255c913391879101614bfd565b6040516020818303038152906040528051906020012060001c93505050808061258490614c23565b9150506124e2565b505042610137555b6097546001600160a01b031633146115e05760405162461bcd60e51b81526004016107a390614b50565b6000600382106125e05760405162461bcd60e51b81526004016107a390614e74565b506000908152610133602052604090205490565b6203f48061013754426126079190614b76565b106126ce57600061261733612fd3565b905060005b60038110156126c6576000612632600384614ba3565b61263d906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091612696913391879101614bfd565b6040516020818303038152906040528051906020012060001c9350505080806126be90614c23565b91505061261c565b505042610137555b600260c95414156126f15760405162461bcd60e51b81526004016107a390614c72565b600260c95560fb5460ff16156127195760405162461bcd60e51b81526004016107a390615083565b60005b81811015611c825761012d5433906001600160a01b0316636352211e85858581811061274a5761274a614c82565b905060200201356040518263ffffffff1660e01b815260040161276d91906143ef565b6020604051808303816000875af115801561278c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b09190615126565b6001600160a01b0316146127d65760405162461bcd60e51b81526004016107a39061517b565b61012d546001600160a01b0316637255e9aa8484848181106127fa576127fa614c82565b905060200201356040518263ffffffff1660e01b815260040161281d91906143ef565b602060405180830381865afa15801561283a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285e9190615196565b1561287b5760405162461bcd60e51b81526004016107a390615289565b604051806060016040528084848481811061289857612898614c82565b905060200201358152602001336001600160a01b031681526020016101395481525061012f60008585858181106128d1576128d1614c82565b9050602002013581526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015590505061297c83838381811061293f5761293f614c82565b3360009081527f3122fe5b7d531425375ebfbec0198c35c854cd3c1f71c808c2cc488a3513b22b6020908152604090912093910201359050613fc8565b5061012d546001600160a01b03166323b872dd33308686868181106129a3576129a3614c82565b905060200201356040518463ffffffff1660e01b81526004016129c893929190615034565b600060405180830381600087803b1580156129e257600080fd5b505af11580156129f6573d6000803e3d6000fd5b5050505060016101386000828254612a0e9190614bb7565b90915550819050612a1e81614c23565b91505061271c565b6203f4806101375442612a399190614b76565b10612b00576000612a4933612fd3565b905060005b6003811015612af8576000612a64600384614ba3565b612a6f906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091612ac8913391879101614bfd565b6040516020818303038152906040528051906020012060001c935050508080612af090614c23565b915050612a4e565b505042610137555b600260c9541415612b235760405162461bcd60e51b81526004016107a390614c72565b600260c955600080805b83811015612cf5573361012f6000878785818110612b4d57612b4d614c82565b60209081029290920135835250810191909152604001600020600101546001600160a01b031614612b905760405162461bcd60e51b81526004016107a390614ccc565b6101395415612be85761012f6000868684818110612bb057612bb0614c82565b9050602002013581526020019081526020016000206002015461013954612bd79190614b76565b612be19083614bb7565b9150612bf6565b612bf3600083614bb7565b91505b61012f6000868684818110612c0d57612c0d614c82565b6020908102929092013583525081019190915260400160009081208181556001810180546001600160a01b031916905560020155612c568585838181106109f5576109f5614c82565b5061012d546001600160a01b03166323b872dd3033888886818110612c7d57612c7d614c82565b905060200201356040518463ffffffff1660e01b8152600401612ca293929190615034565b600060405180830381600087803b158015612cbc57600080fd5b505af1158015612cd0573d6000803e3d6000fd5b50505050600183612ce19190614bb7565b925080612ced81614c23565b915050612b2d565b5061012e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990612d299033908590600401614cdc565b600060405180830381600087803b158015612d4357600080fd5b505af1158015612d57573d6000803e3d6000fd5b50505050806101366000828254612d6e9190614bb7565b909155505061013854612d82908390614b76565b610138555050600160c9555050565b6001600160a01b03811660009081527f363eca0a79dc8ec297995f86b12cc61391ff0de52f1ba01ca23e9716f742e41360205260409020606090819081908190612dda90613fd4565b6001600160a01b03861660009081527fe2b6217f4c97aa68f5160f7d6659df601bbb6b6328ba78b8ab41ee5c6e7d7a5960205260409020612e1a90613fd4565b6001600160a01b03871660009081527fea19767d888507d04480e03c5531fa09d724e33807f1d26eef5602518076ecd060205260409020612e5a90613fd4565b6001600160a01b03881660009081527f3122fe5b7d531425375ebfbec0198c35c854cd3c1f71c808c2cc488a3513b22b60205260409020612e9a90613fd4565b93509350935093509193509193565b6097546001600160a01b03163314612ed35760405162461bcd60e51b81526004016107a390614b50565b6001600160a01b038116612ef95760405162461bcd60e51b81526004016107a3906152dc565b6107ba81613caf565b6001600160a01b03163b151590565b60fb5460ff1615612f345760405162461bcd60e51b81526004016107a390615083565b60fb805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f693390565b604051612f769190614947565b60405180910390a1565b60fb5460ff16612fa25760405162461bcd60e51b81526004016107a390615320565b60fb805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612f69565b6000808241604051602001612fe9929190615330565b604051602081830303815290604052805190602001209050334248428460405160200161301a959493929190615356565b60408051601f1981840301815291905280516020909101209392505050565b60006130458383613fe1565b9392505050565b6097546001600160a01b031633146107ba5760405162461bcd60e51b81526004016107a390614b50565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156130a957611184836140d4565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613103575060408051601f3d908101601f19168201909252613100918101906153ba565b60015b61311f5760405162461bcd60e51b81526004016107a390615435565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461315e5760405162461bcd60e51b81526004016107a39061548b565b5061118483838361413c565b60008281526101316020908152604080832086845290915281206001015480613197576000915050613045565b60008481526101316020908152604080832088845290915281206003015461013b549091906131c75750426131d7565b6131d44261013b54614167565b90505b6000818410156131ee576131eb8483614b76565b90505b6000878152610131602090815260408083208b84529091528120600401545b60008981526101346020526040902054811015613402576000898152610131602090815260408083208d845290915281206004015482141561326d57506000898152610131602090815260408083208d84529091529020600101546132a3565b60008a81526101346020526040902080548390811061328e5761328e614c82565b90600052602060002090600202016001015490505b60008a8152610134602052604090208054879190849081106132c7576132c7614c82565b906000526020600020906002020160000154148015613319575060008a81526101346020526040902080548691908490811061330557613305614c82565b906000526020600020906002020160010154105b156133ef57600061332b836001614bb7565b60008c815261013460205260409020541480613383575060008b815261013460205260409020869061335e856001614bb7565b8154811061336e5761336e614c82565b90600052602060002090600202016001015410155b1561338f5750846133ce565b60008b8152610134602052604090206133a9846001614bb7565b815481106133b9576133b9614c82565b90600052602060002090600202016001015490505b808210156133ed576133e08282614b76565b6133ea9085614bb7565b93505b505b50806133fa81614c23565b91505061320d565b5060006201518061341c896801158e460913d00000614bb7565b613426908461549b565b6134309190614f98565b9050600061343e8385614b76565b156134695762015180896134528587614b76565b61345c919061549b565b6134669190614f98565b90505b6134738183614bb7565b9b9a5050505050505050505050565b60008054610100900460ff16156134c9578160ff1660011480156134a55750303b155b6134c15760405162461bcd60e51b81526004016107a390615514565b506000919050565b60005460ff8084169116106134f05760405162461bcd60e51b81526004016107a390615514565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff166115e05760405162461bcd60e51b81526004016107a39061556c565b600054610100900460ff1661355d5760405162461bcd60e51b81526004016107a39061556c565b6115e061417d565b600054610100900460ff1661358c5760405162461bcd60e51b81526004016107a39061556c565b6115e06141ad565b600054610100900460ff166135bb5760405162461bcd60e51b81526004016107a39061556c565b6115e06141db565b60008080805b86518110156136a25760008681526101316020526040812088513392908a90859081106135f8576135f8614c82565b6020908102919091018101518252810191909152604001600020600201546001600160a01b03161461363c5760405162461bcd60e51b81526004016107a390614ccc565b61367787828151811061365157613651614c82565b60200260200101518761013260008a81526020019081526020016000206001015461316a565b6136819084614bb7565b925061368e600183614bb7565b91508061369a81614c23565b9150506135c9565b50600184151514156136da57600085815261013360205260409020546136c9908290614b76565b600086815261013360205260409020555b50949350505050565b60006136f0600585614f98565b905061013854600014156137a5578061013560008282546137119190614bb7565b9091555061372190508185614b76565b61012e546040516340c10f1960e01b81529195506001600160a01b0316906340c10f19906137559033908890600401614cdc565b600060405180830381600087803b15801561376f57600080fd5b505af1158015613783573d6000803e3d6000fd5b5050505083610136600082825461379a9190614bb7565b909155506138699050565b6101385481610135546137b89190614bb7565b6137c29190614f98565b61013960008282546137d49190614bb7565b909155506137e490508185614b76565b60006101355561012e546040516340c10f1960e01b81529195506001600160a01b0316906340c10f199061381e9033908890600401614cdc565b600060405180830381600087803b15801561383857600080fd5b505af115801561384c573d6000803e3d6000fd5b505050508361013660008282546138639190614bb7565b90915550505b60005b8251811015613a15576040518060a0016040528084838151811061389257613892614c82565b60200260200101518152602001428152602001336001600160a01b0316815260200161012d60009054906101000a90046001600160a01b03166001600160a01b0316632be6a2a98685815181106138eb576138eb614c82565b60200260200101516040518263ffffffff1660e01b815260040161390f91906143ef565b602060405180830381865afa15801561392c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613950919061521f565b60ff1681526000868152610134602090815260409091205491019061397790600190614b76565b9052600085815261013160205260408120855190919086908590811061399f5761399f614c82565b6020908102919091018101518252818101929092526040908101600020835181559183015160018301558201516002820180546001600160a01b0319166001600160a01b039092169190911790556060820151600382015560809091015160049091015580613a0d81614c23565b91505061386c565b5050505050565b60006064613a2933612fd3565b613a339190614ba3565b90506021811015613aa35761013854613a6457836101356000828254613a599190614bb7565b90915550613b219050565b610138548461013554613a779190614bb7565b613a819190614f98565b6101396000828254613a939190614bb7565b9091555050600061013555613b21565b61012e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990613ad69033908890600401614cdc565b600060405180830381600087803b158015613af057600080fd5b505af1158015613b04573d6000803e3d6000fd5b50505050836101366000828254613b1b9190614bb7565b90915550505b60005b8251811015613a1557613b6d838281518110613b4257613b42614c82565b6020908102919091018101516000878152610130835260408082203383529093529190912090613039565b5061012d5483516001600160a01b03909116906323b872dd9030903390879086908110613b9c57613b9c614c82565b60200260200101516040518463ffffffff1660e01b8152600401613bc293929190615034565b600060405180830381600087803b158015613bdc57600080fd5b505af1158015613bf0573d6000803e3d6000fd5b5050506000858152610131602052604081208551909250859084908110613c1957613c19614c82565b60209081029190910181015182528101919091526040016000908120818155600181018290556002810180546001600160a01b0319169055600381018290556004015580613c6681614c23565b915050613b24565b600061013954600014613c9f57600082815261012f602052604090206002015461013954613c9c9190614b76565b90505b6101395461350a57506000919050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000613d0e600585614f98565b90506101385460001415613dc357806101356000828254613d2f9190614bb7565b90915550613d3f90508185614b76565b61012e546040516340c10f1960e01b81529195506001600160a01b0316906340c10f1990613d739030908890600401614cdc565b600060405180830381600087803b158015613d8d57600080fd5b505af1158015613da1573d6000803e3d6000fd5b50505050836101366000828254613db89190614bb7565b90915550613e879050565b610138548161013554613dd69190614bb7565b613de09190614f98565b6101396000828254613df29190614bb7565b90915550613e0290508185614b76565b60006101355561012e546040516340c10f1960e01b81529195506001600160a01b0316906340c10f1990613e3c9030908890600401614cdc565b600060405180830381600087803b158015613e5657600080fd5b505af1158015613e6a573d6000803e3d6000fd5b50505050836101366000828254613e819190614bb7565b90915550505b61013a5460405163f498639960e01b815260609161010090046001600160a01b03169063f498639990613ec490869085908a90339060040161557c565b600060405180830381600087803b158015613ede57600080fd5b505af1158015613ef2573d6000803e3d6000fd5b5050505060005b8351811015613fc057613f42848281518110613f1757613f17614c82565b6020908102919091018101516000888152610130835260408082203383529093529190912090613039565b5061013160008681526020019081526020016000206000858381518110613f6b57613f6b614c82565b60209081029190910181015182528101919091526040016000908120818155600181018290556002810180546001600160a01b0319169055600381018290556004015580613fb881614c23565b915050613ef9565b505050505050565b6000613045838361420e565b606060006130458361425d565b600081815260018301602052604081205480156140ca576000614005600183614b76565b855490915060009061401990600190614b76565b905081811461407e57600086600001828154811061403957614039614c82565b906000526020600020015490508087600001848154811061405c5761405c614c82565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061408f5761408f6155bd565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610d7c565b6000915050610d7c565b6001600160a01b0381163b6140fb5760405162461bcd60e51b81526004016107a39061561d565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b614145836142b9565b6000825111806141525750805b156111845761416183836142f9565b50505050565b60008183106141765781613045565b5090919050565b600054610100900460ff166141a45760405162461bcd60e51b81526004016107a39061556c565b6115e033613caf565b600054610100900460ff166141d45760405162461bcd60e51b81526004016107a39061556c565b600160c955565b600054610100900460ff166142025760405162461bcd60e51b81526004016107a39061556c565b60fb805460ff19169055565b600081815260018301602052604081205461425557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d7c565b506000610d7c565b6060816000018054806020026020016040519081016040528092919081815260200182805480156142ad57602002820191906000526020600020905b815481526020019060010190808311614299575b50505050509050919050565b6142c2816140d4565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6143225760405162461bcd60e51b81526004016107a390615670565b600080846001600160a01b03168460405161433d91906156ce565b600060405180830381855af49150503d8060008114614378576040519150601f19603f3d011682016040523d82523d6000602084013e61437d565b606091505b50915091506143a5828260405180606001604052806027815260200161571e602791396143ae565b95945050505050565b606083156143bd575081613045565b8251156143cd5782518084602001fd5b8160405162461bcd60e51b81526004016107a3919061570c565b805b82525050565b60208101610d7c82846143e7565b8015155b81146107ba57600080fd5b8035610d7c816143fd565b60006020828403121561442c5761442c600080fd5b6000614438848461440c565b949350505050565b60008083601f84011261445557614455600080fd5b50813567ffffffffffffffff81111561447057614470600080fd5b60208301915083602082028301111561448b5761448b600080fd5b9250929050565b600080602083850312156144a8576144a8600080fd5b823567ffffffffffffffff8111156144c2576144c2600080fd5b6144ce85828601614440565b92509250509250929050565b60006001600160a01b038216610d7c565b614401816144da565b8035610d7c816144eb565b60006020828403121561451457614514600080fd5b600061443884846144f4565b8015156143e9565b60208101610d7c8284614520565b80614401565b8035610d7c81614536565b60008060006060848603121561455f5761455f600080fd5b600061456b868661453c565b935050602061457c8682870161453c565b925050604061458d8682870161453c565b9150509250925092565b6000610d7c826144da565b6000610d7c82614597565b6143e9816145a2565b60208101610d7c82846145ad565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715614600576146006145c4565b6040525050565b600061461260405190565b905061350a82826145da565b600067ffffffffffffffff821115614638576146386145c4565b5060209081020190565b60006146556146508461461e565b614607565b8381529050602080820190840283018581111561467457614674600080fd5b835b818110156146985780614689888261453c565b84525060209283019201614676565b5050509392505050565b600082601f8301126146b6576146b6600080fd5b8135614438848260208601614642565b600080604083850312156146dc576146dc600080fd5b823567ffffffffffffffff8111156146f6576146f6600080fd5b614702858286016146a2565b92505060206147138582860161453c565b9150509250929050565b6000806040838503121561473357614733600080fd5b600061473f85856144f4565b9250506020614713858286016144f4565b600067ffffffffffffffff82111561476a5761476a6145c4565b601f19601f83011660200192915050565b82818337506000910152565b600061479561465084614750565b9050828152602081018484840111156147b0576147b0600080fd5b6147bb84828561477b565b509392505050565b600082601f8301126147d7576147d7600080fd5b8135614438848260208601614787565b600080604083850312156147fd576147fd600080fd5b600061480985856144f4565b925050602083013567ffffffffffffffff81111561482957614829600080fd5b614713858286016147c3565b6000806000806060858703121561484e5761484e600080fd5b843567ffffffffffffffff81111561486857614868600080fd5b61487487828801614440565b945094505060206148878782880161453c565b92505060406148988782880161440c565b91505092959194509250565b6000602082840312156148b9576148b9600080fd5b6000614438848461453c565b606081016148d382866143e7565b6148e060208301856143e7565b61443860408301846143e7565b60008060006040848603121561490557614905600080fd5b833567ffffffffffffffff81111561491f5761491f600080fd5b61492b86828701614440565b9350935050602061458d8682870161453c565b6143e9816144da565b60208101610d7c828461493e565b8051606083019061496684826143e7565b50602082015161497960208501826143e7565b50604082015161416160408501826143e7565b60608101610d7c8284614955565b6000806000606084860312156149b2576149b2600080fd5b60006149be86866144f4565b93505060206149cf868287016144f4565b925050604061458d868287016144f4565b805160408301906149f184826143e7565b50602082015161416160208501826143e7565b6000614a1083836149e0565b505060400190565b6000614a22825190565b80845260209384019383018060005b83811015614a56578151614a458882614a04565b975060208301925050600101614a31565b509495945050505050565b602080825281016130458184614a18565b6000614a7e83836143e7565b505060200190565b6000614a90825190565b80845260209384019383018060005b83811015614a56578151614ab38882614a72565b975060208301925050600101614a9f565b60808082528101614ad58187614a86565b90508181036020830152614ae98186614a86565b90508181036040830152614afd8185614a86565b90508181036060830152614b118184614a86565b9695505050505050565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910190815260005b5060200190565b60208082528101610d7c81614b1b565b634e487b7160e01b600052601160045260246000fd5b600082821015614b8857614b88614b60565b500390565b634e487b7160e01b600052601260045260246000fd5b600082614bb257614bb2614b8d565b500690565b60008219821115614bca57614bca614b60565b500190565b6000610d7c8260601b90565b6000610d7c82614bcf565b6143e9614bf2826144da565b614bdb565b806143e9565b6000614c098285614be6565b601482019150614c198284614bf7565b5060200192915050565b6000600019821415614c3757614c37614b60565b5060010190565b601f81526000602082017f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081529150614b49565b60208082528101610d7c81614c3e565b634e487b7160e01b600052603260045260246000fd5b601c81526000602082017f596f7520646f6e2774206f776e207468697320746f6b656e207365720000000081529150614b49565b60208082528101610d7c81614c98565b60408101614cea828561493e565b61304560208301846143e7565b81835260006020840193507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614d3257614d32600080fd5b602083029250614d4383858461477b565b50500190565b60808082528101614d5a8188614a86565b90508181036020830152614d6f818688614cf7565b9050614d7e60408301856143e7565b614b11606083018461493e565b602c81526000602082017f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682081526b19195b1959d85d1958d85b1b60a21b602082015291505b5060400190565b60208082528101610d7c81614d8b565b602c81526000602082017f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682081526b6163746976652070726f787960a01b60208201529150614dd0565b60208082528101610d7c81614de7565b600e81526000602082017f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081529150614b49565b60208082528101610d7c81614e40565b600060ff8216610d7c565b6143e981614e84565b60208101610d7c8284614e8f565b603881526000602082017f555550535570677261646561626c653a206d757374206e6f742062652063616c81527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060208201529150614dd0565b60208082528101610d7c81614ea6565b601681526000602082017f706f6f6c20646f65736e2774206578697374207365720000000000000000000081529150614b49565b60208082528101610d7c81614f10565b601581526000602082017f63616e277420636c61696d206e6f20746f6b656e73000000000000000000000081529150614b49565b60208082528101610d7c81614f54565b600082614fa757614fa7614b8d565b500490565b600f81526000602082017f5245534355452044495341424c4544000000000000000000000000000000000081529150614b49565b60208082528101610d7c81614fac565b601281526000602082017f506f6f6c20646f65736e2774206578697374000000000000000000000000000081529150614b49565b60208082528101610d7c81614ff0565b60608101615042828661493e565b6148e0602083018561493e565b601081526000602082017f5061757361626c653a207061757365640000000000000000000000000000000081529150614b49565b60208082528101610d7c8161504f565b601a81526000602082017f696e636f727265637420616d6f756e74206f6620667265616b7300000000000081529150614b49565b60208082528101610d7c81615093565b601381526000602082017f68756e74696e672069732064697361626c65640000000000000000000000000081529150614b49565b60208082528101610d7c816150d7565b8051610d7c816144eb565b60006020828403121561513b5761513b600080fd5b6000614438848461511b565b601881526000602082017f596f7520646f6e2774206f776e207468697320746f6b656e000000000000000081529150614b49565b60208082528101610d7c81615147565b8051610d7c816143fd565b6000602082840312156151ab576151ab600080fd5b6000614438848461518b565b602781526000602082017f43616e27742067657420667265616b7920776974686f757420616e792066726581526630b5b99039b2b960c91b60208201529150614dd0565b60208082528101610d7c816151b7565b60ff8116614401565b8051610d7c8161520b565b60006020828403121561523457615234600080fd5b60006144388484615214565b602c81526000602082017f43454c45535449414c53204f4e4c5921212120596f7520617265206e6f74207781526b6f7274687920465245414b2160a01b60208201529150614dd0565b60208082528101610d7c81615240565b602681526000602082017f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b60208201529150614dd0565b60208082528101610d7c81615299565b601481526000602082017f5061757361626c653a206e6f742070617573656400000000000000000000000081529150614b49565b60208082528101610d7c816152ec565b600061533c8285614be6565b60148201915061534c8284614be6565b5060140192915050565b60006153628288614be6565b6014820191506153728287614bf7565b6020820191506153828286614bf7565b6020820191506153928285614bf7565b6020820191506153a28284614bf7565b5060200195945050505050565b8051610d7c81614536565b6000602082840312156153cf576153cf600080fd5b600061443884846153af565b602e81526000602082017f45524331393637557067726164653a206e657720696d706c656d656e7461746981527f6f6e206973206e6f74205555505300000000000000000000000000000000000060208201529150614dd0565b60208082528101610d7c816153db565b602981526000602082017f45524331393637557067726164653a20756e737570706f727465642070726f788152681a58589b195555525160ba1b60208201529150614dd0565b60208082528101610d7c81615445565b60008160001904831182151516156154b5576154b5614b60565b500290565b602e81526000602082017f496e697469616c697a61626c653a20636f6e747261637420697320616c72656181527f647920696e697469616c697a656400000000000000000000000000000000000060208201529150614dd0565b60208082528101610d7c816154ba565b602b81526000602082017f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206981526a6e697469616c697a696e6760a81b60208201529150614dd0565b60208082528101610d7c81615524565b6080808252810161558d8187614a86565b905081810360208301526155a18186614a86565b90506155b060408301856143e7565b6143a5606083018461493e565b634e487b7160e01b600052603160045260246000fd5b602d81526000602082017f455243313936373a206e657720696d706c656d656e746174696f6e206973206e81526c1bdd08184818dbdb9d1c9858dd609a1b60208201529150614dd0565b60208082528101610d7c816155d3565b602681526000602082017f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f8152651b9d1c9858dd60d21b60208201529150614dd0565b60208082528101610d7c8161562d565b60005b8381101561569b578181015183820152602001615683565b838111156141615750506000910152565b60006156b6825190565b6156c4818560208601615680565b9290920192915050565b600061304582846156ac565b60006156e4825190565b8084526020840193506156fb818560208601615680565b601f01601f19169290920192915050565b6020808252810161304581846156da56fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204085cc7cecfabd39e6879c9fdf5afc8eaa0058a0c133e0925000f98d40da8a5e64736f6c634300080b0033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c806378f9ff681161012e578063c4088d15116100ab578063d9a158c91161006f578063d9a158c9146106c9578063dea96b71146106e9578063df3b786814610709578063e3a9db1a14610729578063f2fde38b1461075957600080fd5b8063c4088d1514610627578063ccb98ffc14610647578063d004f38b14610667578063d1b670de14610687578063d90b7b12146106b457600080fd5b80639293a9ea116100f25780639293a9ea1461059857806394a6eb0f146105af57806397f1bcbf146105d0578063b3066d49146105e7578063ba4b14f21461060757600080fd5b806378f9ff68146104b957806389e5f8e4146105055780638da5cb5b146105255780638db8d47f1461054b57806391ab5c311461056b57600080fd5b80634f1ef286116101bc5780635c975abb116101805780635c975abb1461042c57806364d8b65514610444578063715018a614610464578063765310081461047957806376e9c7901461049957600080fd5b80634f1ef286146103a157806351dd48b1146103b457806352d1902d146103d5578063538349f3146103ea57806359e5113c1461040a57600080fd5b806339db714f1161020357806339db714f146102e65780633d5b10341461030e5780633f19ac881461032e578063434022c114610361578063485cc9551461038157600080fd5b806311e833aa1461024057806316c38b3c1461026d5780632ff6c8441461028f5780633197cbb6146102af5780633659cfe6146102c6575b600080fd5b34801561024c57600080fd5b506102576101385481565b60405161026491906143ef565b60405180910390f35b34801561027957600080fd5b5061028d610288366004614417565b610779565b005b34801561029b57600080fd5b5061028d6102aa366004614492565b6107c5565b3480156102bb57600080fd5b5061025761013b5481565b3480156102d257600080fd5b5061028d6102e13660046144ff565b610b61565b3480156102f257600080fd5b5061013a546103019060ff1681565b6040516102649190614528565b34801561031a57600080fd5b5061028d610329366004614547565b610c50565b34801561033a57600080fd5b5061013a546103549061010090046001600160a01b031681565b60405161026491906145b6565b34801561036d57600080fd5b5061025761037c3660046146c6565b610cf0565b34801561038d57600080fd5b5061028d61039c36600461471d565b610d82565b61028d6103af3660046147e7565b611189565b3480156103c057600080fd5b5061012e54610354906001600160a01b031681565b3480156103e157600080fd5b5061025761126c565b3480156103f657600080fd5b5061028d610405366004614835565b6112db565b34801561041657600080fd5b5061013a5461030190600160a81b900460ff1681565b34801561043857600080fd5b5060fb5460ff16610301565b34801561045057600080fd5b5061025761045f366004614492565b61155a565b34801561047057600080fd5b5061028d6115ac565b34801561048557600080fd5b5061028d610494366004614417565b6115e2565b3480156104a557600080fd5b506102576104b43660046148a4565b611620565b3480156104c557600080fd5b506104f66104d43660046148a4565b6101326020526000908152604090208054600182015460029092015490919083565b604051610264939291906148c5565b34801561051157600080fd5b5061028d6105203660046148ed565b611688565b34801561053157600080fd5b506097546001600160a01b03166040516102649190614947565b34801561055757600080fd5b5061028d6105663660046148ed565b611893565b34801561057757600080fd5b5061058b6105863660046148a4565b611c8c565b604051610264919061498c565b3480156105a457600080fd5b506102576101365481565b3480156105bb57600080fd5b5061012d54610354906001600160a01b031681565b3480156105dc57600080fd5b506102576101395481565b3480156105f357600080fd5b5061028d61060236600461499a565b611d0a565b34801561061357600080fd5b5061028d6106223660046148ed565b611d93565b34801561063357600080fd5b5061028d610642366004614417565b612304565b34801561065357600080fd5b5061028d6106623660046148a4565b61234d565b34801561067357600080fd5b5061028d610682366004614547565b61237d565b34801561069357600080fd5b506106a76106a23660046148a4565b61241d565b6040516102649190614a61565b3480156106c057600080fd5b5061028d6124ba565b3480156106d557600080fd5b506102576106e43660046148a4565b6125be565b3480156106f557600080fd5b5061028d610704366004614492565b6125f4565b34801561071557600080fd5b5061028d610724366004614492565b612a26565b34801561073557600080fd5b506107496107443660046144ff565b612d91565b6040516102649493929190614ac4565b34801561076557600080fd5b5061028d6107743660046144ff565b612ea9565b6097546001600160a01b031633146107ac5760405162461bcd60e51b81526004016107a390614b50565b60405180910390fd5b80156107bd576107ba612f11565b50565b6107ba612f80565b6203f48061013754426107d89190614b76565b1061089f5760006107e833612fd3565b905060005b6003811015610897576000610803600384614ba3565b61080e906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091610867913391879101614bfd565b6040516020818303038152906040528051906020012060001c93505050808061088f90614c23565b9150506107ed565b505042610137555b600260c95414156108c25760405162461bcd60e51b81526004016107a390614c72565b600260c955600080805b83811015610a52573361012f60008787858181106108ec576108ec614c82565b60209081029290920135835250810191909152604001600020600101546001600160a01b03161461092f5760405162461bcd60e51b81526004016107a390614ccc565b61013954156109875761012f600086868481811061094f5761094f614c82565b90506020020135815260200190815260200160002060020154610139546109769190614b76565b6109809083614bb7565b9150610995565b610992600083614bb7565b91505b61012f60008686848181106109ac576109ac614c82565b6020908102929092013583525081019190915260400160009081208181556001810180546001600160a01b031916905560020155610a328585838181106109f5576109f5614c82565b3360009081527f3122fe5b7d531425375ebfbec0198c35c854cd3c1f71c808c2cc488a3513b22b6020908152604090912093910201359050613039565b50610a3e600184614bb7565b925080610a4a81614c23565b9150506108cc565b5061012e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610a869030908590600401614cdc565b600060405180830381600087803b158015610aa057600080fd5b505af1158015610ab4573d6000803e3d6000fd5b505061013a5460405163f498639960e01b8152606093506101009091046001600160a01b0316915063f498639990610af89084908990899088903390600401614d49565b600060405180830381600087803b158015610b1257600080fd5b505af1158015610b26573d6000803e3d6000fd5b50505050816101366000828254610b3d9190614bb7565b909155505061013854610b51908490614b76565b610138555050600160c955505050565b306001600160a01b037f00000000000000000000000010ebfb5f40cb607cf7d0f8afb39435ecc6512475161415610baa5760405162461bcd60e51b81526004016107a390614dd7565b7f00000000000000000000000010ebfb5f40cb607cf7d0f8afb39435ecc65124756001600160a01b0316610c057f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610c2b5760405162461bcd60e51b81526004016107a390614e30565b610c348161304c565b604080516000808252602082019092526107ba91839190613076565b6097546001600160a01b03163314610c7a5760405162461bcd60e51b81526004016107a390614b50565b6101326020527f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df2929092557fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc1940414663555560026000527f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60e55565b600060038210610d125760405162461bcd60e51b81526004016107a390614e74565b6000805b8451811015610d7857610d5a858281518110610d3457610d34614c82565b60200260200101518561013260008881526020019081526020016000206001015461316a565b610d649083614bb7565b915080610d7081614c23565b915050610d16565b5090505b92915050565b6203f4806101375442610d959190614b76565b10610e5c576000610da533612fd3565b905060005b6003811015610e54576000610dc0600384614ba3565b610dcb906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091610e24913391879101614bfd565b6040516020818303038152906040528051906020012060001c935050508080610e4c90614c23565b915050610daa565b505042610137555b6000610e686001613482565b90508015610e80576000805461ff0019166101001790555b610e8861350f565b610e90613536565b610e98613565565b610ea0613594565b61012d80546001600160a01b038086166001600160a01b03199283161790925561012e805492851692909116919091179055610eda612f11565b600061013881905560408051606080820183526001808352680ad78ebc5ac6200000602080850182815285870192835287805261013280835295517f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df055517f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df15590517f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df2558451808401865260038152681043561a8829300000818301908152686194049f30f720000082880190815293885285835290517fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc19404146635355517fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc1940414663545590517fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc1940414663555583519182018452600582526815af1d78b58c40000082820190815269014542ba12a337c000009483019485526002865292815290517f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60c5590517f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60d5590517f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60e5561013390527fa729f2b7e889b2ebf4d780e1fbffc38754bf520be086b132a2961d8dad3e68fe8190557f2268e5b55252839d7cb4baadda5cc1ac7a7ffea49b6689cd90f3df5e995ceb2e8190557f88920c679429b299cfeb539d1fa8eee51764f3c0e450924f49e2e00e7a1af7dd81905561013a805460ff19169055610135558015611184576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061117b90600190614e98565b60405180910390a15b505050565b306001600160a01b037f00000000000000000000000010ebfb5f40cb607cf7d0f8afb39435ecc65124751614156111d25760405162461bcd60e51b81526004016107a390614dd7565b7f00000000000000000000000010ebfb5f40cb607cf7d0f8afb39435ecc65124756001600160a01b031661122d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112535760405162461bcd60e51b81526004016107a390614e30565b61125c8261304c565b61126882826001613076565b5050565b6000306001600160a01b037f00000000000000000000000010ebfb5f40cb607cf7d0f8afb39435ecc651247516146112b65760405162461bcd60e51b81526004016107a390614f00565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b6203f48061013754426112ee9190614b76565b106113b55760006112fe33612fd3565b905060005b60038110156113ad576000611319600384614ba3565b611324906001614bb7565b60408051808201825282815242602080830191825260008781526101348252848120805460018181018355918352918390208551600290930201918255925192019190915591519293509161137d913391879101614bfd565b6040516020818303038152906040528051906020012060001c9350505080806113a590614c23565b915050611303565b505042610137555b600260c95414156113d85760405162461bcd60e51b81526004016107a390614c72565b600260c98190558211156113fe5760405162461bcd60e51b81526004016107a390614f44565b8261141b5760405162461bcd60e51b81526004016107a390614f88565b600082815261013260205260408120546114359085614ba3565b1561143f57600080fd5b600182151514156114cd57611488858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525088935091506135c39050565b90506114c881848787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136e392505050565b61154e565b61150e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250600191506135c39050565b905061154e8184878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1c92505050565b5050600160c955505050565b6000805b828110156115a55761158784848381811061157b5761157b614c82565b90506020020135613c6e565b6115919083614bb7565b91508061159d81614c23565b91505061155e565b5092915050565b6097546001600160a01b031633146115d65760405162461bcd60e51b81526004016107a390614b50565b6115e06000613caf565b565b6097546001600160a01b0316331461160c5760405162461bcd60e51b81526004016107a390614b50565b61013a805460ff1916911515919091179055565b6000600382106116425760405162461bcd60e51b81526004016107a390614e74565b600082815261013460205260409020805461165f90600190614b76565b8154811061166f5761166f614c82565b9060005260206000209060020201600001549050919050565b6203f480610137544261169b9190614b76565b106117625760006116ab33612fd3565b905060005b600381101561175a5760006116c6600384614ba3565b6116d1906001614bb7565b60408051808201825282815242602080830191825260008781526101348252848120805460018181018355918352918390208551600290930201918255925192019190915591519293509161172a913391879101614bfd565b6040516020818303038152906040528051906020012060001c93505050808061175290614c23565b9150506116b0565b505042610137555b600260c95414156117855760405162461bcd60e51b81526004016107a390614c72565b600260c98190558111156117ab5760405162461bcd60e51b81526004016107a390614f44565b816117c85760405162461bcd60e51b81526004016107a390614f88565b6000818152610132602052604081205481906117e49085614ba3565b156117ee57600080fd5b61182c858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525088935091506135c39050565b600084815261013260205260409020549092506118499085614f98565b6118539083614f98565b905061154e8284878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613d0192505050565b600260c95414156118b65760405162461bcd60e51b81526004016107a390614c72565b600260c95561013a5460ff166118de5760405162461bcd60e51b81526004016107a390614fe0565b60038111156118ff5760405162461bcd60e51b81526004016107a390615024565b8060031415611aa45760005b82811015611a9e573361012f600086868581811061192b5761192b614c82565b60209081029290920135835250810191909152604001600020600101546001600160a01b03161461196e5760405162461bcd60e51b81526004016107a390614ccc565b61012f600085858481811061198557611985614c82565b6020908102929092013583525081019190915260400160009081208181556001810180546001600160a01b0319169055600201556119f48484838181106119ce576119ce614c82565b600086815261013060209081526040808320338452825290912093910201359050613039565b5060016101386000828254611a099190614b76565b909155505061012d546001600160a01b03166323b872dd3033878786818110611a3457611a34614c82565b905060200201356040518463ffffffff1660e01b8152600401611a5993929190615034565b600060405180830381600087803b158015611a7357600080fd5b505af1158015611a87573d6000803e3d6000fd5b505050508080611a9690614c23565b91505061190b565b50611c82565b6000805b83811015611c54576000838152610131602052604081203391878785818110611ad357611ad3614c82565b60209081029290920135835250810191909152604001600020600201546001600160a01b031614611b165760405162461bcd60e51b81526004016107a390614ccc565b60008381526101316020526040812090868684818110611b3857611b38614c82565b602090810292909201358352508101919091526040016000908120818155600181018290556002810180546001600160a01b03191690556003810182905560040155611bb5858583818110611b8f57611b8f614c82565b600087815261013060209081526040808320338452825290912093910201359050613039565b50611bc1600183614bb7565b61012d549092506001600160a01b03166323b872dd3033888886818110611bea57611bea614c82565b905060200201356040518463ffffffff1660e01b8152600401611c0f93929190615034565b600060405180830381600087803b158015611c2957600080fd5b505af1158015611c3d573d6000803e3d6000fd5b505050508080611c4c90614c23565b915050611aa8565b5060008281526101336020526040902054611c70908290614b76565b60008381526101336020526040902055505b5050600160c95550565b611cb060405180606001604052806000815260200160008152602001600081525090565b60038210611cd05760405162461bcd60e51b81526004016107a390614e74565b5060009081526101326020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b6097546001600160a01b03163314611d345760405162461bcd60e51b81526004016107a390614b50565b61012d80546001600160a01b039485166001600160a01b03199182161790915561012e8054938516939091169290921790915561013a8054919092166101000274ffffffffffffffffffffffffffffffffffffffff0019909116179055565b6203f4806101375442611da69190614b76565b10611e6d576000611db633612fd3565b905060005b6003811015611e65576000611dd1600384614ba3565b611ddc906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091611e35913391879101614bfd565b6040516020818303038152906040528051906020012060001c935050508080611e5d90614c23565b915050611dbb565b505042610137555b600260c9541415611e905760405162461bcd60e51b81526004016107a390614c72565b600260c95560fb5460ff1615611eb85760405162461bcd60e51b81526004016107a390615083565b6002811115611ed95760405162461bcd60e51b81526004016107a390614f44565b60008181526101326020526040902054611ef39083614ba3565b15611f105760405162461bcd60e51b81526004016107a3906150c7565b61013a54600160a81b900460ff1615611f3b5760405162461bcd60e51b81526004016107a39061510b565b6000805b838110156122e85761012d5433906001600160a01b0316636352211e878785818110611f6d57611f6d614c82565b905060200201356040518263ffffffff1660e01b8152600401611f9091906143ef565b6020604051808303816000875af1158015611faf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd39190615126565b6001600160a01b031614611ff95760405162461bcd60e51b81526004016107a39061517b565b61012d546001600160a01b0316637255e9aa86868481811061201d5761201d614c82565b905060200201356040518263ffffffff1660e01b815260040161204091906143ef565b602060405180830381865afa15801561205d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120819190615196565b61209d5760405162461bcd60e51b81526004016107a3906151fb565b6040518060a001604052808686848181106120ba576120ba614c82565b60209081029290920135835250429082015233604082015261012d546060909101906001600160a01b0316632be6a2a98888868181106120fc576120fc614c82565b905060200201356040518263ffffffff1660e01b815260040161211f91906143ef565b602060405180830381865afa15801561213c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612160919061521f565b60ff1681526000858152610134602090815260409091205491019061218790600190614b76565b9052600084815261013160205260408120908787858181106121ab576121ab614c82565b60209081029290920135835250818101929092526040908101600020835181559183015160018301558201516002820180546001600160a01b0319166001600160a01b039092169190911790556060820151600382015560809091015160049091015561224985858381811061222357612223614c82565b600087815261013060209081526040808320338452825290912093910201359050613fc8565b50612255600183614bb7565b61012d549092506001600160a01b03166323b872dd333088888681811061227e5761227e614c82565b905060200201356040518463ffffffff1660e01b81526004016122a393929190615034565b600060405180830381600087803b1580156122bd57600080fd5b505af11580156122d1573d6000803e3d6000fd5b5050505080806122e090614c23565b915050611f3f565b5060008281526101336020526040902054611c70908290614bb7565b6097546001600160a01b0316331461232e5760405162461bcd60e51b81526004016107a390614b50565b61013a8054911515600160a81b0260ff60a81b19909216919091179055565b6097546001600160a01b031633146123775760405162461bcd60e51b81526004016107a390614b50565b61013b55565b6097546001600160a01b031633146123a75760405162461bcd60e51b81526004016107a390614b50565b6101326020527f9d9698811d02305f607c0c8c53527c944bd267f42bcbf37ec1f71dd7f89e9df1929092557fb0176a9aff47fe9db68ba87663f92f59cb14d8f7ca54d4ab0fcc1940414663545560026000527f4282982ca78a58e4586f142eb10c17dca16316e1d08f8afef403c01db9c3c60d55565b60606003821061243f5760405162461bcd60e51b81526004016107a390614e74565b60008281526101346020908152604080832080548251818502810185019093528083529193909284015b828210156124af57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190612469565b505050509050919050565b6203f48061013754426124cd9190614b76565b106125945760006124dd33612fd3565b905060005b600381101561258c5760006124f8600384614ba3565b612503906001614bb7565b60408051808201825282815242602080830191825260008781526101348252848120805460018181018355918352918390208551600290930201918255925192019190915591519293509161255c913391879101614bfd565b6040516020818303038152906040528051906020012060001c93505050808061258490614c23565b9150506124e2565b505042610137555b6097546001600160a01b031633146115e05760405162461bcd60e51b81526004016107a390614b50565b6000600382106125e05760405162461bcd60e51b81526004016107a390614e74565b506000908152610133602052604090205490565b6203f48061013754426126079190614b76565b106126ce57600061261733612fd3565b905060005b60038110156126c6576000612632600384614ba3565b61263d906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091612696913391879101614bfd565b6040516020818303038152906040528051906020012060001c9350505080806126be90614c23565b91505061261c565b505042610137555b600260c95414156126f15760405162461bcd60e51b81526004016107a390614c72565b600260c95560fb5460ff16156127195760405162461bcd60e51b81526004016107a390615083565b60005b81811015611c825761012d5433906001600160a01b0316636352211e85858581811061274a5761274a614c82565b905060200201356040518263ffffffff1660e01b815260040161276d91906143ef565b6020604051808303816000875af115801561278c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b09190615126565b6001600160a01b0316146127d65760405162461bcd60e51b81526004016107a39061517b565b61012d546001600160a01b0316637255e9aa8484848181106127fa576127fa614c82565b905060200201356040518263ffffffff1660e01b815260040161281d91906143ef565b602060405180830381865afa15801561283a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285e9190615196565b1561287b5760405162461bcd60e51b81526004016107a390615289565b604051806060016040528084848481811061289857612898614c82565b905060200201358152602001336001600160a01b031681526020016101395481525061012f60008585858181106128d1576128d1614c82565b9050602002013581526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015590505061297c83838381811061293f5761293f614c82565b3360009081527f3122fe5b7d531425375ebfbec0198c35c854cd3c1f71c808c2cc488a3513b22b6020908152604090912093910201359050613fc8565b5061012d546001600160a01b03166323b872dd33308686868181106129a3576129a3614c82565b905060200201356040518463ffffffff1660e01b81526004016129c893929190615034565b600060405180830381600087803b1580156129e257600080fd5b505af11580156129f6573d6000803e3d6000fd5b5050505060016101386000828254612a0e9190614bb7565b90915550819050612a1e81614c23565b91505061271c565b6203f4806101375442612a399190614b76565b10612b00576000612a4933612fd3565b905060005b6003811015612af8576000612a64600384614ba3565b612a6f906001614bb7565b604080518082018252828152426020808301918252600087815261013482528481208054600181810183559183529183902085516002909302019182559251920191909155915192935091612ac8913391879101614bfd565b6040516020818303038152906040528051906020012060001c935050508080612af090614c23565b915050612a4e565b505042610137555b600260c9541415612b235760405162461bcd60e51b81526004016107a390614c72565b600260c955600080805b83811015612cf5573361012f6000878785818110612b4d57612b4d614c82565b60209081029290920135835250810191909152604001600020600101546001600160a01b031614612b905760405162461bcd60e51b81526004016107a390614ccc565b6101395415612be85761012f6000868684818110612bb057612bb0614c82565b9050602002013581526020019081526020016000206002015461013954612bd79190614b76565b612be19083614bb7565b9150612bf6565b612bf3600083614bb7565b91505b61012f6000868684818110612c0d57612c0d614c82565b6020908102929092013583525081019190915260400160009081208181556001810180546001600160a01b031916905560020155612c568585838181106109f5576109f5614c82565b5061012d546001600160a01b03166323b872dd3033888886818110612c7d57612c7d614c82565b905060200201356040518463ffffffff1660e01b8152600401612ca293929190615034565b600060405180830381600087803b158015612cbc57600080fd5b505af1158015612cd0573d6000803e3d6000fd5b50505050600183612ce19190614bb7565b925080612ced81614c23565b915050612b2d565b5061012e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990612d299033908590600401614cdc565b600060405180830381600087803b158015612d4357600080fd5b505af1158015612d57573d6000803e3d6000fd5b50505050806101366000828254612d6e9190614bb7565b909155505061013854612d82908390614b76565b610138555050600160c9555050565b6001600160a01b03811660009081527f363eca0a79dc8ec297995f86b12cc61391ff0de52f1ba01ca23e9716f742e41360205260409020606090819081908190612dda90613fd4565b6001600160a01b03861660009081527fe2b6217f4c97aa68f5160f7d6659df601bbb6b6328ba78b8ab41ee5c6e7d7a5960205260409020612e1a90613fd4565b6001600160a01b03871660009081527fea19767d888507d04480e03c5531fa09d724e33807f1d26eef5602518076ecd060205260409020612e5a90613fd4565b6001600160a01b03881660009081527f3122fe5b7d531425375ebfbec0198c35c854cd3c1f71c808c2cc488a3513b22b60205260409020612e9a90613fd4565b93509350935093509193509193565b6097546001600160a01b03163314612ed35760405162461bcd60e51b81526004016107a390614b50565b6001600160a01b038116612ef95760405162461bcd60e51b81526004016107a3906152dc565b6107ba81613caf565b6001600160a01b03163b151590565b60fb5460ff1615612f345760405162461bcd60e51b81526004016107a390615083565b60fb805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f693390565b604051612f769190614947565b60405180910390a1565b60fb5460ff16612fa25760405162461bcd60e51b81526004016107a390615320565b60fb805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612f69565b6000808241604051602001612fe9929190615330565b604051602081830303815290604052805190602001209050334248428460405160200161301a959493929190615356565b60408051601f1981840301815291905280516020909101209392505050565b60006130458383613fe1565b9392505050565b6097546001600160a01b031633146107ba5760405162461bcd60e51b81526004016107a390614b50565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156130a957611184836140d4565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613103575060408051601f3d908101601f19168201909252613100918101906153ba565b60015b61311f5760405162461bcd60e51b81526004016107a390615435565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461315e5760405162461bcd60e51b81526004016107a39061548b565b5061118483838361413c565b60008281526101316020908152604080832086845290915281206001015480613197576000915050613045565b60008481526101316020908152604080832088845290915281206003015461013b549091906131c75750426131d7565b6131d44261013b54614167565b90505b6000818410156131ee576131eb8483614b76565b90505b6000878152610131602090815260408083208b84529091528120600401545b60008981526101346020526040902054811015613402576000898152610131602090815260408083208d845290915281206004015482141561326d57506000898152610131602090815260408083208d84529091529020600101546132a3565b60008a81526101346020526040902080548390811061328e5761328e614c82565b90600052602060002090600202016001015490505b60008a8152610134602052604090208054879190849081106132c7576132c7614c82565b906000526020600020906002020160000154148015613319575060008a81526101346020526040902080548691908490811061330557613305614c82565b906000526020600020906002020160010154105b156133ef57600061332b836001614bb7565b60008c815261013460205260409020541480613383575060008b815261013460205260409020869061335e856001614bb7565b8154811061336e5761336e614c82565b90600052602060002090600202016001015410155b1561338f5750846133ce565b60008b8152610134602052604090206133a9846001614bb7565b815481106133b9576133b9614c82565b90600052602060002090600202016001015490505b808210156133ed576133e08282614b76565b6133ea9085614bb7565b93505b505b50806133fa81614c23565b91505061320d565b5060006201518061341c896801158e460913d00000614bb7565b613426908461549b565b6134309190614f98565b9050600061343e8385614b76565b156134695762015180896134528587614b76565b61345c919061549b565b6134669190614f98565b90505b6134738183614bb7565b9b9a5050505050505050505050565b60008054610100900460ff16156134c9578160ff1660011480156134a55750303b155b6134c15760405162461bcd60e51b81526004016107a390615514565b506000919050565b60005460ff8084169116106134f05760405162461bcd60e51b81526004016107a390615514565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff166115e05760405162461bcd60e51b81526004016107a39061556c565b600054610100900460ff1661355d5760405162461bcd60e51b81526004016107a39061556c565b6115e061417d565b600054610100900460ff1661358c5760405162461bcd60e51b81526004016107a39061556c565b6115e06141ad565b600054610100900460ff166135bb5760405162461bcd60e51b81526004016107a39061556c565b6115e06141db565b60008080805b86518110156136a25760008681526101316020526040812088513392908a90859081106135f8576135f8614c82565b6020908102919091018101518252810191909152604001600020600201546001600160a01b03161461363c5760405162461bcd60e51b81526004016107a390614ccc565b61367787828151811061365157613651614c82565b60200260200101518761013260008a81526020019081526020016000206001015461316a565b6136819084614bb7565b925061368e600183614bb7565b91508061369a81614c23565b9150506135c9565b50600184151514156136da57600085815261013360205260409020546136c9908290614b76565b600086815261013360205260409020555b50949350505050565b60006136f0600585614f98565b905061013854600014156137a5578061013560008282546137119190614bb7565b9091555061372190508185614b76565b61012e546040516340c10f1960e01b81529195506001600160a01b0316906340c10f19906137559033908890600401614cdc565b600060405180830381600087803b15801561376f57600080fd5b505af1158015613783573d6000803e3d6000fd5b5050505083610136600082825461379a9190614bb7565b909155506138699050565b6101385481610135546137b89190614bb7565b6137c29190614f98565b61013960008282546137d49190614bb7565b909155506137e490508185614b76565b60006101355561012e546040516340c10f1960e01b81529195506001600160a01b0316906340c10f199061381e9033908890600401614cdc565b600060405180830381600087803b15801561383857600080fd5b505af115801561384c573d6000803e3d6000fd5b505050508361013660008282546138639190614bb7565b90915550505b60005b8251811015613a15576040518060a0016040528084838151811061389257613892614c82565b60200260200101518152602001428152602001336001600160a01b0316815260200161012d60009054906101000a90046001600160a01b03166001600160a01b0316632be6a2a98685815181106138eb576138eb614c82565b60200260200101516040518263ffffffff1660e01b815260040161390f91906143ef565b602060405180830381865afa15801561392c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613950919061521f565b60ff1681526000868152610134602090815260409091205491019061397790600190614b76565b9052600085815261013160205260408120855190919086908590811061399f5761399f614c82565b6020908102919091018101518252818101929092526040908101600020835181559183015160018301558201516002820180546001600160a01b0319166001600160a01b039092169190911790556060820151600382015560809091015160049091015580613a0d81614c23565b91505061386c565b5050505050565b60006064613a2933612fd3565b613a339190614ba3565b90506021811015613aa35761013854613a6457836101356000828254613a599190614bb7565b90915550613b219050565b610138548461013554613a779190614bb7565b613a819190614f98565b6101396000828254613a939190614bb7565b9091555050600061013555613b21565b61012e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990613ad69033908890600401614cdc565b600060405180830381600087803b158015613af057600080fd5b505af1158015613b04573d6000803e3d6000fd5b50505050836101366000828254613b1b9190614bb7565b90915550505b60005b8251811015613a1557613b6d838281518110613b4257613b42614c82565b6020908102919091018101516000878152610130835260408082203383529093529190912090613039565b5061012d5483516001600160a01b03909116906323b872dd9030903390879086908110613b9c57613b9c614c82565b60200260200101516040518463ffffffff1660e01b8152600401613bc293929190615034565b600060405180830381600087803b158015613bdc57600080fd5b505af1158015613bf0573d6000803e3d6000fd5b5050506000858152610131602052604081208551909250859084908110613c1957613c19614c82565b60209081029190910181015182528101919091526040016000908120818155600181018290556002810180546001600160a01b0319169055600381018290556004015580613c6681614c23565b915050613b24565b600061013954600014613c9f57600082815261012f602052604090206002015461013954613c9c9190614b76565b90505b6101395461350a57506000919050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000613d0e600585614f98565b90506101385460001415613dc357806101356000828254613d2f9190614bb7565b90915550613d3f90508185614b76565b61012e546040516340c10f1960e01b81529195506001600160a01b0316906340c10f1990613d739030908890600401614cdc565b600060405180830381600087803b158015613d8d57600080fd5b505af1158015613da1573d6000803e3d6000fd5b50505050836101366000828254613db89190614bb7565b90915550613e879050565b610138548161013554613dd69190614bb7565b613de09190614f98565b6101396000828254613df29190614bb7565b90915550613e0290508185614b76565b60006101355561012e546040516340c10f1960e01b81529195506001600160a01b0316906340c10f1990613e3c9030908890600401614cdc565b600060405180830381600087803b158015613e5657600080fd5b505af1158015613e6a573d6000803e3d6000fd5b50505050836101366000828254613e819190614bb7565b90915550505b61013a5460405163f498639960e01b815260609161010090046001600160a01b03169063f498639990613ec490869085908a90339060040161557c565b600060405180830381600087803b158015613ede57600080fd5b505af1158015613ef2573d6000803e3d6000fd5b5050505060005b8351811015613fc057613f42848281518110613f1757613f17614c82565b6020908102919091018101516000888152610130835260408082203383529093529190912090613039565b5061013160008681526020019081526020016000206000858381518110613f6b57613f6b614c82565b60209081029190910181015182528101919091526040016000908120818155600181018290556002810180546001600160a01b0319169055600381018290556004015580613fb881614c23565b915050613ef9565b505050505050565b6000613045838361420e565b606060006130458361425d565b600081815260018301602052604081205480156140ca576000614005600183614b76565b855490915060009061401990600190614b76565b905081811461407e57600086600001828154811061403957614039614c82565b906000526020600020015490508087600001848154811061405c5761405c614c82565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061408f5761408f6155bd565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610d7c565b6000915050610d7c565b6001600160a01b0381163b6140fb5760405162461bcd60e51b81526004016107a39061561d565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b614145836142b9565b6000825111806141525750805b156111845761416183836142f9565b50505050565b60008183106141765781613045565b5090919050565b600054610100900460ff166141a45760405162461bcd60e51b81526004016107a39061556c565b6115e033613caf565b600054610100900460ff166141d45760405162461bcd60e51b81526004016107a39061556c565b600160c955565b600054610100900460ff166142025760405162461bcd60e51b81526004016107a39061556c565b60fb805460ff19169055565b600081815260018301602052604081205461425557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d7c565b506000610d7c565b6060816000018054806020026020016040519081016040528092919081815260200182805480156142ad57602002820191906000526020600020905b815481526020019060010190808311614299575b50505050509050919050565b6142c2816140d4565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6143225760405162461bcd60e51b81526004016107a390615670565b600080846001600160a01b03168460405161433d91906156ce565b600060405180830381855af49150503d8060008114614378576040519150601f19603f3d011682016040523d82523d6000602084013e61437d565b606091505b50915091506143a5828260405180606001604052806027815260200161571e602791396143ae565b95945050505050565b606083156143bd575081613045565b8251156143cd5782518084602001fd5b8160405162461bcd60e51b81526004016107a3919061570c565b805b82525050565b60208101610d7c82846143e7565b8015155b81146107ba57600080fd5b8035610d7c816143fd565b60006020828403121561442c5761442c600080fd5b6000614438848461440c565b949350505050565b60008083601f84011261445557614455600080fd5b50813567ffffffffffffffff81111561447057614470600080fd5b60208301915083602082028301111561448b5761448b600080fd5b9250929050565b600080602083850312156144a8576144a8600080fd5b823567ffffffffffffffff8111156144c2576144c2600080fd5b6144ce85828601614440565b92509250509250929050565b60006001600160a01b038216610d7c565b614401816144da565b8035610d7c816144eb565b60006020828403121561451457614514600080fd5b600061443884846144f4565b8015156143e9565b60208101610d7c8284614520565b80614401565b8035610d7c81614536565b60008060006060848603121561455f5761455f600080fd5b600061456b868661453c565b935050602061457c8682870161453c565b925050604061458d8682870161453c565b9150509250925092565b6000610d7c826144da565b6000610d7c82614597565b6143e9816145a2565b60208101610d7c82846145ad565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715614600576146006145c4565b6040525050565b600061461260405190565b905061350a82826145da565b600067ffffffffffffffff821115614638576146386145c4565b5060209081020190565b60006146556146508461461e565b614607565b8381529050602080820190840283018581111561467457614674600080fd5b835b818110156146985780614689888261453c565b84525060209283019201614676565b5050509392505050565b600082601f8301126146b6576146b6600080fd5b8135614438848260208601614642565b600080604083850312156146dc576146dc600080fd5b823567ffffffffffffffff8111156146f6576146f6600080fd5b614702858286016146a2565b92505060206147138582860161453c565b9150509250929050565b6000806040838503121561473357614733600080fd5b600061473f85856144f4565b9250506020614713858286016144f4565b600067ffffffffffffffff82111561476a5761476a6145c4565b601f19601f83011660200192915050565b82818337506000910152565b600061479561465084614750565b9050828152602081018484840111156147b0576147b0600080fd5b6147bb84828561477b565b509392505050565b600082601f8301126147d7576147d7600080fd5b8135614438848260208601614787565b600080604083850312156147fd576147fd600080fd5b600061480985856144f4565b925050602083013567ffffffffffffffff81111561482957614829600080fd5b614713858286016147c3565b6000806000806060858703121561484e5761484e600080fd5b843567ffffffffffffffff81111561486857614868600080fd5b61487487828801614440565b945094505060206148878782880161453c565b92505060406148988782880161440c565b91505092959194509250565b6000602082840312156148b9576148b9600080fd5b6000614438848461453c565b606081016148d382866143e7565b6148e060208301856143e7565b61443860408301846143e7565b60008060006040848603121561490557614905600080fd5b833567ffffffffffffffff81111561491f5761491f600080fd5b61492b86828701614440565b9350935050602061458d8682870161453c565b6143e9816144da565b60208101610d7c828461493e565b8051606083019061496684826143e7565b50602082015161497960208501826143e7565b50604082015161416160408501826143e7565b60608101610d7c8284614955565b6000806000606084860312156149b2576149b2600080fd5b60006149be86866144f4565b93505060206149cf868287016144f4565b925050604061458d868287016144f4565b805160408301906149f184826143e7565b50602082015161416160208501826143e7565b6000614a1083836149e0565b505060400190565b6000614a22825190565b80845260209384019383018060005b83811015614a56578151614a458882614a04565b975060208301925050600101614a31565b509495945050505050565b602080825281016130458184614a18565b6000614a7e83836143e7565b505060200190565b6000614a90825190565b80845260209384019383018060005b83811015614a56578151614ab38882614a72565b975060208301925050600101614a9f565b60808082528101614ad58187614a86565b90508181036020830152614ae98186614a86565b90508181036040830152614afd8185614a86565b90508181036060830152614b118184614a86565b9695505050505050565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910190815260005b5060200190565b60208082528101610d7c81614b1b565b634e487b7160e01b600052601160045260246000fd5b600082821015614b8857614b88614b60565b500390565b634e487b7160e01b600052601260045260246000fd5b600082614bb257614bb2614b8d565b500690565b60008219821115614bca57614bca614b60565b500190565b6000610d7c8260601b90565b6000610d7c82614bcf565b6143e9614bf2826144da565b614bdb565b806143e9565b6000614c098285614be6565b601482019150614c198284614bf7565b5060200192915050565b6000600019821415614c3757614c37614b60565b5060010190565b601f81526000602082017f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081529150614b49565b60208082528101610d7c81614c3e565b634e487b7160e01b600052603260045260246000fd5b601c81526000602082017f596f7520646f6e2774206f776e207468697320746f6b656e207365720000000081529150614b49565b60208082528101610d7c81614c98565b60408101614cea828561493e565b61304560208301846143e7565b81835260006020840193507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614d3257614d32600080fd5b602083029250614d4383858461477b565b50500190565b60808082528101614d5a8188614a86565b90508181036020830152614d6f818688614cf7565b9050614d7e60408301856143e7565b614b11606083018461493e565b602c81526000602082017f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682081526b19195b1959d85d1958d85b1b60a21b602082015291505b5060400190565b60208082528101610d7c81614d8b565b602c81526000602082017f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682081526b6163746976652070726f787960a01b60208201529150614dd0565b60208082528101610d7c81614de7565b600e81526000602082017f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081529150614b49565b60208082528101610d7c81614e40565b600060ff8216610d7c565b6143e981614e84565b60208101610d7c8284614e8f565b603881526000602082017f555550535570677261646561626c653a206d757374206e6f742062652063616c81527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060208201529150614dd0565b60208082528101610d7c81614ea6565b601681526000602082017f706f6f6c20646f65736e2774206578697374207365720000000000000000000081529150614b49565b60208082528101610d7c81614f10565b601581526000602082017f63616e277420636c61696d206e6f20746f6b656e73000000000000000000000081529150614b49565b60208082528101610d7c81614f54565b600082614fa757614fa7614b8d565b500490565b600f81526000602082017f5245534355452044495341424c4544000000000000000000000000000000000081529150614b49565b60208082528101610d7c81614fac565b601281526000602082017f506f6f6c20646f65736e2774206578697374000000000000000000000000000081529150614b49565b60208082528101610d7c81614ff0565b60608101615042828661493e565b6148e0602083018561493e565b601081526000602082017f5061757361626c653a207061757365640000000000000000000000000000000081529150614b49565b60208082528101610d7c8161504f565b601a81526000602082017f696e636f727265637420616d6f756e74206f6620667265616b7300000000000081529150614b49565b60208082528101610d7c81615093565b601381526000602082017f68756e74696e672069732064697361626c65640000000000000000000000000081529150614b49565b60208082528101610d7c816150d7565b8051610d7c816144eb565b60006020828403121561513b5761513b600080fd5b6000614438848461511b565b601881526000602082017f596f7520646f6e2774206f776e207468697320746f6b656e000000000000000081529150614b49565b60208082528101610d7c81615147565b8051610d7c816143fd565b6000602082840312156151ab576151ab600080fd5b6000614438848461518b565b602781526000602082017f43616e27742067657420667265616b7920776974686f757420616e792066726581526630b5b99039b2b960c91b60208201529150614dd0565b60208082528101610d7c816151b7565b60ff8116614401565b8051610d7c8161520b565b60006020828403121561523457615234600080fd5b60006144388484615214565b602c81526000602082017f43454c45535449414c53204f4e4c5921212120596f7520617265206e6f74207781526b6f7274687920465245414b2160a01b60208201529150614dd0565b60208082528101610d7c81615240565b602681526000602082017f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b60208201529150614dd0565b60208082528101610d7c81615299565b601481526000602082017f5061757361626c653a206e6f742070617573656400000000000000000000000081529150614b49565b60208082528101610d7c816152ec565b600061533c8285614be6565b60148201915061534c8284614be6565b5060140192915050565b60006153628288614be6565b6014820191506153728287614bf7565b6020820191506153828286614bf7565b6020820191506153928285614bf7565b6020820191506153a28284614bf7565b5060200195945050505050565b8051610d7c81614536565b6000602082840312156153cf576153cf600080fd5b600061443884846153af565b602e81526000602082017f45524331393637557067726164653a206e657720696d706c656d656e7461746981527f6f6e206973206e6f74205555505300000000000000000000000000000000000060208201529150614dd0565b60208082528101610d7c816153db565b602981526000602082017f45524331393637557067726164653a20756e737570706f727465642070726f788152681a58589b195555525160ba1b60208201529150614dd0565b60208082528101610d7c81615445565b60008160001904831182151516156154b5576154b5614b60565b500290565b602e81526000602082017f496e697469616c697a61626c653a20636f6e747261637420697320616c72656181527f647920696e697469616c697a656400000000000000000000000000000000000060208201529150614dd0565b60208082528101610d7c816154ba565b602b81526000602082017f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206981526a6e697469616c697a696e6760a81b60208201529150614dd0565b60208082528101610d7c81615524565b6080808252810161558d8187614a86565b905081810360208301526155a18186614a86565b90506155b060408301856143e7565b6143a5606083018461493e565b634e487b7160e01b600052603160045260246000fd5b602d81526000602082017f455243313936373a206e657720696d706c656d656e746174696f6e206973206e81526c1bdd08184818dbdb9d1c9858dd609a1b60208201529150614dd0565b60208082528101610d7c816155d3565b602681526000602082017f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f8152651b9d1c9858dd60d21b60208201529150614dd0565b60208082528101610d7c8161562d565b60005b8381101561569b578181015183820152602001615683565b838111156141615750506000910152565b60006156b6825190565b6156c4818560208601615680565b9290920192915050565b600061304582846156ac565b60006156e4825190565b8084526020840193506156fb818560208601615680565b601f01601f19169290920192915050565b6020808252810161304581846156da56fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204085cc7cecfabd39e6879c9fdf5afc8eaa0058a0c133e0925000f98d40da8a5e64736f6c634300080b0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.