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
Contract Name:
HoneyFarmQueenDeluxe
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "../interfaces/BearsDeluxeI.sol"; import "../interfaces/HoneyTokenI.sol"; import "../interfaces/BeesDeluxeI.sol"; import "../interfaces/HoneyHiveDeluxeI.sol"; contract HoneyFarmQueenDeluxe is OwnableUpgradeable, ReentrancyGuardUpgradeable { uint32 public constant HONEY_BEARS_REWARDS_PER_ROUND = 100; //this is 1 uint32 public constant HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH = 13; //this is 0.13 uint32 public constant HONEY_STAKED_BEE_REWARDS_PER_EPOCH = 9; //this is 0.09 uint8 public constant MAX_USAGE_PER_HIVE = 3; uint32 public constant REWARD_FOR_BURNING_BEE = 1200; //this is 12 uint32 public constant BURN_AMOUNT_FOR_STAKING_BEE = 700; //this is 7 uint32 public constant MIN_AMOUNT_FOR_ACTIVATE_BEE = 700; //this is 7 uint32 public constant AMOUNT_TO_KEEP_ACTIVE = 23; //this is 0.23 uint256 public constant MIN_BURN_AMOUNT_FOR_CLAIMING_BEE = 2300; //this is 23 uint256 public constant AMOUNT_FOR_ACTIVATE_HIVE = 6900; //this is 69 // solhint-disable-next-line uint16 public EPOCHS_BEFORE_INACTIVE_BEE; //number of epochs that a bee can claim honey before becoming inactive uint16 private lowestBeeId; //Used to keep track of how many were minted so far because bees can be burnt uint16 public totalMintedBees; uint256 public EPOCH_LENGTH; uint256 public HIVE_CLAIM_EPOCH_LENGTH; uint256 public STARTING_POINT; BearsDeluxeI public bears; HoneyTokenI public honey; HoneyHiveDeluxeI public hive; BeesDeluxeI public bees; Pause public paused; mapping(uint16 => uint256) private lastRewardOfHoneyPerBears; mapping(uint16 => uint256) private lastTimeClaimedBeePerHive; mapping(uint16 => Bee) private idsAndBees; struct Bee { uint256 id; uint8 active; //used to know how many epochs this bee can claim honey before becoming inactive. //in case it gets inactive, user must burn honey. //in case bee is staked, claim counter does not matter uint16 epochsLeft; uint8 staked; uint256 becameInactiveTime; //last time a bee claimed honey uint256 lastRewardTime; //last time a bee was fed (burnt honey to activate) uint256 lastTimeFed; } struct Pause { uint8 pauseBee; uint8 pauseHive; uint8 pauseBears; } /***********Events**************/ event HoneyClaimed(address indexed _to, uint256 _amount); event HoneyHiveClaimed(address indexed _to, uint256 _amount); event BeeClaimed(address indexed _to, uint256 _amount); event HiveActivated(address indexed _owner, uint256 indexed _hiveId); event BeeActivated(address indexed _owner, uint256 indexed _beeId); event BeeKeptActive(address indexed _owner, uint256 indexed _beeId); event BeeBurnt(address indexed _owner, uint256 indexed _beeId); event BeeStaked(address indexed _owner, uint256 indexed _beeId); event BeeUnstaked(address indexed _owner, uint256 indexed _beeId); event StartingPointChanged(uint256 startingPoint); event SetContract(string indexed _contract, address _target); event EpochChange(string indexed epochType, uint256 _newValue); event PauseChanged(uint8 _pauseBears, uint8 _pauseHives, uint8 _pauseBees); function initialize() public initializer { __Ownable_init(); __ReentrancyGuard_init(); EPOCHS_BEFORE_INACTIVE_BEE = 10; //number of rounds that a bee can claim honey before becoming inactive // solhint-disable-next-line // we set it to 2^16 = 65,536 as bees max supply is 20700 so the first id that is generated, will be lower than this lowestBeeId = type(uint16).max; EPOCH_LENGTH = 86400; //one day HIVE_CLAIM_EPOCH_LENGTH = 86400; //one day STARTING_POINT = 1635005744; } /***********External**************/ /** * @dev claiming honey by owning a bear */ function claimBearsHoney(uint16[] calldata _bearsIds) external nonReentrant { require(STARTING_POINT < block.timestamp, "Rewards didn't start"); require(paused.pauseBears == 0, "Paused"); uint256 amount; for (uint16 i = 0; i < _bearsIds.length; i++) { uint16 id = _bearsIds[i]; //if not owner of the token then no rewards, usecase when someone tries to get rewards for //a token that isn't his or when he tries to get the rewards for an old token if (!bears.exists(id)) continue; if (bears.ownerOf(id) != msg.sender) continue; uint256 epochsToReward; uint256 lastReward = lastRewardOfHoneyPerBears[id]; if (lastReward > 0 && lastReward > STARTING_POINT) { // solhint-disable-next-line //we get whole numbers for example if someone claims after 1 round and a half, he should be rewarded for 1 round. epochsToReward = (block.timestamp - lastReward) / EPOCH_LENGTH; } else { // if no rewards claimed so far, then he gets rewards from when the rewards started. epochsToReward = (block.timestamp - STARTING_POINT) / EPOCH_LENGTH; } //accumulating honey to mint amount += HONEY_BEARS_REWARDS_PER_ROUND * epochsToReward; lastRewardOfHoneyPerBears[id] = block.timestamp; } require(amount > 0, "Nothing to claim"); amount = amount * 1e16; //can not mint more than maxSupply if (honey.totalSupply() + amount > honey.maxSupply()) { amount = (honey.maxSupply() - honey.totalSupply()); } honey.mint(msg.sender, amount); emit HoneyClaimed(msg.sender, amount); } /** * @dev claiming honey by owning a bee */ // solhint-disable-next-line function claimBeesHoney(uint16[] calldata _beesIds) external nonReentrant { require(STARTING_POINT < block.timestamp, "Rewards didn't start"); require(paused.pauseBee == 0, "Paused"); uint256 amount = 0; for (uint16 i = 0; i < _beesIds.length; i++) { uint16 id = _beesIds[i]; if (!bees.exists(id)) continue; if (bees.ownerOf(id) != msg.sender) continue; Bee storage bee = idsAndBees[id]; if (bee.id == 0 || bee.active == 0) continue; uint256 lastReward = bee.lastRewardTime; uint256 epochsToReward = 0; if (bee.staked == 0) { if (bee.lastTimeFed == 0) { bee.lastTimeFed = lastReward; } uint256 cutoff = lastReward + (bee.epochsLeft * EPOCH_LENGTH); if (block.timestamp >= cutoff) { uint256 _e = cutoff - lastReward; epochsToReward = _e / EPOCH_LENGTH; amount += HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH * epochsToReward; bee.active = 0; bee.epochsLeft = 0; bee.becameInactiveTime = block.timestamp; } else { epochsToReward = ((block.timestamp - lastReward) / EPOCH_LENGTH); amount += HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH * epochsToReward; bee.epochsLeft -= uint16(epochsToReward); } } else if (bee.staked == 1) { // solhint-disable-next-line //we get whole numbers for example if someone claims after 1 round and a half, he should be rewarded for 1 round. amount += HONEY_STAKED_BEE_REWARDS_PER_EPOCH * ((block.timestamp - lastReward) / EPOCH_LENGTH); } bee.lastRewardTime = block.timestamp; } require(amount > 0, "Nothing to claim"); amount = amount * 1e16; //can not mint more than maxSupply if (honey.totalSupply() + amount > honey.maxSupply()) { amount = (honey.maxSupply() - honey.totalSupply()); } honey.mint(msg.sender, amount); emit HoneyClaimed(msg.sender, amount); } /** * @dev mints a Honey Hive by having a bear. You need to be the holder of the bear. */ function mintHive(uint16 _bearsId) external nonReentrant { require(paused.pauseHive == 0, "Paused"); require(msg.sender != address(0), "Can not mint to address 0"); hive.mint(msg.sender, _bearsId); emit HoneyHiveClaimed(msg.sender, _bearsId); } /** * @dev mints a Bee by having a hive. You need to be the holder of the hive. */ function mintBee(uint16 _hiveId) external nonReentrant { require(paused.pauseBee == 0, "Paused"); require(msg.sender != address(0), "Can not mint to address 0"); require(hive.ownerOf(_hiveId) == msg.sender, "No Hive owned"); require(honey.balanceOf(msg.sender) >= MIN_BURN_AMOUNT_FOR_CLAIMING_BEE * 1e16, "Not enough Honey"); require(lastTimeClaimedBeePerHive[_hiveId] < block.timestamp - HIVE_CLAIM_EPOCH_LENGTH, "Mint bee cooldown"); uint16 beeId = randBeeId(); require(beeId > 0, "Mint failed"); lastTimeClaimedBeePerHive[_hiveId] = block.timestamp; idsAndBees[beeId] = Bee(beeId, 1, EPOCHS_BEFORE_INACTIVE_BEE, 0, 0, block.timestamp, block.timestamp); totalMintedBees++; hive.increaseUsageOfMintingBee(_hiveId); honey.burn(msg.sender, MIN_BURN_AMOUNT_FOR_CLAIMING_BEE * 1e16); bees.mint(msg.sender, beeId); emit BeeClaimed(msg.sender, beeId); } /** * @dev after MAX_USAGE_PER_HIVE, a hive becomes inactive so it needs to be activated so we can mint more Bees */ function activateHive(uint16 _hiveId) external nonReentrant { require(paused.pauseHive == 0, "Paused"); require(hive.ownerOf(_hiveId) == msg.sender, "Not your hive"); require(hive.getUsageOfMintingBee(_hiveId) >= MAX_USAGE_PER_HIVE, "Cap not reached"); require(honey.balanceOf(msg.sender) >= AMOUNT_FOR_ACTIVATE_HIVE * 1e16, "Not enough Honey"); honey.burn(msg.sender, AMOUNT_FOR_ACTIVATE_HIVE * 1e16); hive.resetUsageOfMintingBee(_hiveId); emit HiveActivated(msg.sender, _hiveId); } /** * @dev Exactly like in real world, bees become hungry for honey so, * after EPOCHS_BEFORE_INACTIVE_BEE epochs a bee needs * to be fed to become active again and start collecting Honey * Corresponds with Revive Bees */ function activateBees(uint16[] calldata _beesIds) external nonReentrant { require(paused.pauseBee == 0, "Paused"); uint256 amountOfHoney = 0; for (uint16 i = 0; i < _beesIds.length; i++) { uint16 _beeId = _beesIds[i]; Bee storage bee = idsAndBees[_beeId]; if (bee.id == 0) continue; if (bees.ownerOf(_beeId) != msg.sender) continue; /** * when we activate a bee we do the following: * - we set active = 1 (meaning true) * - reset epochsLeft to MIN_USAGE_PER_BEE which is the max claiming before it becomes inactive * - set reward time as now so in case bee is staked, to not claim before this * because on staking, we ignore the claim counter * - we set lastTimeFed for UI */ amountOfHoney += MIN_AMOUNT_FOR_ACTIVATE_BEE; bee.active = 1; bee.epochsLeft = EPOCHS_BEFORE_INACTIVE_BEE; bee.lastRewardTime = block.timestamp; bee.lastTimeFed = block.timestamp; emit BeeActivated(msg.sender, _beeId); } require(amountOfHoney > 0, "Nothing to activate"); amountOfHoney = amountOfHoney * 1e16; require(honey.balanceOf(msg.sender) >= amountOfHoney, "Not enough honey"); honey.burn(msg.sender, amountOfHoney); } /** * @dev If you want your bee to not become inactive and burn more Honey to fed it, you can * use this function to keep an Active bee, Active. Once this is called, * Honey will be burnt and bee can claim Honey again for EPOCHS_BEFORE_INACTIVE_BEE. * Corresponds with Feed Bees */ // solhint-disable-next-line function keepBeesActive(uint16[] calldata _beesIds) external nonReentrant { require(paused.pauseBee == 0, "Paused"); uint256 amountOfHoney = 0; for (uint16 i = 0; i < _beesIds.length; i++) { uint16 _beeId = _beesIds[i]; Bee storage bee = idsAndBees[_beeId]; if (bee.id == 0) continue; if (bees.ownerOf(_beeId) != msg.sender) continue; if (bee.staked == 1) continue; //this bee can not be kept active as it is inactive already, need to burn 7 honey if (bee.active == 0) continue; uint256 epochsLeft = bee.epochsLeft; // only add rewards if user has fed bee within time limit if (block.timestamp > bee.lastRewardTime + (epochsLeft * EPOCH_LENGTH)) continue; // get the number of times over they are feeding. uint256 honeyCostMultiplier = epochsLeft / EPOCHS_BEFORE_INACTIVE_BEE; // if there are some left overs epochs then we add 1 to the multiplier if (epochsLeft % EPOCHS_BEFORE_INACTIVE_BEE > 0) honeyCostMultiplier += 1; // amount increases depending on how "in advance" msg.sender wants to keep his bee active amountOfHoney += (AMOUNT_TO_KEEP_ACTIVE * honeyCostMultiplier); epochsLeft += EPOCHS_BEFORE_INACTIVE_BEE; if (epochsLeft == EPOCHS_BEFORE_INACTIVE_BEE) { bee.lastTimeFed = block.timestamp; } bee.epochsLeft = uint16(epochsLeft); emit BeeKeptActive(msg.sender, _beeId); } require(amountOfHoney > 0, "Nothing to keep active"); amountOfHoney = amountOfHoney * 1e16; require(honey.balanceOf(msg.sender) >= amountOfHoney, "Not enough honey"); honey.burn(msg.sender, amountOfHoney); } /** * @dev In case you got bored of one of your Bee, or it got too old, you can burn it and receive Honey */ function burnBees(uint16[] calldata _beesIds) external nonReentrant { require(paused.pauseBee == 0, "Paused"); uint256 amountOfHoney = 0; for (uint16 i = 0; i < _beesIds.length; i++) { uint16 _beeId = _beesIds[i]; //in case a bee is burnt from BeesDeluxe contract, should neved happen. if (bees.ownerOf(_beeId) == address(0)) { delete idsAndBees[_beeId]; return; } if (bees.ownerOf(_beeId) != msg.sender) continue; delete idsAndBees[_beeId]; amountOfHoney += REWARD_FOR_BURNING_BEE; bees.burnByQueen(_beeId); emit BeeBurnt(msg.sender, _beeId); } amountOfHoney = amountOfHoney * 1e16; require(amountOfHoney > 0, "Nothing to burn"); require(honey.totalSupply() + amountOfHoney <= honey.maxSupply(), "Honey cap reached"); honey.mint(msg.sender, amountOfHoney); } /** * @dev In case you are a long term player, you can stake your Bee to avoid the bee being inactivated. * Of course this comes with a downside, the amount of Honey you can claim, shrinks * Corresponds with Put Bees to Work */ function stakeBees(uint16[] calldata _beesIds) external nonReentrant { require(paused.pauseBee == 0, "Paused"); uint256 amountOfHoney = 0; for (uint16 i = 0; i < _beesIds.length; i++) { uint16 _beeId = _beesIds[i]; Bee storage bee = idsAndBees[_beeId]; if (bee.id == 0) continue; if (bee.active == 0) continue; if (bee.staked == 1) continue; if (bees.ownerOf(_beeId) != msg.sender) continue; uint256 cutoff = bee.lastRewardTime + (bee.epochsLeft * EPOCH_LENGTH); if (block.timestamp >= cutoff) continue; amountOfHoney += BURN_AMOUNT_FOR_STAKING_BEE; bee.staked = 1; emit BeeStaked(msg.sender, _beeId); } require(amountOfHoney > 0, "Nothing to stake"); amountOfHoney = amountOfHoney * 1e16; require(honey.balanceOf(msg.sender) >= amountOfHoney, "Not enough honey"); if (amountOfHoney > 0) honey.burn(msg.sender, amountOfHoney); } /** * @dev You got enough of your staked bee, you can unstake it to get back to the normal rewards but also * with the possibility to get inactivated * Corresponds with Stop Work */ function unstakeBees(uint16[] calldata _beesIds) external nonReentrant { require(paused.pauseBee == 0, "Paused"); for (uint16 i = 0; i < _beesIds.length; i++) { uint16 _beeId = _beesIds[i]; Bee storage bee = idsAndBees[_beeId]; if (bee.id == 0) continue; if (bee.staked == 0) continue; if (bees.ownerOf(_beeId) != msg.sender) continue; bee.staked = 0; bee.lastTimeFed = block.timestamp; emit BeeUnstaked(msg.sender, _beeId); } } /***********Internal**************/ // solhint-disable-next-line function randBeeId() internal returns (uint16 _id) { uint16 entropy; uint16 maxSupply = uint16(bees.getMaxSupply()); require(totalMintedBees < maxSupply, "MAX_SUPPLY reached"); while (true) { uint16 rand = uint16( uint256( keccak256( abi.encodePacked( msg.sender, block.difficulty, block.timestamp, block.number, totalMintedBees, entropy ) ) ) ); _id = rand % maxSupply; entropy++; if (_id == 0) _id = maxSupply; if (idsAndBees[_id].id == 0) { if (_id < lowestBeeId) lowestBeeId = _id; return _id; } if (entropy > 2) { bool wentOverOnce; while (idsAndBees[lowestBeeId].id > 0) { lowestBeeId++; if (lowestBeeId == maxSupply) { if (wentOverOnce) return 0; wentOverOnce = true; lowestBeeId = 1; } } _id = lowestBeeId; return _id; } } } /***********Views**************/ /** * @dev Get a time when the Bear was last rewarded with honey */ function getLastRewardedByBear(uint16 _bearId) external view returns (uint256) { return lastRewardOfHoneyPerBears[_bearId]; } /** * @dev Get a time when the Bee was last rewarded with honey */ function getLastRewardedByBee(uint16 _beeId) external view returns (uint256) { return idsAndBees[_beeId].lastRewardTime; } /** * @dev Get the whole state of the bee */ function getBeeState(uint16 _beeId) external view returns (Bee memory) { return idsAndBees[_beeId]; } /** * @dev Get last time you claimed a bee */ function getLastTimeBeeClaimed(uint16 _hiveId) external view returns (uint256) { return lastTimeClaimedBeePerHive[_hiveId]; } /** * @dev Get states of multiple Bees */ function getBeesState(uint16[] calldata _beesIds) external view returns (Bee[] memory beesToReturn) { beesToReturn = new Bee[](_beesIds.length); for (uint16 i = 0; i < _beesIds.length; i++) { beesToReturn[i] = idsAndBees[_beesIds[i]]; } return beesToReturn; } /** * @dev Get total unclaimed Honey for a holder */ function getUnclaimedHoneyForBears(address _owner) external view returns (uint256 amount) { uint256[] memory bearsIds = bears.tokensOfOwner(_owner); for (uint16 i = 0; i < bearsIds.length; i++) { uint16 id = uint16(bearsIds[i]); //if not owner of the token then no rewards, usecase when someone tries to get rewards for //a token that isn't his or when he tries to get the rewards for an old token if (!bears.exists(id)) continue; if (bears.ownerOf(id) != _owner) continue; uint256 epochsToReward; uint256 lastReward = lastRewardOfHoneyPerBears[id]; if (lastReward > 0 && lastReward > STARTING_POINT) { // solhint-disable-next-line //we get whole numbers for example if someone claims after 1 round and a half, he should be rewarded for 1 round. epochsToReward = (block.timestamp - lastReward) / EPOCH_LENGTH; } else { if (block.timestamp < STARTING_POINT) //if the starting point it's in the future then return 0 epochsToReward = 0; // if no rewards claimed so far, then he gets rewards from when the rewards started. else epochsToReward = (block.timestamp - STARTING_POINT) / EPOCH_LENGTH; } //accumulating honey to mint amount += HONEY_BEARS_REWARDS_PER_ROUND * epochsToReward; } amount = amount * 1e16; } /** * @dev Get total unclaimed Honey for a holder */ // solhint-disable-next-line function getUnclaimedHoneyForBees(address _owner) external view returns (uint256 amount) { uint256[] memory beesIds = bees.tokensOfOwner(_owner); for (uint16 i = 0; i < beesIds.length; i++) { uint16 id = uint16(beesIds[i]); if (!bees.exists(id)) continue; if (bees.ownerOf(id) != _owner) continue; Bee storage bee = idsAndBees[id]; if (bee.id == 0 || bee.active == 0) continue; uint256 lastReward = bee.lastRewardTime; uint256 epochsToReward = 0; if (bee.staked == 0) { uint256 timeLeft = bee.epochsLeft * EPOCH_LENGTH; uint256 cutoff = lastReward + timeLeft; if (block.timestamp >= cutoff) { epochsToReward = timeLeft / EPOCH_LENGTH; amount += HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH * epochsToReward; } else { epochsToReward = ((block.timestamp - lastReward) / EPOCH_LENGTH); amount += HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH * epochsToReward; } } else if (bee.staked == 1) { // solhint-disable-next-line //we get whole numbers for example if someone claims after 1 round and a half, he should be rewarded for 1 round. amount += HONEY_STAKED_BEE_REWARDS_PER_EPOCH * ((block.timestamp - lastReward) / EPOCH_LENGTH); } } amount = amount * 1e16; } /** * @dev Checking if a bee is able to be staked, meaning that if the epochsLeft is less than block.timestamp * then you have to claim first then call the activateBee then stake */ function isBeePossibleToStake(uint16 _beeId) external view returns (bool) { Bee storage bee = idsAndBees[_beeId]; return block.timestamp >= bee.lastRewardTime + (bee.epochsLeft * EPOCH_LENGTH); } /***********Settes & Getters**************/ function setBears(address _contract) external onlyOwner { require(_contract != address(0), "Can not be address 0"); bears = BearsDeluxeI(_contract); emit SetContract("BearsDeluxe", _contract); } function setHoney(address _contract) external onlyOwner { require(_contract != address(0), "Can not be address 0"); honey = HoneyTokenI(_contract); emit SetContract("HoneyToken", _contract); } function setHive(address _contract) external onlyOwner { require(_contract != address(0), "Can not be address 0"); hive = HoneyHiveDeluxeI(_contract); emit SetContract("HoneyHive", _contract); } function setBees(address _contract) external onlyOwner { require(_contract != address(0), "Can not be address 0"); bees = BeesDeluxeI(_contract); emit SetContract("BeesDeluxe", _contract); } function setInitialStartingPoint(uint256 _startingPoint) external onlyOwner { STARTING_POINT = _startingPoint; emit StartingPointChanged(_startingPoint); } function getInitialStartingPoint() external view returns (uint256) { return STARTING_POINT; } function setHoneyEpochLength(uint256 _epochLength) external onlyOwner { EPOCH_LENGTH = _epochLength; emit EpochChange("HoneyEpochLength", _epochLength); } function setHiveClaimEpochLength(uint256 _epochLength) external onlyOwner { HIVE_CLAIM_EPOCH_LENGTH = _epochLength; emit EpochChange("HiveEpochLength", _epochLength); } function setNoOfEpochsBeforeInactiveBee(uint16 _epochs) external onlyOwner { EPOCHS_BEFORE_INACTIVE_BEE = _epochs; emit EpochChange("NoOfEpochBeforeInactiveBee", _epochs); } /** * @dev Sets the activitiy of the Bears/Bee/Hive as paused or not, only use in case of emergency. * 1 = Paused * 0 = Active */ function setPauseState( uint8 _pauseBears, uint8 _pauseHives, uint8 _pauseBees ) external onlyOwner { paused.pauseBears = _pauseBears; paused.pauseHive = _pauseHives; paused.pauseBee = _pauseBees; emit PauseChanged(_pauseBears, _pauseHives, _pauseBees); } }
// SPDX-License-Identifier: MIT 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 initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT 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 initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _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 make 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; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; abstract contract BearsDeluxeI is Ownable, IERC721 { function mint(address _owner, uint256 _tokenId) external virtual; function exists(uint256 _tokenId) external view virtual returns (bool); function getMaxSupply() external virtual returns (uint256); function tokensOfOwner(address _owner) external view virtual returns (uint256[] memory); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; abstract contract HoneyTokenI is Ownable, IERC20 { function mint(address _owner, uint256 _amount) external virtual; function burn(address _owner, uint256 _amount) external virtual; function maxSupply() external pure virtual returns (uint256); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; abstract contract BeesDeluxeI is Ownable, IERC721, IERC721Enumerable { function mint(address _owner, uint256 _tokenId) external virtual; function exists(uint256 _tokenId) external view virtual returns (bool); function getMaxSupply() external view virtual returns (uint256); function tokensOfOwner(address _owner) external view virtual returns (uint256[] memory); function totalSupply() public view virtual returns (uint256); function burnByQueen(uint256 _tokenId) external virtual; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; abstract contract HoneyHiveDeluxeI is Ownable, IERC721 { function mint(address _owner, uint256 _bearId) external virtual; function exists(uint256 _tokenId) external view virtual returns (bool); function getMaxSupply() external virtual returns (uint256); function increaseUsageOfMintingBee(uint256 _hiveId) external virtual; function getUsageOfMintingBee(uint256 _hiveId) external view virtual returns (uint8); function resetUsageOfMintingBee(uint256 _hiveId) external virtual; function tokensOfOwner(address _owner) external view virtual returns (uint256[] memory); function totalSupply() public view virtual returns (uint256); }
// SPDX-License-Identifier: MIT 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 initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 a proxied contract can't have 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. * * 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. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.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 Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
{ "metadata": { "bytecodeHash": "none", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_beeId","type":"uint256"}],"name":"BeeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_beeId","type":"uint256"}],"name":"BeeBurnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"BeeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_beeId","type":"uint256"}],"name":"BeeKeptActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_beeId","type":"uint256"}],"name":"BeeStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_beeId","type":"uint256"}],"name":"BeeUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"epochType","type":"string"},{"indexed":false,"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"EpochChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_hiveId","type":"uint256"}],"name":"HiveActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"HoneyClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"HoneyHiveClaimed","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":"uint8","name":"_pauseBears","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"_pauseHives","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"_pauseBees","type":"uint8"}],"name":"PauseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"_contract","type":"string"},{"indexed":false,"internalType":"address","name":"_target","type":"address"}],"name":"SetContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startingPoint","type":"uint256"}],"name":"StartingPointChanged","type":"event"},{"inputs":[],"name":"AMOUNT_FOR_ACTIVATE_HIVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AMOUNT_TO_KEEP_ACTIVE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_AMOUNT_FOR_STAKING_BEE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EPOCHS_BEFORE_INACTIVE_BEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EPOCH_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HIVE_CLAIM_EPOCH_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HONEY_BEARS_REWARDS_PER_ROUND","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HONEY_STAKED_BEE_REWARDS_PER_EPOCH","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_USAGE_PER_HIVE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_AMOUNT_FOR_ACTIVATE_BEE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BURN_AMOUNT_FOR_CLAIMING_BEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_FOR_BURNING_BEE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTING_POINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_beesIds","type":"uint16[]"}],"name":"activateBees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_hiveId","type":"uint16"}],"name":"activateHive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bears","outputs":[{"internalType":"contract BearsDeluxeI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bees","outputs":[{"internalType":"contract BeesDeluxeI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_beesIds","type":"uint16[]"}],"name":"burnBees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_bearsIds","type":"uint16[]"}],"name":"claimBearsHoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_beesIds","type":"uint16[]"}],"name":"claimBeesHoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_beeId","type":"uint16"}],"name":"getBeeState","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"active","type":"uint8"},{"internalType":"uint16","name":"epochsLeft","type":"uint16"},{"internalType":"uint8","name":"staked","type":"uint8"},{"internalType":"uint256","name":"becameInactiveTime","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"lastTimeFed","type":"uint256"}],"internalType":"struct HoneyFarmQueenDeluxe.Bee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_beesIds","type":"uint16[]"}],"name":"getBeesState","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"active","type":"uint8"},{"internalType":"uint16","name":"epochsLeft","type":"uint16"},{"internalType":"uint8","name":"staked","type":"uint8"},{"internalType":"uint256","name":"becameInactiveTime","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"lastTimeFed","type":"uint256"}],"internalType":"struct HoneyFarmQueenDeluxe.Bee[]","name":"beesToReturn","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInitialStartingPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_bearId","type":"uint16"}],"name":"getLastRewardedByBear","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_beeId","type":"uint16"}],"name":"getLastRewardedByBee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_hiveId","type":"uint16"}],"name":"getLastTimeBeeClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getUnclaimedHoneyForBears","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getUnclaimedHoneyForBees","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hive","outputs":[{"internalType":"contract HoneyHiveDeluxeI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"honey","outputs":[{"internalType":"contract HoneyTokenI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_beeId","type":"uint16"}],"name":"isBeePossibleToStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_beesIds","type":"uint16[]"}],"name":"keepBeesActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_hiveId","type":"uint16"}],"name":"mintBee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_bearsId","type":"uint16"}],"name":"mintHive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint8","name":"pauseBee","type":"uint8"},{"internalType":"uint8","name":"pauseHive","type":"uint8"},{"internalType":"uint8","name":"pauseBears","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setBears","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setBees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setHive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_epochLength","type":"uint256"}],"name":"setHiveClaimEpochLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setHoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_epochLength","type":"uint256"}],"name":"setHoneyEpochLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startingPoint","type":"uint256"}],"name":"setInitialStartingPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_epochs","type":"uint16"}],"name":"setNoOfEpochsBeforeInactiveBee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pauseBears","type":"uint8"},{"internalType":"uint8","name":"_pauseHives","type":"uint8"},{"internalType":"uint8","name":"_pauseBees","type":"uint8"}],"name":"setPauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_beesIds","type":"uint16[]"}],"name":"stakeBees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalMintedBees","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_beesIds","type":"uint16[]"}],"name":"unstakeBees","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506143ae806100206000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c8063723f03a81161019d578063a81dc1fd116100e9578063e2716580116100a2578063f2fde38b1161007c578063f2fde38b146106ee578063f3f526cc14610701578063f6bf10d414610714578063f6c3c0451461072757600080fd5b8063e2716580146106a4578063ecee6f41146106c8578063f103e57b146106db57600080fd5b8063a81dc1fd14610652578063a88e9aa314610665578063ac4746ab1461066d578063af8cb76214610676578063be97d93b14610689578063d3a5be491461069157600080fd5b80638a74970e116101565780638da5cb5b116101305780638da5cb5b1461062657806393b386a8146103f157806399b26d3f146106375780639a0169351461064a57600080fd5b80638a74970e146105cf5780638ae6df38146105e25780638c4132c81461060657600080fd5b8063723f03a81461057e57806374a2ad1b146105915780638129fc1c146105a457806384ca9626146105ac57806384d5e6dc146105bf57806385483e96146105c757600080fd5b806346e3a8691161025c5780635ac8ff921161021557806360ff9eab116101ef57806360ff9eab1461054757806365c238c81461055a5780636d4643a51461056d578063715018a61461057657600080fd5b80635ac8ff92146104cc5780635c975abb146104f55780635ee82ace1461053957600080fd5b806346e3a8691461044357806349a9ba311461045657806349cf26c0146104695780634e2b2e33146104725780634e67d9fb1461049957806358b0bb12146104b957600080fd5b806333c437c9116102c95780633ea52061116102a35780633ea52061146103f1578063420ee584146103fa5780634218156f1461040d578063464718241461042057600080fd5b806333c437c91461039557806335387e44146103c057806336b2c4b2146103de57600080fd5b806305499329146103115780630af65929146103265780630c939a8014610345578063217ba7901461035c57806321c024c91461036f57806332e4c99014610382575b600080fd5b61032461031f366004613e4a565b610730565b005b61032e600381565b60405160ff90911681526020015b60405180910390f35b61034e611af481565b60405190815260200161033c565b61032461036a366004613e72565b6107c2565b61032461037d366004613ebd565b61086a565b610324610390366004613ee1565b610c2e565b609d546103a8906001600160a01b031681565b6040516001600160a01b03909116815260200161033c565b6103c96104b081565b60405163ffffffff909116815260200161033c565b609c546103a8906001600160a01b031681565b6103c96102bc81565b610324610408366004613ee1565b610fd2565b61032461041b366004613ee1565b6113b5565b61043361042e366004613ebd565b6115c6565b604051901515815260200161033c565b610324610451366004613ebd565b61160f565b609b546103a8906001600160a01b031681565b61034e60995481565b61034e610480366004613ebd565b61ffff16600090815260a2602052604090206003015490565b6104ac6104a7366004613ee1565b611b64565b60405161033c9190613fa4565b61034e6104c7366004614007565b611caa565b6097546104e290640100000000900461ffff1681565b60405161ffff909116815260200161033c565b609f546105159060ff808216916101008104821691620100009091041683565b6040805160ff9485168152928416602084015292169181019190915260600161033c565b6097546104e29061ffff1681565b610324610555366004614007565b611f40565b610324610568366004613ebd565b612002565b61034e609a5481565b610324612143565b61032461058c366004613ee1565b612179565b61032461059f366004613ee1565b61283d565b6103246129f1565b6103246105ba366004613e4a565b612a94565b609a5461034e565b6103c9600d81565b6103246105dd366004614007565b612ae4565b61034e6105f0366004613ebd565b61ffff16600090815260a0602052604090205490565b610619610614366004613ebd565b612b6b565b60405161033c9190614024565b6033546001600160a01b03166103a8565b61034e610645366004614007565b612be8565b6103c9606481565b610324610660366004613e4a565b612f01565b6103c9600981565b61034e60985481565b610324610684366004614007565b612f66565b6103c9601781565b61032461069f366004613ee1565b612fec565b61034e6106b2366004613ebd565b61ffff16600090815260a1602052604090205490565b6103246106d6366004613ebd565b6134a7565b6103246106e9366004614007565b613546565b6103246106fc366004614007565b6135cb565b61032461070f366004613ee1565b613663565b609e546103a8906001600160a01b031681565b61034e6108fc81565b6033546001600160a01b031633146107635760405162461bcd60e51b815260040161075a90614032565b60405180910390fd5b60998190556040516e090d2ecca8ae0dec6d098cadccee8d608b1b8152600f015b604051908190038120828252907f8900c724b8277bf649404278b740479df79c4d47d3c867e02c2fb2702e6f74c2906020015b60405180910390a250565b6033546001600160a01b031633146107ec5760405162461bcd60e51b815260040161075a90614032565b609f805462ffff0019166201000060ff86811691820261ff001916929092176101008684169081029190911760ff1916928516928317909355604080519182526020820193909352918201527f6f745a4eb556eef343d02d576c54dfd149a44d81e295a919ce0ede3d3c1eef3e9060600160405180910390a1505050565b6002606554141561088d5760405162461bcd60e51b815260040161075a90614067565b6002606555609f54610100900460ff16156108ba5760405162461bcd60e51b815260040161075a9061409e565b609d546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561090157600080fd5b505afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093991906140be565b6001600160a01b03161461097f5760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420796f7572206869766560981b604482015260640161075a565b609d5460405163ae953d8960e01b815261ffff831660048201526003916001600160a01b03169063ae953d899060240160206040518083038186803b1580156109c757600080fd5b505afa1580156109db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ff91906140db565b60ff161015610a425760405162461bcd60e51b815260206004820152600f60248201526e10d85c081b9bdd081c995858da1959608a1b604482015260640161075a565b610a55611af4662386f26fc1000061410e565b609c546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610a9857600080fd5b505afa158015610aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad0919061412d565b1015610b115760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820486f6e657960801b604482015260640161075a565b609c546001600160a01b0316639dc29fac33610b36611af4662386f26fc1000061410e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610b7c57600080fd5b505af1158015610b90573d6000803e3d6000fd5b5050609d54604051630b3e286360e11b815261ffff851660048201526001600160a01b03909116925063167c50c69150602401600060405180830381600087803b158015610bdd57600080fd5b505af1158015610bf1573d6000803e3d6000fd5b505060405161ffff841692503391507ff49897e9eea917a865792129274a2f6ee90255068c08d6e4d78701370d4d263d90600090a3506001606555565b60026065541415610c515760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff1615610c795760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff8116831115610e4657600084848361ffff16818110610ca157610ca1614146565b9050602002016020810190610cb69190613ebd565b61ffff8116600090815260a260205260409020805491925090610cda575050610e34565b600181015460ff16610ced575050610e34565b6001818101546301000000900460ff161415610d0a575050610e34565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b158015610d5157600080fd5b505afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8991906140be565b6001600160a01b031614610d9e575050610e34565b6098546001820154600091610dbb91610100900461ffff1661410e565b8260030154610dca919061415c565b9050804210610ddb57505050610e34565b610de76102bc8661415c565b60018301805463ff0000001916630100000017905560405190955061ffff84169033907f3a217120d9f10810399d7af913c94d3a3f1b5b82c1899990c5c399ea627ff35890600090a35050505b80610e3e81614174565b915050610c7d565b5060008111610e8a5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f207374616b6560801b604482015260640161075a565b610e9b81662386f26fc1000061410e565b609c546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b158015610ee357600080fd5b505afa158015610ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1b919061412d565b1015610f5c5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820686f6e657960801b604482015260640161075a565b8015610fc857609c54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac906044015b600060405180830381600087803b158015610faf57600080fd5b505af1158015610fc3573d6000803e3d6000fd5b505050505b5050600160655550565b60026065541415610ff55760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff161561101d5760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff811683111561126257600084848361ffff1681811061104557611045614146565b905060200201602081019061105a9190613ebd565b61ffff8116600090815260a26020526040902080549192509061107e575050611250565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b1580156110c557600080fd5b505afa1580156110d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fd91906140be565b6001600160a01b031614611112575050611250565b6001818101546301000000900460ff16141561112f575050611250565b600181015460ff16611142575050611250565b600181015460985461010090910461ffff169061115f908261410e565b826003015461116e919061415c565b42111561117d57505050611250565b6097546000906111919061ffff16836141ac565b6097549091506000906111a89061ffff16846141c0565b11156111bc576111b960018261415c565b90505b6111c781601761410e565b6111d1908761415c565b6097549096506111e59061ffff168361415c565b60975490925061ffff168214156111fd574260048401555b60018301805461ffff8085166101000262ffff0019909216919091179091556040519085169033907f0fdfd2278a82d89a285de1659c49e93d0371d707c27ecacda4f1bbf8f7db693590600090a3505050505b8061125a81614174565b915050611021565b50600081116112ac5760405162461bcd60e51b81526020600482015260166024820152754e6f7468696e6720746f206b6565702061637469766560501b604482015260640161075a565b6112bd81662386f26fc1000061410e565b609c546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b15801561130557600080fd5b505afa158015611319573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133d919061412d565b101561137e5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820686f6e657960801b604482015260640161075a565b609c54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401610f95565b600260655414156113d85760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff16156114005760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff811683111561157f57600084848361ffff1681811061142857611428614146565b905060200201602081019061143d9190613ebd565b61ffff8116600090815260a26020526040902080549192509061146157505061156d565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b1580156114a857600080fd5b505afa1580156114bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e091906140be565b6001600160a01b0316146114f557505061156d565b6115016102bc8561415c565b6001828101805460ff1981168317825560975462ffffff1990911661010061ffff928316021790921790554260038401819055600484015560405191955083169033907fc1d9120cbac78180337285e846163621e353501870b4e46763cd01d125bc5f0790600090a350505b8061157781614174565b915050611404565b50600081116112ac5760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20616374697661746560681b604482015260640161075a565b61ffff808216600090815260a2602052604081206098546001820154929391926115f6926101009091041661410e565b8160030154611605919061415c565b4210159392505050565b600260655414156116325760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff161561165a5760405162461bcd60e51b815260040161075a9061409e565b336116a35760405162461bcd60e51b8152602060048201526019602482015278043616e206e6f74206d696e7420746f2061646472657373203603c1b604482015260640161075a565b609d546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b1580156116ea57600080fd5b505afa1580156116fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172291906140be565b6001600160a01b0316146117685760405162461bcd60e51b815260206004820152600d60248201526c139bc8121a5d99481bdddb9959609a1b604482015260640161075a565b61177b6108fc662386f26fc1000061410e565b609c546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156117be57600080fd5b505afa1580156117d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f6919061412d565b10156118375760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820486f6e657960801b604482015260640161075a565b60995461184490426141d4565b61ffff8216600090815260a16020526040902054106118995760405162461bcd60e51b815260206004820152601160248201527026b4b73a103132b29031b7b7b63237bbb760791b604482015260640161075a565b60006118a36138fe565b905060008161ffff16116118e75760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0819985a5b195960aa1b604482015260640161075a565b61ffff808316600090815260a1602090815260408083204290819055815160e0810183528686168082526001828601818152609780548a16858801908152606086018a8152608087018b815260a0880189815260c08901998a52968c5260a2909a529790992094518555905191840180549851965160ff90811663010000000263ff00000019988c166101000262ffffff19909b1694909116939093179890981795909516179095559251600284015592516003830155915160049182015581546401000000009004909216916119bd83614174565b82546101009290920a61ffff818102199093169183160217909155609d5460405163617a881b60e01b815291851660048301526001600160a01b0316915063617a881b90602401600060405180830381600087803b158015611a1e57600080fd5b505af1158015611a32573d6000803e3d6000fd5b5050609c546001600160a01b03169150639dc29fac905033611a5d6108fc662386f26fc1000061410e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611aa357600080fd5b505af1158015611ab7573d6000803e3d6000fd5b5050609e546040516340c10f1960e01b815233600482015261ffff851660248201526001600160a01b0390911692506340c10f199150604401600060405180830381600087803b158015611b0a57600080fd5b505af1158015611b1e573d6000803e3d6000fd5b505060405161ffff841681523392507fa72b9f69ceff29b665f9add67b0f19138fd338f2e79ece3cdcd167943e531a58915060200160405180910390a250506001606555565b60608167ffffffffffffffff811115611b7f57611b7f6141eb565b604051908082528060200260200182016040528015611bb857816020015b611ba5613e03565b815260200190600190039081611b9d5790505b50905060005b61ffff8116831115611ca25760a2600085858461ffff16818110611be457611be4614146565b9050602002016020810190611bf99190613ebd565b61ffff90811682526020808301939093526040918201600020825160e08101845281548152600182015460ff8082169683019690965261010081048416948201949094526301000000909304909316606083015260028301546080830152600383015460a083015260049092015460c0820152835190918491908416908110611c8457611c84614146565b60200260200101819052508080611c9a90614174565b915050611bbe565b505b92915050565b609b54604051632118854760e21b81526001600160a01b0383811660048301526000928392911690638462151c9060240160006040518083038186803b158015611cf357600080fd5b505afa158015611d07573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2f9190810190614201565b905060005b81518161ffff161015611f27576000828261ffff1681518110611d5957611d59614146565b6020908102919091010151609b54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b158015611dac57600080fd5b505afa158015611dc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de491906142bf565b611dee5750611f15565b609b546040516331a9108f60e11b815261ffff831660048201526001600160a01b03878116921690636352211e9060240160206040518083038186803b158015611e3757600080fd5b505afa158015611e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6f91906140be565b6001600160a01b031614611e835750611f15565b61ffff8116600090815260a060205260408120548015801590611ea75750609a5481115b15611eca57609854611eb982426141d4565b611ec391906141ac565b9150611efa565b609a54421015611edd5760009150611efa565b609854609a54611eed90426141d4565b611ef791906141ac565b91505b611f0582606461410e565b611f0f908761415c565b95505050505b80611f1f81614174565b915050611d34565b50611f3982662386f26fc1000061410e565b9392505050565b6033546001600160a01b03163314611f6a5760405162461bcd60e51b815260040161075a90614032565b6001600160a01b038116611f905760405162461bcd60e51b815260040161075a906142e1565b609e80546001600160a01b0319166001600160a01b038316179055604051694265657344656c75786560b01b8152600a015b6040519081900381206001600160a01b0383168252907fbf2cc7083b32d1f5c82633af784e1285df86eb43c88d0752feea4bebb4a0b6d2906020016107b7565b600260655414156120255760405162461bcd60e51b815260040161075a90614067565b6002606555609f54610100900460ff16156120525760405162461bcd60e51b815260040161075a9061409e565b3361209b5760405162461bcd60e51b8152602060048201526019602482015278043616e206e6f74206d696e7420746f2061646472657373203603c1b604482015260640161075a565b609d546040516340c10f1960e01b815233600482015261ffff831660248201526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156120ea57600080fd5b505af11580156120fe573d6000803e3d6000fd5b505060405161ffff841681523392507ff6b907f000734a9a2ead9c2160cb1cc3ae13292659e4d5a5f9bb983d519474a3915060200160405180910390a2506001606555565b6033546001600160a01b0316331461216d5760405162461bcd60e51b815260040161075a90614032565b6121776000613b9d565b565b6002606554141561219c5760405162461bcd60e51b815260040161075a90614067565b6002606555609a5442116121e95760405162461bcd60e51b815260206004820152601460248201527314995dd85c991cc8191a591b89dd081cdd185c9d60621b604482015260640161075a565b609f5460ff161561220c5760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff811683111561251857600084848361ffff1681811061223457612234614146565b90506020020160208101906122499190613ebd565b609e54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b15801561229157600080fd5b505afa1580156122a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c991906142bf565b6122d35750612506565b609e546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561231a57600080fd5b505afa15801561232e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235291906140be565b6001600160a01b0316146123665750612506565b61ffff8116600090815260a2602052604090208054158061238c5750600181015460ff16155b15612398575050612506565b600381015460018201546000906301000000900460ff166124b65760048301546123c457600483018290555b60985460018401546000916123e191610100900461ffff1661410e565b6123eb908461415c565b905080421061244457600061240084836141d4565b90506098548161241091906141ac565b925061241d83600d61410e565b612427908961415c565b60018601805462ffffff1916905542600287015597506124b09050565b60985461245184426141d4565b61245b91906141ac565b915061246882600d61410e565b612472908861415c565b9650818460010160018282829054906101000a900461ffff16612495919061430f565b92506101000a81548161ffff021916908361ffff1602179055505b506124fb565b6001838101546301000000900460ff1614156124fb576098546124d983426141d4565b6124e391906141ac565b6124ee90600961410e565b6124f8908761415c565b95505b505042600390910155505b8061251081614174565b915050612210565b506000811161255c5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b604482015260640161075a565b61256d81662386f26fc1000061410e565b9050609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b1580156125bd57600080fd5b505afa1580156125d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f5919061412d565b609c54604080516318160ddd60e01b8152905184926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561263957600080fd5b505afa15801561264d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612671919061412d565b61267b919061415c565b111561279a57609c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126cf57600080fd5b505afa1580156126e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612707919061412d565b609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b15801561275557600080fd5b505afa158015612769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278d919061412d565b61279791906141d4565b90505b609c546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156127e657600080fd5b505af11580156127fa573d6000803e3d6000fd5b50506040518381523392507f258e6d8bbf25dcd0a12d45ef02d409614b701b29f42df2c374756afb6d387242915060200160405180910390a25050600160655550565b600260655414156128605760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff16156128885760405162461bcd60e51b815260040161075a9061409e565b60005b61ffff8116821115610fc857600083838361ffff168181106128af576128af614146565b90506020020160208101906128c49190613ebd565b61ffff8116600090815260a2602052604090208054919250906128e85750506129df565b60018101546301000000900460ff166129025750506129df565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561294957600080fd5b505afa15801561295d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298191906140be565b6001600160a01b0316146129965750506129df565b60018101805463ff0000001916905542600482015560405161ffff83169033907f54753f57c3fdfcf5a9f22cd75f9456acb076e936f7c3d85d8e81fd5e096c795490600090a350505b806129e981614174565b91505061288b565b600054610100900460ff1680612a0a575060005460ff16155b612a265760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015612a48576000805461ffff19166101011790555b612a50613bef565b612a58613c6a565b6097805463ffffffff191663ffff000a1790556201518060988190556099556361743530609a558015612a91576000805461ff00191690555b50565b6033546001600160a01b03163314612abe5760405162461bcd60e51b815260040161075a90614032565b60988190556040516f090dedccaf28ae0dec6d098cadccee8d60831b8152601001610784565b6033546001600160a01b03163314612b0e5760405162461bcd60e51b815260040161075a90614032565b6001600160a01b038116612b345760405162461bcd60e51b815260040161075a906142e1565b609b80546001600160a01b0319166001600160a01b0383161790556040516a426561727344656c75786560a81b8152600b01611fc2565b612b73613e03565b5061ffff908116600090815260a26020908152604091829020825160e08101845281548152600182015460ff80821694830194909452610100810490951693810193909352630100000090930416606082015260028201546080820152600382015460a082015260049091015460c082015290565b609e54604051632118854760e21b81526001600160a01b0383811660048301526000928392911690638462151c9060240160006040518083038186803b158015612c3157600080fd5b505afa158015612c45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c6d9190810190614201565b905060005b81518161ffff161015611f27576000828261ffff1681518110612c9757612c97614146565b6020908102919091010151609e54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b158015612cea57600080fd5b505afa158015612cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2291906142bf565b612d2c5750612eef565b609e546040516331a9108f60e11b815261ffff831660048201526001600160a01b03878116921690636352211e9060240160206040518083038186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dad91906140be565b6001600160a01b031614612dc15750612eef565b61ffff8116600090815260a26020526040902080541580612de75750600181015460ff16155b15612df3575050612eef565b600381015460018201546000906301000000900460ff16612ea5576098546001840154600091612e2b91610100900461ffff1661410e565b90506000612e39828561415c565b9050804210612e6d57609854612e4f90836141ac565b9250612e5c83600d61410e565b612e66908a61415c565b9850612e9e565b609854612e7a85426141d4565b612e8491906141ac565b9250612e9183600d61410e565b612e9b908a61415c565b98505b5050612eea565b6001838101546301000000900460ff161415612eea57609854612ec883426141d4565b612ed291906141ac565b612edd90600961410e565b612ee7908861415c565b96505b505050505b80612ef981614174565b915050612c72565b6033546001600160a01b03163314612f2b5760405162461bcd60e51b815260040161075a90614032565b609a8190556040518181527f9d86a54a685ef1d2e3a4057066e86daa95db7e8918c2a9f2279b1010a72fc5a09060200160405180910390a150565b6033546001600160a01b03163314612f905760405162461bcd60e51b815260040161075a90614032565b6001600160a01b038116612fb65760405162461bcd60e51b815260040161075a906142e1565b609c80546001600160a01b0319166001600160a01b038316179055604051692437b732bcaa37b5b2b760b11b8152600a01611fc2565b6002606554141561300f5760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff16156130375760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff81168311156132c357600084848361ffff1681811061305f5761305f614146565b90506020020160208101906130749190613ebd565b609e546040516331a9108f60e11b815261ffff831660048201529192506000916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156130c157600080fd5b505afa1580156130d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f991906140be565b6001600160a01b031614156131465761ffff16600090815260a26020526040812081815560018101805463ffffffff191690556002810182905560038101829055600401555061349e9050565b609e546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561318d57600080fd5b505afa1580156131a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c591906140be565b6001600160a01b0316146131d957506132b1565b61ffff8116600090815260a26020526040812081815560018101805463ffffffff1916905560028101829055600381018290556004015561321c6104b08461415c565b609e546040516388157c9760e01b815261ffff841660048201529194506001600160a01b0316906388157c9790602401600060405180830381600087803b15801561326657600080fd5b505af115801561327a573d6000803e3d6000fd5b505060405161ffff841692503391507f867faa498a34a8b06889d023b7da91b733f57d42f4c960b9124ea1a36c0e4c2990600090a3505b806132bb81614174565b91505061303b565b506132d581662386f26fc1000061410e565b9050600081116133195760405162461bcd60e51b815260206004820152600f60248201526e2737ba3434b733903a3790313ab93760891b604482015260640161075a565b609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b15801561336757600080fd5b505afa15801561337b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339f919061412d565b609c54604080516318160ddd60e01b8152905184926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156133e357600080fd5b505afa1580156133f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341b919061412d565b613425919061415c565b11156134675760405162461bcd60e51b8152602060048201526011602482015270121bdb995e4818d85c081c995858da1959607a1b604482015260640161075a565b609c546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401610f95565b50506001606555565b6033546001600160a01b031633146134d15760405162461bcd60e51b815260040161075a90614032565b6097805461ffff191661ffff83161790556040517f4e6f4f6645706f63684265666f7265496e6163746976654265650000000000008152601a0160405190819003812061ffff83168252907f8900c724b8277bf649404278b740479df79c4d47d3c867e02c2fb2702e6f74c2906020016107b7565b6033546001600160a01b031633146135705760405162461bcd60e51b815260040161075a90614032565b6001600160a01b0381166135965760405162461bcd60e51b815260040161075a906142e1565b609d80546001600160a01b0319166001600160a01b03831617905560405168486f6e65794869766560b81b8152600901611fc2565b6033546001600160a01b031633146135f55760405162461bcd60e51b815260040161075a90614032565b6001600160a01b03811661365a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161075a565b612a9181613b9d565b600260655414156136865760405162461bcd60e51b815260040161075a90614067565b6002606555609a5442116136d35760405162461bcd60e51b815260206004820152601460248201527314995dd85c991cc8191a591b89dd081cdd185c9d60621b604482015260640161075a565b609f5462010000900460ff16156136fc5760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff811683111561251857600084848361ffff1681811061372457613724614146565b90506020020160208101906137399190613ebd565b609b54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b15801561378157600080fd5b505afa158015613795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b991906142bf565b6137c357506138ec565b609b546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561380a57600080fd5b505afa15801561381e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384291906140be565b6001600160a01b03161461385657506138ec565b61ffff8116600090815260a06020526040812054801580159061387a5750609a5481115b1561389d5760985461388c82426141d4565b61389691906141ac565b91506138ba565b609854609a546138ad90426141d4565b6138b791906141ac565b91505b6138c582606461410e565b6138cf908661415c565b61ffff909316600090815260a06020526040902042905550909250505b806138f681614174565b915050613700565b6000806000609e60009054906101000a90046001600160a01b03166001600160a01b0316634c0f38c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561395157600080fd5b505afa158015613965573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613989919061412d565b60975490915061ffff80831664010000000090920416106139e15760405162461bcd60e51b815260206004820152601260248201527113505617d4d554141316481c995858da195960721b604482015260640161075a565b6097546040516bffffffffffffffffffffffff193360601b1660208201524460348201524260548201524360748201526001600160f01b031964010000000090920460f090811b8316609483015284901b909116609682015260009060980160408051601f1981840301815291905280516020909101209050613a648282614380565b935082613a7081614174565b93505061ffff8416613a80578193505b61ffff8416600090815260a26020526040902054613acf5760975461ffff6201000090910481169085161015613ac9576097805463ffff000019166201000061ffff8716021790555b50505090565b60028361ffff161115613b975760005b60975462010000900461ffff16600090815260a2602052604090205415613b81576097805462010000900461ffff16906002613b1a83614174565b91906101000a81548161ffff021916908361ffff160217905550508261ffff16609760029054906101000a900461ffff1661ffff161415613b7c578015613b6657600094505050505090565b506097805463ffff000019166201000017905560015b613adf565b505060975462010000900461ffff169392505050565b506139e1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1680613c08575060005460ff16155b613c245760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613c46576000805461ffff19166101011790555b613c4e613cc9565b613c56613d33565b8015612a91576000805461ff001916905550565b600054610100900460ff1680613c83575060005460ff16155b613c9f5760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613cc1576000805461ffff19166101011790555b613c56613d93565b600054610100900460ff1680613ce2575060005460ff16155b613cfe5760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613c56576000805461ffff19166101011790558015612a91576000805461ff001916905550565b600054610100900460ff1680613d4c575060005460ff16155b613d685760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613d8a576000805461ffff19166101011790555b613c5633613b9d565b600054610100900460ff1680613dac575060005460ff16155b613dc85760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613dea576000805461ffff19166101011790555b60016065558015612a91576000805461ff001916905550565b6040518060e0016040528060008152602001600060ff168152602001600061ffff168152602001600060ff1681526020016000815260200160008152602001600081525090565b600060208284031215613e5c57600080fd5b5035919050565b60ff81168114612a9157600080fd5b600080600060608486031215613e8757600080fd5b8335613e9281613e63565b92506020840135613ea281613e63565b91506040840135613eb281613e63565b809150509250925092565b600060208284031215613ecf57600080fd5b813561ffff81168114611f3957600080fd5b60008060208385031215613ef457600080fd5b823567ffffffffffffffff80821115613f0c57600080fd5b818501915085601f830112613f2057600080fd5b813581811115613f2f57600080fd5b8660208260051b8501011115613f4457600080fd5b60209290920196919550909350505050565b8051825260ff602082015116602083015261ffff604082015116604083015260ff60608201511660608301526080810151608083015260a081015160a083015260c081015160c08301525050565b6020808252825182820181905260009190848201906040850190845b81811015613fe657613fd3838551613f56565b9284019260e09290920191600101613fc0565b50909695505050505050565b6001600160a01b0381168114612a9157600080fd5b60006020828403121561401957600080fd5b8135611f3981613ff2565b60e08101611ca48284613f56565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6000602082840312156140d057600080fd5b8151611f3981613ff2565b6000602082840312156140ed57600080fd5b8151611f3981613e63565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614128576141286140f8565b500290565b60006020828403121561413f57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000821982111561416f5761416f6140f8565b500190565b600061ffff8083168181141561418c5761418c6140f8565b6001019392505050565b634e487b7160e01b600052601260045260246000fd5b6000826141bb576141bb614196565b500490565b6000826141cf576141cf614196565b500690565b6000828210156141e6576141e66140f8565b500390565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561421457600080fd5b825167ffffffffffffffff8082111561422c57600080fd5b818501915085601f83011261424057600080fd5b815181811115614252576142526141eb565b8060051b604051601f19603f83011681018181108582111715614277576142776141eb565b60405291825284820192508381018501918883111561429557600080fd5b938501935b828510156142b35784518452938501939285019261429a565b98975050505050505050565b6000602082840312156142d157600080fd5b81518015158114611f3957600080fd5b602080825260149082015273043616e206e6f74206265206164647265737320360641b604082015260600190565b600061ffff8381169083168181101561432a5761432a6140f8565b039392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600061ffff8084168061439557614395614196565b9216919091069291505056fea164736f6c6343000809000a
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061030c5760003560e01c8063723f03a81161019d578063a81dc1fd116100e9578063e2716580116100a2578063f2fde38b1161007c578063f2fde38b146106ee578063f3f526cc14610701578063f6bf10d414610714578063f6c3c0451461072757600080fd5b8063e2716580146106a4578063ecee6f41146106c8578063f103e57b146106db57600080fd5b8063a81dc1fd14610652578063a88e9aa314610665578063ac4746ab1461066d578063af8cb76214610676578063be97d93b14610689578063d3a5be491461069157600080fd5b80638a74970e116101565780638da5cb5b116101305780638da5cb5b1461062657806393b386a8146103f157806399b26d3f146106375780639a0169351461064a57600080fd5b80638a74970e146105cf5780638ae6df38146105e25780638c4132c81461060657600080fd5b8063723f03a81461057e57806374a2ad1b146105915780638129fc1c146105a457806384ca9626146105ac57806384d5e6dc146105bf57806385483e96146105c757600080fd5b806346e3a8691161025c5780635ac8ff921161021557806360ff9eab116101ef57806360ff9eab1461054757806365c238c81461055a5780636d4643a51461056d578063715018a61461057657600080fd5b80635ac8ff92146104cc5780635c975abb146104f55780635ee82ace1461053957600080fd5b806346e3a8691461044357806349a9ba311461045657806349cf26c0146104695780634e2b2e33146104725780634e67d9fb1461049957806358b0bb12146104b957600080fd5b806333c437c9116102c95780633ea52061116102a35780633ea52061146103f1578063420ee584146103fa5780634218156f1461040d578063464718241461042057600080fd5b806333c437c91461039557806335387e44146103c057806336b2c4b2146103de57600080fd5b806305499329146103115780630af65929146103265780630c939a8014610345578063217ba7901461035c57806321c024c91461036f57806332e4c99014610382575b600080fd5b61032461031f366004613e4a565b610730565b005b61032e600381565b60405160ff90911681526020015b60405180910390f35b61034e611af481565b60405190815260200161033c565b61032461036a366004613e72565b6107c2565b61032461037d366004613ebd565b61086a565b610324610390366004613ee1565b610c2e565b609d546103a8906001600160a01b031681565b6040516001600160a01b03909116815260200161033c565b6103c96104b081565b60405163ffffffff909116815260200161033c565b609c546103a8906001600160a01b031681565b6103c96102bc81565b610324610408366004613ee1565b610fd2565b61032461041b366004613ee1565b6113b5565b61043361042e366004613ebd565b6115c6565b604051901515815260200161033c565b610324610451366004613ebd565b61160f565b609b546103a8906001600160a01b031681565b61034e60995481565b61034e610480366004613ebd565b61ffff16600090815260a2602052604090206003015490565b6104ac6104a7366004613ee1565b611b64565b60405161033c9190613fa4565b61034e6104c7366004614007565b611caa565b6097546104e290640100000000900461ffff1681565b60405161ffff909116815260200161033c565b609f546105159060ff808216916101008104821691620100009091041683565b6040805160ff9485168152928416602084015292169181019190915260600161033c565b6097546104e29061ffff1681565b610324610555366004614007565b611f40565b610324610568366004613ebd565b612002565b61034e609a5481565b610324612143565b61032461058c366004613ee1565b612179565b61032461059f366004613ee1565b61283d565b6103246129f1565b6103246105ba366004613e4a565b612a94565b609a5461034e565b6103c9600d81565b6103246105dd366004614007565b612ae4565b61034e6105f0366004613ebd565b61ffff16600090815260a0602052604090205490565b610619610614366004613ebd565b612b6b565b60405161033c9190614024565b6033546001600160a01b03166103a8565b61034e610645366004614007565b612be8565b6103c9606481565b610324610660366004613e4a565b612f01565b6103c9600981565b61034e60985481565b610324610684366004614007565b612f66565b6103c9601781565b61032461069f366004613ee1565b612fec565b61034e6106b2366004613ebd565b61ffff16600090815260a1602052604090205490565b6103246106d6366004613ebd565b6134a7565b6103246106e9366004614007565b613546565b6103246106fc366004614007565b6135cb565b61032461070f366004613ee1565b613663565b609e546103a8906001600160a01b031681565b61034e6108fc81565b6033546001600160a01b031633146107635760405162461bcd60e51b815260040161075a90614032565b60405180910390fd5b60998190556040516e090d2ecca8ae0dec6d098cadccee8d608b1b8152600f015b604051908190038120828252907f8900c724b8277bf649404278b740479df79c4d47d3c867e02c2fb2702e6f74c2906020015b60405180910390a250565b6033546001600160a01b031633146107ec5760405162461bcd60e51b815260040161075a90614032565b609f805462ffff0019166201000060ff86811691820261ff001916929092176101008684169081029190911760ff1916928516928317909355604080519182526020820193909352918201527f6f745a4eb556eef343d02d576c54dfd149a44d81e295a919ce0ede3d3c1eef3e9060600160405180910390a1505050565b6002606554141561088d5760405162461bcd60e51b815260040161075a90614067565b6002606555609f54610100900460ff16156108ba5760405162461bcd60e51b815260040161075a9061409e565b609d546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561090157600080fd5b505afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093991906140be565b6001600160a01b03161461097f5760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420796f7572206869766560981b604482015260640161075a565b609d5460405163ae953d8960e01b815261ffff831660048201526003916001600160a01b03169063ae953d899060240160206040518083038186803b1580156109c757600080fd5b505afa1580156109db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ff91906140db565b60ff161015610a425760405162461bcd60e51b815260206004820152600f60248201526e10d85c081b9bdd081c995858da1959608a1b604482015260640161075a565b610a55611af4662386f26fc1000061410e565b609c546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610a9857600080fd5b505afa158015610aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad0919061412d565b1015610b115760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820486f6e657960801b604482015260640161075a565b609c546001600160a01b0316639dc29fac33610b36611af4662386f26fc1000061410e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610b7c57600080fd5b505af1158015610b90573d6000803e3d6000fd5b5050609d54604051630b3e286360e11b815261ffff851660048201526001600160a01b03909116925063167c50c69150602401600060405180830381600087803b158015610bdd57600080fd5b505af1158015610bf1573d6000803e3d6000fd5b505060405161ffff841692503391507ff49897e9eea917a865792129274a2f6ee90255068c08d6e4d78701370d4d263d90600090a3506001606555565b60026065541415610c515760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff1615610c795760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff8116831115610e4657600084848361ffff16818110610ca157610ca1614146565b9050602002016020810190610cb69190613ebd565b61ffff8116600090815260a260205260409020805491925090610cda575050610e34565b600181015460ff16610ced575050610e34565b6001818101546301000000900460ff161415610d0a575050610e34565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b158015610d5157600080fd5b505afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8991906140be565b6001600160a01b031614610d9e575050610e34565b6098546001820154600091610dbb91610100900461ffff1661410e565b8260030154610dca919061415c565b9050804210610ddb57505050610e34565b610de76102bc8661415c565b60018301805463ff0000001916630100000017905560405190955061ffff84169033907f3a217120d9f10810399d7af913c94d3a3f1b5b82c1899990c5c399ea627ff35890600090a35050505b80610e3e81614174565b915050610c7d565b5060008111610e8a5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f207374616b6560801b604482015260640161075a565b610e9b81662386f26fc1000061410e565b609c546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b158015610ee357600080fd5b505afa158015610ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1b919061412d565b1015610f5c5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820686f6e657960801b604482015260640161075a565b8015610fc857609c54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac906044015b600060405180830381600087803b158015610faf57600080fd5b505af1158015610fc3573d6000803e3d6000fd5b505050505b5050600160655550565b60026065541415610ff55760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff161561101d5760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff811683111561126257600084848361ffff1681811061104557611045614146565b905060200201602081019061105a9190613ebd565b61ffff8116600090815260a26020526040902080549192509061107e575050611250565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b1580156110c557600080fd5b505afa1580156110d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fd91906140be565b6001600160a01b031614611112575050611250565b6001818101546301000000900460ff16141561112f575050611250565b600181015460ff16611142575050611250565b600181015460985461010090910461ffff169061115f908261410e565b826003015461116e919061415c565b42111561117d57505050611250565b6097546000906111919061ffff16836141ac565b6097549091506000906111a89061ffff16846141c0565b11156111bc576111b960018261415c565b90505b6111c781601761410e565b6111d1908761415c565b6097549096506111e59061ffff168361415c565b60975490925061ffff168214156111fd574260048401555b60018301805461ffff8085166101000262ffff0019909216919091179091556040519085169033907f0fdfd2278a82d89a285de1659c49e93d0371d707c27ecacda4f1bbf8f7db693590600090a3505050505b8061125a81614174565b915050611021565b50600081116112ac5760405162461bcd60e51b81526020600482015260166024820152754e6f7468696e6720746f206b6565702061637469766560501b604482015260640161075a565b6112bd81662386f26fc1000061410e565b609c546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b15801561130557600080fd5b505afa158015611319573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133d919061412d565b101561137e5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820686f6e657960801b604482015260640161075a565b609c54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401610f95565b600260655414156113d85760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff16156114005760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff811683111561157f57600084848361ffff1681811061142857611428614146565b905060200201602081019061143d9190613ebd565b61ffff8116600090815260a26020526040902080549192509061146157505061156d565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b1580156114a857600080fd5b505afa1580156114bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e091906140be565b6001600160a01b0316146114f557505061156d565b6115016102bc8561415c565b6001828101805460ff1981168317825560975462ffffff1990911661010061ffff928316021790921790554260038401819055600484015560405191955083169033907fc1d9120cbac78180337285e846163621e353501870b4e46763cd01d125bc5f0790600090a350505b8061157781614174565b915050611404565b50600081116112ac5760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20616374697661746560681b604482015260640161075a565b61ffff808216600090815260a2602052604081206098546001820154929391926115f6926101009091041661410e565b8160030154611605919061415c565b4210159392505050565b600260655414156116325760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff161561165a5760405162461bcd60e51b815260040161075a9061409e565b336116a35760405162461bcd60e51b8152602060048201526019602482015278043616e206e6f74206d696e7420746f2061646472657373203603c1b604482015260640161075a565b609d546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b1580156116ea57600080fd5b505afa1580156116fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172291906140be565b6001600160a01b0316146117685760405162461bcd60e51b815260206004820152600d60248201526c139bc8121a5d99481bdddb9959609a1b604482015260640161075a565b61177b6108fc662386f26fc1000061410e565b609c546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156117be57600080fd5b505afa1580156117d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f6919061412d565b10156118375760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820486f6e657960801b604482015260640161075a565b60995461184490426141d4565b61ffff8216600090815260a16020526040902054106118995760405162461bcd60e51b815260206004820152601160248201527026b4b73a103132b29031b7b7b63237bbb760791b604482015260640161075a565b60006118a36138fe565b905060008161ffff16116118e75760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0819985a5b195960aa1b604482015260640161075a565b61ffff808316600090815260a1602090815260408083204290819055815160e0810183528686168082526001828601818152609780548a16858801908152606086018a8152608087018b815260a0880189815260c08901998a52968c5260a2909a529790992094518555905191840180549851965160ff90811663010000000263ff00000019988c166101000262ffffff19909b1694909116939093179890981795909516179095559251600284015592516003830155915160049182015581546401000000009004909216916119bd83614174565b82546101009290920a61ffff818102199093169183160217909155609d5460405163617a881b60e01b815291851660048301526001600160a01b0316915063617a881b90602401600060405180830381600087803b158015611a1e57600080fd5b505af1158015611a32573d6000803e3d6000fd5b5050609c546001600160a01b03169150639dc29fac905033611a5d6108fc662386f26fc1000061410e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611aa357600080fd5b505af1158015611ab7573d6000803e3d6000fd5b5050609e546040516340c10f1960e01b815233600482015261ffff851660248201526001600160a01b0390911692506340c10f199150604401600060405180830381600087803b158015611b0a57600080fd5b505af1158015611b1e573d6000803e3d6000fd5b505060405161ffff841681523392507fa72b9f69ceff29b665f9add67b0f19138fd338f2e79ece3cdcd167943e531a58915060200160405180910390a250506001606555565b60608167ffffffffffffffff811115611b7f57611b7f6141eb565b604051908082528060200260200182016040528015611bb857816020015b611ba5613e03565b815260200190600190039081611b9d5790505b50905060005b61ffff8116831115611ca25760a2600085858461ffff16818110611be457611be4614146565b9050602002016020810190611bf99190613ebd565b61ffff90811682526020808301939093526040918201600020825160e08101845281548152600182015460ff8082169683019690965261010081048416948201949094526301000000909304909316606083015260028301546080830152600383015460a083015260049092015460c0820152835190918491908416908110611c8457611c84614146565b60200260200101819052508080611c9a90614174565b915050611bbe565b505b92915050565b609b54604051632118854760e21b81526001600160a01b0383811660048301526000928392911690638462151c9060240160006040518083038186803b158015611cf357600080fd5b505afa158015611d07573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2f9190810190614201565b905060005b81518161ffff161015611f27576000828261ffff1681518110611d5957611d59614146565b6020908102919091010151609b54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b158015611dac57600080fd5b505afa158015611dc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de491906142bf565b611dee5750611f15565b609b546040516331a9108f60e11b815261ffff831660048201526001600160a01b03878116921690636352211e9060240160206040518083038186803b158015611e3757600080fd5b505afa158015611e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6f91906140be565b6001600160a01b031614611e835750611f15565b61ffff8116600090815260a060205260408120548015801590611ea75750609a5481115b15611eca57609854611eb982426141d4565b611ec391906141ac565b9150611efa565b609a54421015611edd5760009150611efa565b609854609a54611eed90426141d4565b611ef791906141ac565b91505b611f0582606461410e565b611f0f908761415c565b95505050505b80611f1f81614174565b915050611d34565b50611f3982662386f26fc1000061410e565b9392505050565b6033546001600160a01b03163314611f6a5760405162461bcd60e51b815260040161075a90614032565b6001600160a01b038116611f905760405162461bcd60e51b815260040161075a906142e1565b609e80546001600160a01b0319166001600160a01b038316179055604051694265657344656c75786560b01b8152600a015b6040519081900381206001600160a01b0383168252907fbf2cc7083b32d1f5c82633af784e1285df86eb43c88d0752feea4bebb4a0b6d2906020016107b7565b600260655414156120255760405162461bcd60e51b815260040161075a90614067565b6002606555609f54610100900460ff16156120525760405162461bcd60e51b815260040161075a9061409e565b3361209b5760405162461bcd60e51b8152602060048201526019602482015278043616e206e6f74206d696e7420746f2061646472657373203603c1b604482015260640161075a565b609d546040516340c10f1960e01b815233600482015261ffff831660248201526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156120ea57600080fd5b505af11580156120fe573d6000803e3d6000fd5b505060405161ffff841681523392507ff6b907f000734a9a2ead9c2160cb1cc3ae13292659e4d5a5f9bb983d519474a3915060200160405180910390a2506001606555565b6033546001600160a01b0316331461216d5760405162461bcd60e51b815260040161075a90614032565b6121776000613b9d565b565b6002606554141561219c5760405162461bcd60e51b815260040161075a90614067565b6002606555609a5442116121e95760405162461bcd60e51b815260206004820152601460248201527314995dd85c991cc8191a591b89dd081cdd185c9d60621b604482015260640161075a565b609f5460ff161561220c5760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff811683111561251857600084848361ffff1681811061223457612234614146565b90506020020160208101906122499190613ebd565b609e54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b15801561229157600080fd5b505afa1580156122a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c991906142bf565b6122d35750612506565b609e546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561231a57600080fd5b505afa15801561232e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235291906140be565b6001600160a01b0316146123665750612506565b61ffff8116600090815260a2602052604090208054158061238c5750600181015460ff16155b15612398575050612506565b600381015460018201546000906301000000900460ff166124b65760048301546123c457600483018290555b60985460018401546000916123e191610100900461ffff1661410e565b6123eb908461415c565b905080421061244457600061240084836141d4565b90506098548161241091906141ac565b925061241d83600d61410e565b612427908961415c565b60018601805462ffffff1916905542600287015597506124b09050565b60985461245184426141d4565b61245b91906141ac565b915061246882600d61410e565b612472908861415c565b9650818460010160018282829054906101000a900461ffff16612495919061430f565b92506101000a81548161ffff021916908361ffff1602179055505b506124fb565b6001838101546301000000900460ff1614156124fb576098546124d983426141d4565b6124e391906141ac565b6124ee90600961410e565b6124f8908761415c565b95505b505042600390910155505b8061251081614174565b915050612210565b506000811161255c5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b604482015260640161075a565b61256d81662386f26fc1000061410e565b9050609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b1580156125bd57600080fd5b505afa1580156125d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f5919061412d565b609c54604080516318160ddd60e01b8152905184926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561263957600080fd5b505afa15801561264d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612671919061412d565b61267b919061415c565b111561279a57609c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126cf57600080fd5b505afa1580156126e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612707919061412d565b609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b15801561275557600080fd5b505afa158015612769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278d919061412d565b61279791906141d4565b90505b609c546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156127e657600080fd5b505af11580156127fa573d6000803e3d6000fd5b50506040518381523392507f258e6d8bbf25dcd0a12d45ef02d409614b701b29f42df2c374756afb6d387242915060200160405180910390a25050600160655550565b600260655414156128605760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff16156128885760405162461bcd60e51b815260040161075a9061409e565b60005b61ffff8116821115610fc857600083838361ffff168181106128af576128af614146565b90506020020160208101906128c49190613ebd565b61ffff8116600090815260a2602052604090208054919250906128e85750506129df565b60018101546301000000900460ff166129025750506129df565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561294957600080fd5b505afa15801561295d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298191906140be565b6001600160a01b0316146129965750506129df565b60018101805463ff0000001916905542600482015560405161ffff83169033907f54753f57c3fdfcf5a9f22cd75f9456acb076e936f7c3d85d8e81fd5e096c795490600090a350505b806129e981614174565b91505061288b565b600054610100900460ff1680612a0a575060005460ff16155b612a265760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015612a48576000805461ffff19166101011790555b612a50613bef565b612a58613c6a565b6097805463ffffffff191663ffff000a1790556201518060988190556099556361743530609a558015612a91576000805461ff00191690555b50565b6033546001600160a01b03163314612abe5760405162461bcd60e51b815260040161075a90614032565b60988190556040516f090dedccaf28ae0dec6d098cadccee8d60831b8152601001610784565b6033546001600160a01b03163314612b0e5760405162461bcd60e51b815260040161075a90614032565b6001600160a01b038116612b345760405162461bcd60e51b815260040161075a906142e1565b609b80546001600160a01b0319166001600160a01b0383161790556040516a426561727344656c75786560a81b8152600b01611fc2565b612b73613e03565b5061ffff908116600090815260a26020908152604091829020825160e08101845281548152600182015460ff80821694830194909452610100810490951693810193909352630100000090930416606082015260028201546080820152600382015460a082015260049091015460c082015290565b609e54604051632118854760e21b81526001600160a01b0383811660048301526000928392911690638462151c9060240160006040518083038186803b158015612c3157600080fd5b505afa158015612c45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c6d9190810190614201565b905060005b81518161ffff161015611f27576000828261ffff1681518110612c9757612c97614146565b6020908102919091010151609e54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b158015612cea57600080fd5b505afa158015612cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2291906142bf565b612d2c5750612eef565b609e546040516331a9108f60e11b815261ffff831660048201526001600160a01b03878116921690636352211e9060240160206040518083038186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dad91906140be565b6001600160a01b031614612dc15750612eef565b61ffff8116600090815260a26020526040902080541580612de75750600181015460ff16155b15612df3575050612eef565b600381015460018201546000906301000000900460ff16612ea5576098546001840154600091612e2b91610100900461ffff1661410e565b90506000612e39828561415c565b9050804210612e6d57609854612e4f90836141ac565b9250612e5c83600d61410e565b612e66908a61415c565b9850612e9e565b609854612e7a85426141d4565b612e8491906141ac565b9250612e9183600d61410e565b612e9b908a61415c565b98505b5050612eea565b6001838101546301000000900460ff161415612eea57609854612ec883426141d4565b612ed291906141ac565b612edd90600961410e565b612ee7908861415c565b96505b505050505b80612ef981614174565b915050612c72565b6033546001600160a01b03163314612f2b5760405162461bcd60e51b815260040161075a90614032565b609a8190556040518181527f9d86a54a685ef1d2e3a4057066e86daa95db7e8918c2a9f2279b1010a72fc5a09060200160405180910390a150565b6033546001600160a01b03163314612f905760405162461bcd60e51b815260040161075a90614032565b6001600160a01b038116612fb65760405162461bcd60e51b815260040161075a906142e1565b609c80546001600160a01b0319166001600160a01b038316179055604051692437b732bcaa37b5b2b760b11b8152600a01611fc2565b6002606554141561300f5760405162461bcd60e51b815260040161075a90614067565b6002606555609f5460ff16156130375760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff81168311156132c357600084848361ffff1681811061305f5761305f614146565b90506020020160208101906130749190613ebd565b609e546040516331a9108f60e11b815261ffff831660048201529192506000916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156130c157600080fd5b505afa1580156130d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f991906140be565b6001600160a01b031614156131465761ffff16600090815260a26020526040812081815560018101805463ffffffff191690556002810182905560038101829055600401555061349e9050565b609e546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561318d57600080fd5b505afa1580156131a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c591906140be565b6001600160a01b0316146131d957506132b1565b61ffff8116600090815260a26020526040812081815560018101805463ffffffff1916905560028101829055600381018290556004015561321c6104b08461415c565b609e546040516388157c9760e01b815261ffff841660048201529194506001600160a01b0316906388157c9790602401600060405180830381600087803b15801561326657600080fd5b505af115801561327a573d6000803e3d6000fd5b505060405161ffff841692503391507f867faa498a34a8b06889d023b7da91b733f57d42f4c960b9124ea1a36c0e4c2990600090a3505b806132bb81614174565b91505061303b565b506132d581662386f26fc1000061410e565b9050600081116133195760405162461bcd60e51b815260206004820152600f60248201526e2737ba3434b733903a3790313ab93760891b604482015260640161075a565b609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b15801561336757600080fd5b505afa15801561337b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339f919061412d565b609c54604080516318160ddd60e01b8152905184926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156133e357600080fd5b505afa1580156133f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341b919061412d565b613425919061415c565b11156134675760405162461bcd60e51b8152602060048201526011602482015270121bdb995e4818d85c081c995858da1959607a1b604482015260640161075a565b609c546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401610f95565b50506001606555565b6033546001600160a01b031633146134d15760405162461bcd60e51b815260040161075a90614032565b6097805461ffff191661ffff83161790556040517f4e6f4f6645706f63684265666f7265496e6163746976654265650000000000008152601a0160405190819003812061ffff83168252907f8900c724b8277bf649404278b740479df79c4d47d3c867e02c2fb2702e6f74c2906020016107b7565b6033546001600160a01b031633146135705760405162461bcd60e51b815260040161075a90614032565b6001600160a01b0381166135965760405162461bcd60e51b815260040161075a906142e1565b609d80546001600160a01b0319166001600160a01b03831617905560405168486f6e65794869766560b81b8152600901611fc2565b6033546001600160a01b031633146135f55760405162461bcd60e51b815260040161075a90614032565b6001600160a01b03811661365a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161075a565b612a9181613b9d565b600260655414156136865760405162461bcd60e51b815260040161075a90614067565b6002606555609a5442116136d35760405162461bcd60e51b815260206004820152601460248201527314995dd85c991cc8191a591b89dd081cdd185c9d60621b604482015260640161075a565b609f5462010000900460ff16156136fc5760405162461bcd60e51b815260040161075a9061409e565b6000805b61ffff811683111561251857600084848361ffff1681811061372457613724614146565b90506020020160208101906137399190613ebd565b609b54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b15801561378157600080fd5b505afa158015613795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b991906142bf565b6137c357506138ec565b609b546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561380a57600080fd5b505afa15801561381e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384291906140be565b6001600160a01b03161461385657506138ec565b61ffff8116600090815260a06020526040812054801580159061387a5750609a5481115b1561389d5760985461388c82426141d4565b61389691906141ac565b91506138ba565b609854609a546138ad90426141d4565b6138b791906141ac565b91505b6138c582606461410e565b6138cf908661415c565b61ffff909316600090815260a06020526040902042905550909250505b806138f681614174565b915050613700565b6000806000609e60009054906101000a90046001600160a01b03166001600160a01b0316634c0f38c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561395157600080fd5b505afa158015613965573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613989919061412d565b60975490915061ffff80831664010000000090920416106139e15760405162461bcd60e51b815260206004820152601260248201527113505617d4d554141316481c995858da195960721b604482015260640161075a565b6097546040516bffffffffffffffffffffffff193360601b1660208201524460348201524260548201524360748201526001600160f01b031964010000000090920460f090811b8316609483015284901b909116609682015260009060980160408051601f1981840301815291905280516020909101209050613a648282614380565b935082613a7081614174565b93505061ffff8416613a80578193505b61ffff8416600090815260a26020526040902054613acf5760975461ffff6201000090910481169085161015613ac9576097805463ffff000019166201000061ffff8716021790555b50505090565b60028361ffff161115613b975760005b60975462010000900461ffff16600090815260a2602052604090205415613b81576097805462010000900461ffff16906002613b1a83614174565b91906101000a81548161ffff021916908361ffff160217905550508261ffff16609760029054906101000a900461ffff1661ffff161415613b7c578015613b6657600094505050505090565b506097805463ffff000019166201000017905560015b613adf565b505060975462010000900461ffff169392505050565b506139e1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1680613c08575060005460ff16155b613c245760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613c46576000805461ffff19166101011790555b613c4e613cc9565b613c56613d33565b8015612a91576000805461ff001916905550565b600054610100900460ff1680613c83575060005460ff16155b613c9f5760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613cc1576000805461ffff19166101011790555b613c56613d93565b600054610100900460ff1680613ce2575060005460ff16155b613cfe5760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613c56576000805461ffff19166101011790558015612a91576000805461ff001916905550565b600054610100900460ff1680613d4c575060005460ff16155b613d685760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613d8a576000805461ffff19166101011790555b613c5633613b9d565b600054610100900460ff1680613dac575060005460ff16155b613dc85760405162461bcd60e51b815260040161075a90614332565b600054610100900460ff16158015613dea576000805461ffff19166101011790555b60016065558015612a91576000805461ff001916905550565b6040518060e0016040528060008152602001600060ff168152602001600061ffff168152602001600060ff1681526020016000815260200160008152602001600081525090565b600060208284031215613e5c57600080fd5b5035919050565b60ff81168114612a9157600080fd5b600080600060608486031215613e8757600080fd5b8335613e9281613e63565b92506020840135613ea281613e63565b91506040840135613eb281613e63565b809150509250925092565b600060208284031215613ecf57600080fd5b813561ffff81168114611f3957600080fd5b60008060208385031215613ef457600080fd5b823567ffffffffffffffff80821115613f0c57600080fd5b818501915085601f830112613f2057600080fd5b813581811115613f2f57600080fd5b8660208260051b8501011115613f4457600080fd5b60209290920196919550909350505050565b8051825260ff602082015116602083015261ffff604082015116604083015260ff60608201511660608301526080810151608083015260a081015160a083015260c081015160c08301525050565b6020808252825182820181905260009190848201906040850190845b81811015613fe657613fd3838551613f56565b9284019260e09290920191600101613fc0565b50909695505050505050565b6001600160a01b0381168114612a9157600080fd5b60006020828403121561401957600080fd5b8135611f3981613ff2565b60e08101611ca48284613f56565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6000602082840312156140d057600080fd5b8151611f3981613ff2565b6000602082840312156140ed57600080fd5b8151611f3981613e63565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614128576141286140f8565b500290565b60006020828403121561413f57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000821982111561416f5761416f6140f8565b500190565b600061ffff8083168181141561418c5761418c6140f8565b6001019392505050565b634e487b7160e01b600052601260045260246000fd5b6000826141bb576141bb614196565b500490565b6000826141cf576141cf614196565b500690565b6000828210156141e6576141e66140f8565b500390565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561421457600080fd5b825167ffffffffffffffff8082111561422c57600080fd5b818501915085601f83011261424057600080fd5b815181811115614252576142526141eb565b8060051b604051601f19603f83011681018181108582111715614277576142776141eb565b60405291825284820192508381018501918883111561429557600080fd5b938501935b828510156142b35784518452938501939285019261429a565b98975050505050505050565b6000602082840312156142d157600080fd5b81518015158114611f3957600080fd5b602080825260149082015273043616e206e6f74206265206164647265737320360641b604082015260600190565b600061ffff8381169083168181101561432a5761432a6140f8565b039392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600061ffff8084168061439557614395614196565b9216919091069291505056fea164736f6c6343000809000a
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.