Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14394249 | 863 days ago | IN | 0 ETH | 0.40350924 |
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"; import "../interfaces/HoneyCombsDeluxeI.sol"; // solhint-disable-next-line 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; //solhint-disable uint256 public HIVE_CLAIM_EPOCH_LENGTH; //solhint-disable uint256 public STARTING_POINT; //solhint-disable 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; HoneyCombsDeluxeI public honeyCombs; mapping(uint16 => uint8) public beeLevels; mapping(BEE_LEVEL => uint8) public rewardsPerBeeLevel; // 10 = 1 uint8 public MAX_BEE_LEVEL; 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; } enum BEE_LEVEL { NONE, //default level COMMON_WORKER, COMMON_ACTIVE, UNCOMMON_ACTIVE, UNCOMMON_WORKER, RARE_ACTIVE, RARE_WORKER, EPIC_ACTIVE, EPIC_WORKER, LEGENDARY_ACTIVE, LEGENDARY_WORKER } /***********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); event BeeLeveledUp(uint16 _beeId, uint256 _level); 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**************/ /** * @notice 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); } /** * @notice claiming honey by owning a bee, it counts for the bee level. */ // 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; uint256 currentAmount = 0; uint256 multiplier = 10; 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; currentAmount = HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH * epochsToReward; bee.active = 0; bee.epochsLeft = 0; bee.becameInactiveTime = block.timestamp; } else { epochsToReward = ((block.timestamp - lastReward) / EPOCH_LENGTH); currentAmount = HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH * epochsToReward; bee.epochsLeft -= uint16(epochsToReward); } if (beeLevels[id] > 0) { multiplier = rewardsPerBeeLevel[BEE_LEVEL(beeLevels[id] * 2 - 1)]; } } 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. currentAmount += HONEY_STAKED_BEE_REWARDS_PER_EPOCH * ((block.timestamp - lastReward) / EPOCH_LENGTH); if (beeLevels[id] > 0) multiplier = rewardsPerBeeLevel[BEE_LEVEL(beeLevels[id] * 2)]; //we do not decrease 1 because this is a worker bee and worker bees rewardsPerBeeLevel are 1 higher } amount += currentAmount * multiplier; bee.lastRewardTime = block.timestamp; } require(amount > 0, "Nothing to claim"); amount = amount * 1e15; //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); } /** * @notice 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); } /** * @notice 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); } /** * @notice 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); } /** * @notice 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); } /** * @notice 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; // amount increases depending on how "in advance" msg.sender wants to keep his bee active amountOfHoney += AMOUNT_TO_KEEP_ACTIVE; 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); } /** * @notice 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); } /** * @notice 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); } /** * @notice 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); } } /** * @notice levels up a bee by burning combs. the _honeyCombs should be sorted DESC for efficiency. BE AWARE that the index * on _honeyCombs must correspond with the index on _quantities */ function levelUpBee( uint16 _beeId, uint256[] calldata _honeyCombs, uint256[] memory _quantities ) external nonReentrant { require(paused.pauseBee == 0, "Paused"); require(bees.ownerOf(_beeId) == msg.sender, "You don't own this Bee"); require(_honeyCombs.length == _quantities.length, "Invalid request"); uint256 currentLevel = beeLevels[_beeId]; for (uint256 i; i < _honeyCombs.length; i++) { uint256 rarity = _honeyCombs[i]; if (honeyCombs.balanceOf(msg.sender, rarity) < _quantities[i] || currentLevel >= MAX_BEE_LEVEL) continue; currentLevel = (rarity + 1) * _quantities[i] + currentLevel; //if leveling up quantity does not go beyond max level if (currentLevel >= MAX_BEE_LEVEL) { // removing the extra quantities in case someone sends like more than it should _quantities[i] = _quantities[i] - (currentLevel - MAX_BEE_LEVEL) / (rarity + 1); // if quantity goes beyond level up, we just level up to MAX_BEE_LEVEL currentLevel = MAX_BEE_LEVEL; } honeyCombs.burn(msg.sender, rarity, _quantities[i]); } require(currentLevel <= MAX_BEE_LEVEL, "Leveling up failed"); beeLevels[_beeId] = uint8(currentLevel); emit BeeLeveledUp(_beeId, currentLevel); } /***********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**************/ /** * @notice Get a time when the Bear was last rewarded with honey */ function getLastRewardedByBear(uint16 _bearId) external view returns (uint256) { return lastRewardOfHoneyPerBears[_bearId]; } /** * @notice Get a time when the Bee was last rewarded with honey */ function getLastRewardedByBee(uint16 _beeId) external view returns (uint256) { return idsAndBees[_beeId].lastRewardTime; } /** * @notice Get the whole state of the bee */ function getBeeState(uint16 _beeId) external view returns (Bee memory) { return idsAndBees[_beeId]; } /** * @notice Get last time you claimed a bee */ function getLastTimeBeeClaimed(uint16 _hiveId) external view returns (uint256) { return lastTimeClaimedBeePerHive[_hiveId]; } /** * @notice 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; } /** * @notice 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; } /** * @notice 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; uint256 currentAmount = 0; uint256 multiplier = 10; if (bee.staked == 0) { uint256 cutoff = lastReward + (bee.epochsLeft * EPOCH_LENGTH); if (block.timestamp >= cutoff) { uint256 _e = cutoff - lastReward; epochsToReward = _e / EPOCH_LENGTH; currentAmount = HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH * epochsToReward; } else { epochsToReward = ((block.timestamp - lastReward) / EPOCH_LENGTH); currentAmount = HONEY_UNSTAKED_BEE_REWARDS_PER_EPOCH * epochsToReward; } if (beeLevels[id] > 0) multiplier = rewardsPerBeeLevel[BEE_LEVEL(beeLevels[id] * 2 - 1)]; } 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. currentAmount += HONEY_STAKED_BEE_REWARDS_PER_EPOCH * ((block.timestamp - lastReward) / EPOCH_LENGTH); if (beeLevels[id] > 0) multiplier = rewardsPerBeeLevel[BEE_LEVEL(beeLevels[id] * 2)]; //we do not decrease 1 because this is a worker bee and worker bees rewardsPerBeeLevel are 1 higher } amount += currentAmount * multiplier; } amount = amount * 1e15; } /** * @notice 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 setHoneyCombs(address _contract) external onlyOwner { require(_contract != address(0), "Can not be address 0"); honeyCombs = HoneyCombsDeluxeI(_contract); emit SetContract("HoneyCombsDeluxe", _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); } function initLevelUpBees() external onlyOwner { MAX_BEE_LEVEL = 5; rewardsPerBeeLevel[BEE_LEVEL.NONE] = 10; rewardsPerBeeLevel[BEE_LEVEL.COMMON_ACTIVE] = 14; rewardsPerBeeLevel[BEE_LEVEL.COMMON_WORKER] = 16; rewardsPerBeeLevel[BEE_LEVEL.UNCOMMON_ACTIVE] = 20; rewardsPerBeeLevel[BEE_LEVEL.UNCOMMON_WORKER] = 24; rewardsPerBeeLevel[BEE_LEVEL.RARE_ACTIVE] = 24; rewardsPerBeeLevel[BEE_LEVEL.RARE_WORKER] = 30; rewardsPerBeeLevel[BEE_LEVEL.EPIC_ACTIVE] = 31; rewardsPerBeeLevel[BEE_LEVEL.EPIC_WORKER] = 40; rewardsPerBeeLevel[BEE_LEVEL.LEGENDARY_ACTIVE] = 39; rewardsPerBeeLevel[BEE_LEVEL.LEGENDARY_WORKER] = 52; } /** * @notice 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.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "../interfaces/Enums.sol"; abstract contract HoneyCombsDeluxeI is Ownable, IERC1155 { function burn( address _owner, uint256 _rarity, uint256 _amount ) external virtual; }
// 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; // solhint-disable-next-line enum HONEY_COMB_RARITY { COMMON, UNCOMMON, RARE, EPIC, LEGENDARY }
{ "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":false,"internalType":"uint16","name":"_beeId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_level","type":"uint256"}],"name":"BeeLeveledUp","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_BEE_LEVEL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"beeLevels","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"honeyCombs","outputs":[{"internalType":"contract HoneyCombsDeluxeI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initLevelUpBees","outputs":[],"stateMutability":"nonpayable","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":"_beeId","type":"uint16"},{"internalType":"uint256[]","name":"_honeyCombs","type":"uint256[]"},{"internalType":"uint256[]","name":"_quantities","type":"uint256[]"}],"name":"levelUpBee","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":"enum HoneyFarmQueenDeluxe.BEE_LEVEL","name":"","type":"uint8"}],"name":"rewardsPerBeeLevel","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"address","name":"_contract","type":"address"}],"name":"setHoneyCombs","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
608060405234801561001057600080fd5b50615025806100206000396000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c806374a2ad1b116101e9578063a88e9aa31161010f578063d4ffca2d116100ad578063f2fde38b1161007c578063f2fde38b1461080f578063f3f526cc14610822578063f6bf10d414610835578063f6c3c0451461084857600080fd5b8063d4ffca2d146107b2578063e2716580146107c5578063ecee6f41146107e9578063f103e57b146107fc57600080fd5b8063b85c6bba116100e9578063b85c6bba14610767578063be97d93b14610774578063c09304431461077c578063d3a5be491461079f57600080fd5b8063a88e9aa314610743578063ac4746ab1461074b578063af8cb7621461075457600080fd5b80638c4132c81161018757806393b386a81161015657806393b386a81461049957806399b26d3f146107155780639a01693514610728578063a81dc1fd1461073057600080fd5b80638c4132c8146106ae5780638c9f11b8146106ce5780638da5cb5b146106e15780638eddd941146106f257600080fd5b806384d5e6dc116101c357806384d5e6dc1461066757806385483e961461066f5780638a74970e146106775780638ae6df381461068a57600080fd5b806374a2ad1b146106395780638129fc1c1461064c57806384ca96261461065457600080fd5b806346471824116102ce5780635ac8ff921161026c57806365c238c81161023b57806365c238c8146106025780636d4643a514610615578063715018a61461061e578063723f03a81461062657600080fd5b80635ac8ff92146105745780635c975abb1461059d5780635ee82ace146105e157806360ff9eab146105ef57600080fd5b806349cf26c0116102a857806349cf26c0146105115780634e2b2e331461051a5780634e67d9fb1461054157806358b0bb121461056157600080fd5b806346471824146104c857806346e3a869146104eb57806349a9ba31146104fe57600080fd5b806332e4c9901161033b57806336b2c4b21161031557806336b2c4b2146104865780633ea5206114610499578063420ee584146104a25780634218156f146104b557600080fd5b806332e4c9901461044257806333c437c91461045557806335387e441461046857600080fd5b8063217ba79011610377578063217ba790146103e957806321a46a4b146103fc57806321c024c914610404578063320069a11461041757600080fd5b8063054993291461039e5780630af65929146103b35780630c939a80146103d2575b600080fd5b6103b16103ac366004614915565b610851565b005b6103bb600381565b60405160ff90911681526020015b60405180910390f35b6103db611af481565b6040519081526020016103c9565b6103b16103f736600461493d565b6108e3565b6103b161098b565b6103b161041236600461499f565b610ba8565b60a35461042a906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b6103b1610450366004614a06565b610f6c565b609d5461042a906001600160a01b031681565b6104716104b081565b60405163ffffffff90911681526020016103c9565b609c5461042a906001600160a01b031681565b6104716102bc81565b6103b16104b0366004614a06565b611310565b6103b16104c3366004614a06565b6116a9565b6104db6104d636600461499f565b6118ba565b60405190151581526020016103c9565b6103b16104f936600461499f565b611903565b609b5461042a906001600160a01b031681565b6103db60995481565b6103db61052836600461499f565b61ffff16600090815260a2602052604090206003015490565b61055461054f366004614a06565b611e58565b6040516103c99190614a96565b6103db61056f366004614af9565b611f9e565b60975461058a90640100000000900461ffff1681565b60405161ffff90911681526020016103c9565b609f546105bd9060ff808216916101008104821691620100009091041683565b6040805160ff948516815292841660208401529216918101919091526060016103c9565b60975461058a9061ffff1681565b6103b16105fd366004614af9565b612234565b6103b161061036600461499f565b6122f6565b6103db609a5481565b6103b1612437565b6103b1610634366004614a06565b61246d565b6103b1610647366004614a06565b612c68565b6103b1612e1c565b6103b1610662366004614915565b612ebf565b609a546103db565b610471600d81565b6103b1610685366004614af9565b612f0f565b6103db61069836600461499f565b61ffff16600090815260a0602052604090205490565b6106c16106bc36600461499f565b612f96565b6040516103c99190614b16565b6103b16106dc366004614af9565b613013565b6033546001600160a01b031661042a565b6103bb61070036600461499f565b60a46020526000908152604090205460ff1681565b6103db610723366004614af9565b61309f565b610471606481565b6103b161073e366004614915565b613509565b610471600981565b6103db60985481565b6103b1610762366004614af9565b61356e565b60a6546103bb9060ff1681565b610471601781565b6103bb61078a366004614b24565b60a56020526000908152604090205460ff1681565b6103b16107ad366004614a06565b6135f4565b6103b16107c0366004614bb0565b613aaf565b6103db6107d336600461499f565b61ffff16600090815260a1602052604090205490565b6103b16107f736600461499f565b613f1d565b6103b161080a366004614af9565b613fbc565b6103b161081d366004614af9565b614041565b6103b1610830366004614a06565b6140d9565b609e5461042a906001600160a01b031681565b6103db6108fc81565b6033546001600160a01b031633146108845760405162461bcd60e51b815260040161087b90614c83565b60405180910390fd5b60998190556040516e090d2ecca8ae0dec6d098cadccee8d608b1b8152600f015b604051908190038120828252907f8900c724b8277bf649404278b740479df79c4d47d3c867e02c2fb2702e6f74c2906020015b60405180910390a250565b6033546001600160a01b0316331461090d5760405162461bcd60e51b815260040161087b90614c83565b609f805462ffff0019166201000060ff86811691820261ff001916929092176101008684169081029190911760ff1916928516928317909355604080519182526020820193909352918201527f6f745a4eb556eef343d02d576c54dfd149a44d81e295a919ce0ede3d3c1eef3e9060600160405180910390a1505050565b6033546001600160a01b031633146109b55760405162461bcd60e51b815260040161087b90614c83565b60a68054600560ff199182161790915560a56020527f5a58a35f79c96918ba4a26566c02f84b94e945aad283848d088844a1238e942d80548216600a9081179091557f25b4c4067fa5990834207d22a094343a18a3a1d6e794b6c377f621345ba1b0c68054600e9084161790557f3cdd87bd16aed04484229287c5bc39384778a2cba3efb90ce9f23f83f81cfedb8054831660101790557f60950aeed661ece425cb83177e7fe55183290b4b66233dd01fa637eb96ffffb8805460149084161790557f78e4ee5a8306b32d0180407e003bf726aaa8568761ae802e03feaa77282b20038054831660189081179091557f5600e9f52cda508198e323f416d174680616183df9985b4146c6dbf94333cc338054841690911790557f9b64440650c2243ab519809ee4ab2ff3fc62fe1649d4d69597992711ee1d8b0f8054601e9084161790557fbe1b774322458fba870f6e9fd8466f83d890728fff080f54030877813a5a8c2c80548316601f1790557f956a2aee9baa35dae865e3a6bdb9f4049fa0bb5efc5681585f1349b9019698f0805460289084161790557f894b45b02714d4a6fec538dd04ddc97a06dc72e6b0a829eff008ab8aaab758878054831660271790556000527fdd6393fc2130774a649b718e55d063c8d036e29799b544f06916d3e0fea54ba380549091166034179055565b60026065541415610bcb5760405162461bcd60e51b815260040161087b90614cce565b6002606555609f54610100900460ff1615610bf85760405162461bcd60e51b815260040161087b90614d05565b609d546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c779190614d25565b6001600160a01b031614610cbd5760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420796f7572206869766560981b604482015260640161087b565b609d5460405163ae953d8960e01b815261ffff831660048201526003916001600160a01b03169063ae953d899060240160206040518083038186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3d9190614d42565b60ff161015610d805760405162461bcd60e51b815260206004820152600f60248201526e10d85c081b9bdd081c995858da1959608a1b604482015260640161087b565b610d93611af4662386f26fc10000614d75565b609c546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610dd657600080fd5b505afa158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e9190614d94565b1015610e4f5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820486f6e657960801b604482015260640161087b565b609c546001600160a01b0316639dc29fac33610e74611af4662386f26fc10000614d75565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b5050609d54604051630b3e286360e11b815261ffff851660048201526001600160a01b03909116925063167c50c69150602401600060405180830381600087803b158015610f1b57600080fd5b505af1158015610f2f573d6000803e3d6000fd5b505060405161ffff841692503391507ff49897e9eea917a865792129274a2f6ee90255068c08d6e4d78701370d4d263d90600090a3506001606555565b60026065541415610f8f5760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff1615610fb75760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561118457600084848361ffff16818110610fdf57610fdf614dad565b9050602002016020810190610ff4919061499f565b61ffff8116600090815260a260205260409020805491925090611018575050611172565b600181015460ff1661102b575050611172565b6001818101546301000000900460ff161415611048575050611172565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561108f57600080fd5b505afa1580156110a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c79190614d25565b6001600160a01b0316146110dc575050611172565b60985460018201546000916110f991610100900461ffff16614d75565b82600301546111089190614dc3565b905080421061111957505050611172565b6111256102bc86614dc3565b60018301805463ff0000001916630100000017905560405190955061ffff84169033907f3a217120d9f10810399d7af913c94d3a3f1b5b82c1899990c5c399ea627ff35890600090a35050505b8061117c81614ddb565b915050610fbb565b50600081116111c85760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f207374616b6560801b604482015260640161087b565b6111d981662386f26fc10000614d75565b609c546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b15801561122157600080fd5b505afa158015611235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112599190614d94565b101561129a5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820686f6e657960801b604482015260640161087b565b801561130657609c54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac906044015b600060405180830381600087803b1580156112ed57600080fd5b505af1158015611301573d6000803e3d6000fd5b505050505b5050600160655550565b600260655414156113335760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff161561135b5760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561155657600084848361ffff1681811061138357611383614dad565b9050602002016020810190611398919061499f565b61ffff8116600090815260a2602052604090208054919250906113bc575050611544565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561140357600080fd5b505afa158015611417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143b9190614d25565b6001600160a01b031614611450575050611544565b6001818101546301000000900460ff16141561146d575050611544565b600181015460ff16611480575050611544565b600181015460985461010090910461ffff169061149d9082614d75565b82600301546114ac9190614dc3565b4211156114bb57505050611544565b6114c6601786614dc3565b6097549095506114da9061ffff1682614dc3565b60975490915061ffff168114156114f2574260048301555b60018201805461ffff8084166101000262ffff0019909216919091179091556040519084169033907f0fdfd2278a82d89a285de1659c49e93d0371d707c27ecacda4f1bbf8f7db693590600090a35050505b8061154e81614ddb565b91505061135f565b50600081116115a05760405162461bcd60e51b81526020600482015260166024820152754e6f7468696e6720746f206b6565702061637469766560501b604482015260640161087b565b6115b181662386f26fc10000614d75565b609c546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190614d94565b10156116725760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820686f6e657960801b604482015260640161087b565b609c54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac906044016112d3565b600260655414156116cc5760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff16156116f45760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561187357600084848361ffff1681811061171c5761171c614dad565b9050602002016020810190611731919061499f565b61ffff8116600090815260a260205260409020805491925090611755575050611861565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561179c57600080fd5b505afa1580156117b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d49190614d25565b6001600160a01b0316146117e9575050611861565b6117f56102bc85614dc3565b6001828101805460ff1981168317825560975462ffffff1990911661010061ffff928316021790921790554260038401819055600484015560405191955083169033907fc1d9120cbac78180337285e846163621e353501870b4e46763cd01d125bc5f0790600090a350505b8061186b81614ddb565b9150506116f8565b50600081116115a05760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20616374697661746560681b604482015260640161087b565b61ffff808216600090815260a2602052604081206098546001820154929391926118ea9261010090910416614d75565b81600301546118f99190614dc3565b4210159392505050565b600260655414156119265760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff161561194e5760405162461bcd60e51b815260040161087b90614d05565b336119975760405162461bcd60e51b8152602060048201526019602482015278043616e206e6f74206d696e7420746f2061646472657373203603c1b604482015260640161087b565b609d546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b1580156119de57600080fd5b505afa1580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a169190614d25565b6001600160a01b031614611a5c5760405162461bcd60e51b815260206004820152600d60248201526c139bc8121a5d99481bdddb9959609a1b604482015260640161087b565b611a6f6108fc662386f26fc10000614d75565b609c546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611ab257600080fd5b505afa158015611ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aea9190614d94565b1015611b2b5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820486f6e657960801b604482015260640161087b565b609954611b389042614dfd565b61ffff8216600090815260a1602052604090205410611b8d5760405162461bcd60e51b815260206004820152601160248201527026b4b73a103132b29031b7b7b63237bbb760791b604482015260640161087b565b6000611b976143c9565b905060008161ffff1611611bdb5760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0819985a5b195960aa1b604482015260640161087b565b61ffff808316600090815260a1602090815260408083204290819055815160e0810183528686168082526001828601818152609780548a16858801908152606086018a8152608087018b815260a0880189815260c08901998a52968c5260a2909a529790992094518555905191840180549851965160ff90811663010000000263ff00000019988c166101000262ffffff19909b169490911693909317989098179590951617909555925160028401559251600383015591516004918201558154640100000000900490921691611cb183614ddb565b82546101009290920a61ffff818102199093169183160217909155609d5460405163617a881b60e01b815291851660048301526001600160a01b0316915063617a881b90602401600060405180830381600087803b158015611d1257600080fd5b505af1158015611d26573d6000803e3d6000fd5b5050609c546001600160a01b03169150639dc29fac905033611d516108fc662386f26fc10000614d75565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d9757600080fd5b505af1158015611dab573d6000803e3d6000fd5b5050609e546040516340c10f1960e01b815233600482015261ffff851660248201526001600160a01b0390911692506340c10f199150604401600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b505060405161ffff841681523392507fa72b9f69ceff29b665f9add67b0f19138fd338f2e79ece3cdcd167943e531a58915060200160405180910390a250506001606555565b60608167ffffffffffffffff811115611e7357611e73614b45565b604051908082528060200260200182016040528015611eac57816020015b611e996148ce565b815260200190600190039081611e915790505b50905060005b61ffff8116831115611f965760a2600085858461ffff16818110611ed857611ed8614dad565b9050602002016020810190611eed919061499f565b61ffff90811682526020808301939093526040918201600020825160e08101845281548152600182015460ff8082169683019690965261010081048416948201949094526301000000909304909316606083015260028301546080830152600383015460a083015260049092015460c0820152835190918491908416908110611f7857611f78614dad565b60200260200101819052508080611f8e90614ddb565b915050611eb2565b505b92915050565b609b54604051632118854760e21b81526001600160a01b0383811660048301526000928392911690638462151c9060240160006040518083038186803b158015611fe757600080fd5b505afa158015611ffb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120239190810190614e14565b905060005b81518161ffff16101561221b576000828261ffff168151811061204d5761204d614dad565b6020908102919091010151609b54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b1580156120a057600080fd5b505afa1580156120b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d89190614ea5565b6120e25750612209565b609b546040516331a9108f60e11b815261ffff831660048201526001600160a01b03878116921690636352211e9060240160206040518083038186803b15801561212b57600080fd5b505afa15801561213f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121639190614d25565b6001600160a01b0316146121775750612209565b61ffff8116600090815260a06020526040812054801580159061219b5750609a5481115b156121be576098546121ad8242614dfd565b6121b79190614edd565b91506121ee565b609a544210156121d157600091506121ee565b609854609a546121e19042614dfd565b6121eb9190614edd565b91505b6121f9826064614d75565b6122039087614dc3565b95505050505b8061221381614ddb565b915050612028565b5061222d82662386f26fc10000614d75565b9392505050565b6033546001600160a01b0316331461225e5760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b0381166122845760405162461bcd60e51b815260040161087b90614ef1565b609e80546001600160a01b0319166001600160a01b038316179055604051694265657344656c75786560b01b8152600a015b6040519081900381206001600160a01b0383168252907fbf2cc7083b32d1f5c82633af784e1285df86eb43c88d0752feea4bebb4a0b6d2906020016108d8565b600260655414156123195760405162461bcd60e51b815260040161087b90614cce565b6002606555609f54610100900460ff16156123465760405162461bcd60e51b815260040161087b90614d05565b3361238f5760405162461bcd60e51b8152602060048201526019602482015278043616e206e6f74206d696e7420746f2061646472657373203603c1b604482015260640161087b565b609d546040516340c10f1960e01b815233600482015261ffff831660248201526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156123de57600080fd5b505af11580156123f2573d6000803e3d6000fd5b505060405161ffff841681523392507ff6b907f000734a9a2ead9c2160cb1cc3ae13292659e4d5a5f9bb983d519474a3915060200160405180910390a2506001606555565b6033546001600160a01b031633146124615760405162461bcd60e51b815260040161087b90614c83565b61246b6000614668565b565b600260655414156124905760405162461bcd60e51b815260040161087b90614cce565b6002606555609a5442116124dd5760405162461bcd60e51b815260206004820152601460248201527314995dd85c991cc8191a591b89dd081cdd185c9d60621b604482015260640161087b565b609f5460ff16156125005760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561294357600084848361ffff1681811061252857612528614dad565b905060200201602081019061253d919061499f565b609e54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b15801561258557600080fd5b505afa158015612599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125bd9190614ea5565b6125c75750612931565b609e546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561260e57600080fd5b505afa158015612622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126469190614d25565b6001600160a01b03161461265a5750612931565b61ffff8116600090815260a260205260409020805415806126805750600181015460ff16155b1561268c575050612931565b600381015460018201546000908190600a906301000000900460ff166128375760048501546126bd57600485018490555b60985460018601546000916126da91610100900461ffff16614d75565b6126e49086614dc3565b90508042106127335760006126f98683614dfd565b9050609854816127099190614edd565b945061271685600d614d75565b60018801805462ffffff1916905542600289015593506127959050565b6098546127408642614dfd565b61274a9190614edd565b935061275784600d614d75565b9250838660010160018282829054906101000a900461ffff1661277a9190614f1f565b92506101000a81548161ffff021916908361ffff1602179055505b61ffff8716600090815260a4602052604090205460ff16156128315761ffff8716600090815260a4602052604081205460a591906001906127da9060ff166002614f42565b6127e49190614f6b565b60ff16600a8111156127f8576127f8614cb8565b600a81111561280957612809614cb8565b600a81111561281a5761281a614cb8565b815260208101919091526040016000205460ff1691505b5061290b565b6001858101546301000000900460ff16141561290b5760985461285a8542614dfd565b6128649190614edd565b61286f906009614d75565b6128799083614dc3565b61ffff8716600090815260a4602052604090205490925060ff161561290b5761ffff8616600090815260a4602052604081205460a591906128be9060ff166002614f42565b60ff16600a8111156128d2576128d2614cb8565b600a8111156128e3576128e3614cb8565b600a8111156128f4576128f4614cb8565b815260208101919091526040016000205460ff1690505b6129158183614d75565b61291f9089614dc3565b97504285600301819055505050505050505b8061293b81614ddb565b915050612504565b50600081116129875760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b604482015260640161087b565b6129988166038d7ea4c68000614d75565b9050609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e857600080fd5b505afa1580156129fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a209190614d94565b609c54604080516318160ddd60e01b8152905184926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015612a6457600080fd5b505afa158015612a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9c9190614d94565b612aa69190614dc3565b1115612bc557609c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612afa57600080fd5b505afa158015612b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b329190614d94565b609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8057600080fd5b505afa158015612b94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb89190614d94565b612bc29190614dfd565b90505b609c546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015612c1157600080fd5b505af1158015612c25573d6000803e3d6000fd5b50506040518381523392507f258e6d8bbf25dcd0a12d45ef02d409614b701b29f42df2c374756afb6d387242915060200160405180910390a25050600160655550565b60026065541415612c8b5760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff1615612cb35760405162461bcd60e51b815260040161087b90614d05565b60005b61ffff811682111561130657600083838361ffff16818110612cda57612cda614dad565b9050602002016020810190612cef919061499f565b61ffff8116600090815260a260205260409020805491925090612d13575050612e0a565b60018101546301000000900460ff16612d2d575050612e0a565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b158015612d7457600080fd5b505afa158015612d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dac9190614d25565b6001600160a01b031614612dc1575050612e0a565b60018101805463ff0000001916905542600482015560405161ffff83169033907f54753f57c3fdfcf5a9f22cd75f9456acb076e936f7c3d85d8e81fd5e096c795490600090a350505b80612e1481614ddb565b915050612cb6565b600054610100900460ff1680612e35575060005460ff16155b612e515760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff16158015612e73576000805461ffff19166101011790555b612e7b6146ba565b612e83614735565b6097805463ffffffff191663ffff000a1790556201518060988190556099556361743530609a558015612ebc576000805461ff00191690555b50565b6033546001600160a01b03163314612ee95760405162461bcd60e51b815260040161087b90614c83565b60988190556040516f090dedccaf28ae0dec6d098cadccee8d60831b81526010016108a5565b6033546001600160a01b03163314612f395760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b038116612f5f5760405162461bcd60e51b815260040161087b90614ef1565b609b80546001600160a01b0319166001600160a01b0383161790556040516a426561727344656c75786560a81b8152600b016122b6565b612f9e6148ce565b5061ffff908116600090815260a26020908152604091829020825160e08101845281548152600182015460ff80821694830194909452610100810490951693810193909352630100000090930416606082015260028201546080820152600382015460a082015260049091015460c082015290565b6033546001600160a01b0316331461303d5760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b0381166130635760405162461bcd60e51b815260040161087b90614ef1565b60a380546001600160a01b0319166001600160a01b0383161790556040516f486f6e6579436f6d627344656c75786560801b81526010016122b6565b609e54604051632118854760e21b81526001600160a01b0383811660048301526000928392911690638462151c9060240160006040518083038186803b1580156130e857600080fd5b505afa1580156130fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131249190810190614e14565b905060005b81518161ffff1610156134f7576000828261ffff168151811061314e5761314e614dad565b6020908102919091010151609e54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b1580156131a157600080fd5b505afa1580156131b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d99190614ea5565b6131e357506134e5565b609e546040516331a9108f60e11b815261ffff831660048201526001600160a01b03878116921690636352211e9060240160206040518083038186803b15801561322c57600080fd5b505afa158015613240573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132649190614d25565b6001600160a01b03161461327857506134e5565b61ffff8116600090815260a2602052604090208054158061329e5750600181015460ff16155b156132aa5750506134e5565b600381015460018201546000908190600a906301000000900460ff166133f45760985460018601546000916132e791610100900461ffff16614d75565b6132f19086614dc3565b905080421061332b5760006133068683614dfd565b9050609854816133169190614edd565b945061332385600d614d75565b935050613352565b6098546133388642614dfd565b6133429190614edd565b935061334f84600d614d75565b92505b61ffff8716600090815260a4602052604090205460ff16156133ee5761ffff8716600090815260a4602052604081205460a591906001906133979060ff166002614f42565b6133a19190614f6b565b60ff16600a8111156133b5576133b5614cb8565b600a8111156133c6576133c6614cb8565b600a8111156133d7576133d7614cb8565b815260208101919091526040016000205460ff1691505b506134c8565b6001858101546301000000900460ff1614156134c8576098546134178542614dfd565b6134219190614edd565b61342c906009614d75565b6134369083614dc3565b61ffff8716600090815260a4602052604090205490925060ff16156134c85761ffff8616600090815260a4602052604081205460a5919061347b9060ff166002614f42565b60ff16600a81111561348f5761348f614cb8565b600a8111156134a0576134a0614cb8565b600a8111156134b1576134b1614cb8565b815260208101919091526040016000205460ff1690505b6134d28183614d75565b6134dc908a614dc3565b98505050505050505b806134ef81614ddb565b915050613129565b5061222d8266038d7ea4c68000614d75565b6033546001600160a01b031633146135335760405162461bcd60e51b815260040161087b90614c83565b609a8190556040518181527f9d86a54a685ef1d2e3a4057066e86daa95db7e8918c2a9f2279b1010a72fc5a09060200160405180910390a150565b6033546001600160a01b031633146135985760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b0381166135be5760405162461bcd60e51b815260040161087b90614ef1565b609c80546001600160a01b0319166001600160a01b038316179055604051692437b732bcaa37b5b2b760b11b8152600a016122b6565b600260655414156136175760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff161561363f5760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff81168311156138cb57600084848361ffff1681811061366757613667614dad565b905060200201602081019061367c919061499f565b609e546040516331a9108f60e11b815261ffff831660048201529192506000916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156136c957600080fd5b505afa1580156136dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137019190614d25565b6001600160a01b0316141561374e5761ffff16600090815260a26020526040812081815560018101805463ffffffff1916905560028101829055600381018290556004015550613aa69050565b609e546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561379557600080fd5b505afa1580156137a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cd9190614d25565b6001600160a01b0316146137e157506138b9565b61ffff8116600090815260a26020526040812081815560018101805463ffffffff191690556002810182905560038101829055600401556138246104b084614dc3565b609e546040516388157c9760e01b815261ffff841660048201529194506001600160a01b0316906388157c9790602401600060405180830381600087803b15801561386e57600080fd5b505af1158015613882573d6000803e3d6000fd5b505060405161ffff841692503391507f867faa498a34a8b06889d023b7da91b733f57d42f4c960b9124ea1a36c0e4c2990600090a3505b806138c381614ddb565b915050613643565b506138dd81662386f26fc10000614d75565b9050600081116139215760405162461bcd60e51b815260206004820152600f60248201526e2737ba3434b733903a3790313ab93760891b604482015260640161087b565b609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b15801561396f57600080fd5b505afa158015613983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a79190614d94565b609c54604080516318160ddd60e01b8152905184926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156139eb57600080fd5b505afa1580156139ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a239190614d94565b613a2d9190614dc3565b1115613a6f5760405162461bcd60e51b8152602060048201526011602482015270121bdb995e4818d85c081c995858da1959607a1b604482015260640161087b565b609c546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f19906044016112d3565b50506001606555565b60026065541415613ad25760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff1615613afa5760405162461bcd60e51b815260040161087b90614d05565b609e546040516331a9108f60e11b815261ffff8616600482015233916001600160a01b031690636352211e9060240160206040518083038186803b158015613b4157600080fd5b505afa158015613b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b799190614d25565b6001600160a01b031614613bc85760405162461bcd60e51b8152602060048201526016602482015275596f7520646f6e2774206f776e20746869732042656560501b604482015260640161087b565b80518214613c0a5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081c995c5d595cdd608a1b604482015260640161087b565b61ffff8416600090815260a4602052604081205460ff16905b83811015613e6d576000858583818110613c3f57613c3f614dad565b905060200201359050838281518110613c5a57613c5a614dad565b602090810291909101015160a354604051627eeac760e11b8152336004820152602481018490526001600160a01b039091169062fdd58e9060440160206040518083038186803b158015613cad57600080fd5b505afa158015613cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce59190614d94565b1080613cf6575060a65460ff168310155b15613d015750613e5b565b82848381518110613d1457613d14614dad565b6020026020010151826001613d299190614dc3565b613d339190614d75565b613d3d9190614dc3565b60a65490935060ff168310613dbb57613d57816001614dc3565b60a654613d679060ff1685614dfd565b613d719190614edd565b848381518110613d8357613d83614dad565b6020026020010151613d959190614dfd565b848381518110613da757613da7614dad565b602090810291909101015260a65460ff1692505b60a35484516001600160a01b039091169063f5298aca9033908490889087908110613de857613de8614dad565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526044820152606401600060405180830381600087803b158015613e4157600080fd5b505af1158015613e55573d6000803e3d6000fd5b50505050505b80613e6581614fdc565b915050613c23565b5060a65460ff16811115613eb85760405162461bcd60e51b815260206004820152601260248201527113195d995b1a5b99c81d5c0819985a5b195960721b604482015260640161087b565b61ffff8516600081815260a46020908152604091829020805460ff191660ff8616179055815192835282018390527fdd4c13c4424c8513dd8d7d4660ef23fef72bf898ff3165d37f9034bdbd007dd5910160405180910390a150506001606555505050565b6033546001600160a01b03163314613f475760405162461bcd60e51b815260040161087b90614c83565b6097805461ffff191661ffff83161790556040517f4e6f4f6645706f63684265666f7265496e6163746976654265650000000000008152601a0160405190819003812061ffff83168252907f8900c724b8277bf649404278b740479df79c4d47d3c867e02c2fb2702e6f74c2906020016108d8565b6033546001600160a01b03163314613fe65760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b03811661400c5760405162461bcd60e51b815260040161087b90614ef1565b609d80546001600160a01b0319166001600160a01b03831617905560405168486f6e65794869766560b81b81526009016122b6565b6033546001600160a01b0316331461406b5760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b0381166140d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161087b565b612ebc81614668565b600260655414156140fc5760405162461bcd60e51b815260040161087b90614cce565b6002606555609a5442116141495760405162461bcd60e51b815260206004820152601460248201527314995dd85c991cc8191a591b89dd081cdd185c9d60621b604482015260640161087b565b609f5462010000900460ff16156141725760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561437457600084848361ffff1681811061419a5761419a614dad565b90506020020160208101906141af919061499f565b609b54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b1580156141f757600080fd5b505afa15801561420b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061422f9190614ea5565b6142395750614362565b609b546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561428057600080fd5b505afa158015614294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b89190614d25565b6001600160a01b0316146142cc5750614362565b61ffff8116600090815260a0602052604081205480158015906142f05750609a5481115b15614313576098546143028242614dfd565b61430c9190614edd565b9150614330565b609854609a546143239042614dfd565b61432d9190614edd565b91505b61433b826064614d75565b6143459086614dc3565b61ffff909316600090815260a06020526040902042905550909250505b8061436c81614ddb565b915050614176565b50600081116143b85760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b604482015260640161087b565b61299881662386f26fc10000614d75565b6000806000609e60009054906101000a90046001600160a01b03166001600160a01b0316634c0f38c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561441c57600080fd5b505afa158015614430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144549190614d94565b60975490915061ffff80831664010000000090920416106144ac5760405162461bcd60e51b815260206004820152601260248201527113505617d4d554141316481c995858da195960721b604482015260640161087b565b6097546040516bffffffffffffffffffffffff193360601b1660208201524460348201524260548201524360748201526001600160f01b031964010000000090920460f090811b8316609483015284901b909116609682015260009060980160408051601f198184030181529190528051602090910120905061452f8282614ff7565b93508261453b81614ddb565b93505061ffff841661454b578193505b61ffff8416600090815260a2602052604090205461459a5760975461ffff6201000090910481169085161015614594576097805463ffff000019166201000061ffff8716021790555b50505090565b60028361ffff1611156146625760005b60975462010000900461ffff16600090815260a260205260409020541561464c576097805462010000900461ffff169060026145e583614ddb565b91906101000a81548161ffff021916908361ffff160217905550508261ffff16609760029054906101000a900461ffff1661ffff16141561464757801561463157600094505050505090565b506097805463ffff000019166201000017905560015b6145aa565b505060975462010000900461ffff169392505050565b506144ac565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806146d3575060005460ff16155b6146ef5760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff16158015614711576000805461ffff19166101011790555b614719614794565b6147216147fe565b8015612ebc576000805461ff001916905550565b600054610100900460ff168061474e575060005460ff16155b61476a5760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff1615801561478c576000805461ffff19166101011790555b61472161485e565b600054610100900460ff16806147ad575060005460ff16155b6147c95760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff16158015614721576000805461ffff19166101011790558015612ebc576000805461ff001916905550565b600054610100900460ff1680614817575060005460ff16155b6148335760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff16158015614855576000805461ffff19166101011790555b61472133614668565b600054610100900460ff1680614877575060005460ff16155b6148935760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff161580156148b5576000805461ffff19166101011790555b60016065558015612ebc576000805461ff001916905550565b6040518060e0016040528060008152602001600060ff168152602001600061ffff168152602001600060ff1681526020016000815260200160008152602001600081525090565b60006020828403121561492757600080fd5b5035919050565b60ff81168114612ebc57600080fd5b60008060006060848603121561495257600080fd5b833561495d8161492e565b9250602084013561496d8161492e565b9150604084013561497d8161492e565b809150509250925092565b803561ffff8116811461499a57600080fd5b919050565b6000602082840312156149b157600080fd5b61222d82614988565b60008083601f8401126149cc57600080fd5b50813567ffffffffffffffff8111156149e457600080fd5b6020830191508360208260051b85010111156149ff57600080fd5b9250929050565b60008060208385031215614a1957600080fd5b823567ffffffffffffffff811115614a3057600080fd5b614a3c858286016149ba565b90969095509350505050565b8051825260ff602082015116602083015261ffff604082015116604083015260ff60608201511660608301526080810151608083015260a081015160a083015260c081015160c08301525050565b6020808252825182820181905260009190848201906040850190845b81811015614ad857614ac5838551614a48565b9284019260e09290920191600101614ab2565b50909695505050505050565b6001600160a01b0381168114612ebc57600080fd5b600060208284031215614b0b57600080fd5b813561222d81614ae4565b60e08101611f988284614a48565b600060208284031215614b3657600080fd5b8135600b811061222d57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614b8457614b84614b45565b604052919050565b600067ffffffffffffffff821115614ba657614ba6614b45565b5060051b60200190565b60008060008060608587031215614bc657600080fd5b614bcf85614988565b935060208086013567ffffffffffffffff80821115614bed57600080fd5b614bf989838a016149ba565b90965094506040880135915080821115614c1257600080fd5b508601601f81018813614c2457600080fd5b8035614c37614c3282614b8c565b614b5b565b81815260059190911b8201830190838101908a831115614c5657600080fd5b928401925b82841015614c7457833582529284019290840190614c5b565b979a9699509497505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052602160045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b600060208284031215614d3757600080fd5b815161222d81614ae4565b600060208284031215614d5457600080fd5b815161222d8161492e565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614d8f57614d8f614d5f565b500290565b600060208284031215614da657600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b60008219821115614dd657614dd6614d5f565b500190565b600061ffff80831681811415614df357614df3614d5f565b6001019392505050565b600082821015614e0f57614e0f614d5f565b500390565b60006020808385031215614e2757600080fd5b825167ffffffffffffffff811115614e3e57600080fd5b8301601f81018513614e4f57600080fd5b8051614e5d614c3282614b8c565b81815260059190911b82018301908381019087831115614e7c57600080fd5b928401925b82841015614e9a57835182529284019290840190614e81565b979650505050505050565b600060208284031215614eb757600080fd5b8151801515811461222d57600080fd5b634e487b7160e01b600052601260045260246000fd5b600082614eec57614eec614ec7565b500490565b602080825260149082015273043616e206e6f74206265206164647265737320360641b604082015260600190565b600061ffff83811690831681811015614f3a57614f3a614d5f565b039392505050565b600060ff821660ff84168160ff0481118215151615614f6357614f63614d5f565b029392505050565b600060ff821660ff841680821015614f8557614f85614d5f565b90039392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000600019821415614ff057614ff0614d5f565b5060010190565b600061ffff8084168061500c5761500c614ec7565b9216919091069291505056fea164736f6c6343000809000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103995760003560e01c806374a2ad1b116101e9578063a88e9aa31161010f578063d4ffca2d116100ad578063f2fde38b1161007c578063f2fde38b1461080f578063f3f526cc14610822578063f6bf10d414610835578063f6c3c0451461084857600080fd5b8063d4ffca2d146107b2578063e2716580146107c5578063ecee6f41146107e9578063f103e57b146107fc57600080fd5b8063b85c6bba116100e9578063b85c6bba14610767578063be97d93b14610774578063c09304431461077c578063d3a5be491461079f57600080fd5b8063a88e9aa314610743578063ac4746ab1461074b578063af8cb7621461075457600080fd5b80638c4132c81161018757806393b386a81161015657806393b386a81461049957806399b26d3f146107155780639a01693514610728578063a81dc1fd1461073057600080fd5b80638c4132c8146106ae5780638c9f11b8146106ce5780638da5cb5b146106e15780638eddd941146106f257600080fd5b806384d5e6dc116101c357806384d5e6dc1461066757806385483e961461066f5780638a74970e146106775780638ae6df381461068a57600080fd5b806374a2ad1b146106395780638129fc1c1461064c57806384ca96261461065457600080fd5b806346471824116102ce5780635ac8ff921161026c57806365c238c81161023b57806365c238c8146106025780636d4643a514610615578063715018a61461061e578063723f03a81461062657600080fd5b80635ac8ff92146105745780635c975abb1461059d5780635ee82ace146105e157806360ff9eab146105ef57600080fd5b806349cf26c0116102a857806349cf26c0146105115780634e2b2e331461051a5780634e67d9fb1461054157806358b0bb121461056157600080fd5b806346471824146104c857806346e3a869146104eb57806349a9ba31146104fe57600080fd5b806332e4c9901161033b57806336b2c4b21161031557806336b2c4b2146104865780633ea5206114610499578063420ee584146104a25780634218156f146104b557600080fd5b806332e4c9901461044257806333c437c91461045557806335387e441461046857600080fd5b8063217ba79011610377578063217ba790146103e957806321a46a4b146103fc57806321c024c914610404578063320069a11461041757600080fd5b8063054993291461039e5780630af65929146103b35780630c939a80146103d2575b600080fd5b6103b16103ac366004614915565b610851565b005b6103bb600381565b60405160ff90911681526020015b60405180910390f35b6103db611af481565b6040519081526020016103c9565b6103b16103f736600461493d565b6108e3565b6103b161098b565b6103b161041236600461499f565b610ba8565b60a35461042a906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b6103b1610450366004614a06565b610f6c565b609d5461042a906001600160a01b031681565b6104716104b081565b60405163ffffffff90911681526020016103c9565b609c5461042a906001600160a01b031681565b6104716102bc81565b6103b16104b0366004614a06565b611310565b6103b16104c3366004614a06565b6116a9565b6104db6104d636600461499f565b6118ba565b60405190151581526020016103c9565b6103b16104f936600461499f565b611903565b609b5461042a906001600160a01b031681565b6103db60995481565b6103db61052836600461499f565b61ffff16600090815260a2602052604090206003015490565b61055461054f366004614a06565b611e58565b6040516103c99190614a96565b6103db61056f366004614af9565b611f9e565b60975461058a90640100000000900461ffff1681565b60405161ffff90911681526020016103c9565b609f546105bd9060ff808216916101008104821691620100009091041683565b6040805160ff948516815292841660208401529216918101919091526060016103c9565b60975461058a9061ffff1681565b6103b16105fd366004614af9565b612234565b6103b161061036600461499f565b6122f6565b6103db609a5481565b6103b1612437565b6103b1610634366004614a06565b61246d565b6103b1610647366004614a06565b612c68565b6103b1612e1c565b6103b1610662366004614915565b612ebf565b609a546103db565b610471600d81565b6103b1610685366004614af9565b612f0f565b6103db61069836600461499f565b61ffff16600090815260a0602052604090205490565b6106c16106bc36600461499f565b612f96565b6040516103c99190614b16565b6103b16106dc366004614af9565b613013565b6033546001600160a01b031661042a565b6103bb61070036600461499f565b60a46020526000908152604090205460ff1681565b6103db610723366004614af9565b61309f565b610471606481565b6103b161073e366004614915565b613509565b610471600981565b6103db60985481565b6103b1610762366004614af9565b61356e565b60a6546103bb9060ff1681565b610471601781565b6103bb61078a366004614b24565b60a56020526000908152604090205460ff1681565b6103b16107ad366004614a06565b6135f4565b6103b16107c0366004614bb0565b613aaf565b6103db6107d336600461499f565b61ffff16600090815260a1602052604090205490565b6103b16107f736600461499f565b613f1d565b6103b161080a366004614af9565b613fbc565b6103b161081d366004614af9565b614041565b6103b1610830366004614a06565b6140d9565b609e5461042a906001600160a01b031681565b6103db6108fc81565b6033546001600160a01b031633146108845760405162461bcd60e51b815260040161087b90614c83565b60405180910390fd5b60998190556040516e090d2ecca8ae0dec6d098cadccee8d608b1b8152600f015b604051908190038120828252907f8900c724b8277bf649404278b740479df79c4d47d3c867e02c2fb2702e6f74c2906020015b60405180910390a250565b6033546001600160a01b0316331461090d5760405162461bcd60e51b815260040161087b90614c83565b609f805462ffff0019166201000060ff86811691820261ff001916929092176101008684169081029190911760ff1916928516928317909355604080519182526020820193909352918201527f6f745a4eb556eef343d02d576c54dfd149a44d81e295a919ce0ede3d3c1eef3e9060600160405180910390a1505050565b6033546001600160a01b031633146109b55760405162461bcd60e51b815260040161087b90614c83565b60a68054600560ff199182161790915560a56020527f5a58a35f79c96918ba4a26566c02f84b94e945aad283848d088844a1238e942d80548216600a9081179091557f25b4c4067fa5990834207d22a094343a18a3a1d6e794b6c377f621345ba1b0c68054600e9084161790557f3cdd87bd16aed04484229287c5bc39384778a2cba3efb90ce9f23f83f81cfedb8054831660101790557f60950aeed661ece425cb83177e7fe55183290b4b66233dd01fa637eb96ffffb8805460149084161790557f78e4ee5a8306b32d0180407e003bf726aaa8568761ae802e03feaa77282b20038054831660189081179091557f5600e9f52cda508198e323f416d174680616183df9985b4146c6dbf94333cc338054841690911790557f9b64440650c2243ab519809ee4ab2ff3fc62fe1649d4d69597992711ee1d8b0f8054601e9084161790557fbe1b774322458fba870f6e9fd8466f83d890728fff080f54030877813a5a8c2c80548316601f1790557f956a2aee9baa35dae865e3a6bdb9f4049fa0bb5efc5681585f1349b9019698f0805460289084161790557f894b45b02714d4a6fec538dd04ddc97a06dc72e6b0a829eff008ab8aaab758878054831660271790556000527fdd6393fc2130774a649b718e55d063c8d036e29799b544f06916d3e0fea54ba380549091166034179055565b60026065541415610bcb5760405162461bcd60e51b815260040161087b90614cce565b6002606555609f54610100900460ff1615610bf85760405162461bcd60e51b815260040161087b90614d05565b609d546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c779190614d25565b6001600160a01b031614610cbd5760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420796f7572206869766560981b604482015260640161087b565b609d5460405163ae953d8960e01b815261ffff831660048201526003916001600160a01b03169063ae953d899060240160206040518083038186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3d9190614d42565b60ff161015610d805760405162461bcd60e51b815260206004820152600f60248201526e10d85c081b9bdd081c995858da1959608a1b604482015260640161087b565b610d93611af4662386f26fc10000614d75565b609c546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610dd657600080fd5b505afa158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e9190614d94565b1015610e4f5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820486f6e657960801b604482015260640161087b565b609c546001600160a01b0316639dc29fac33610e74611af4662386f26fc10000614d75565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b5050609d54604051630b3e286360e11b815261ffff851660048201526001600160a01b03909116925063167c50c69150602401600060405180830381600087803b158015610f1b57600080fd5b505af1158015610f2f573d6000803e3d6000fd5b505060405161ffff841692503391507ff49897e9eea917a865792129274a2f6ee90255068c08d6e4d78701370d4d263d90600090a3506001606555565b60026065541415610f8f5760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff1615610fb75760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561118457600084848361ffff16818110610fdf57610fdf614dad565b9050602002016020810190610ff4919061499f565b61ffff8116600090815260a260205260409020805491925090611018575050611172565b600181015460ff1661102b575050611172565b6001818101546301000000900460ff161415611048575050611172565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561108f57600080fd5b505afa1580156110a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c79190614d25565b6001600160a01b0316146110dc575050611172565b60985460018201546000916110f991610100900461ffff16614d75565b82600301546111089190614dc3565b905080421061111957505050611172565b6111256102bc86614dc3565b60018301805463ff0000001916630100000017905560405190955061ffff84169033907f3a217120d9f10810399d7af913c94d3a3f1b5b82c1899990c5c399ea627ff35890600090a35050505b8061117c81614ddb565b915050610fbb565b50600081116111c85760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f207374616b6560801b604482015260640161087b565b6111d981662386f26fc10000614d75565b609c546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b15801561122157600080fd5b505afa158015611235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112599190614d94565b101561129a5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820686f6e657960801b604482015260640161087b565b801561130657609c54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac906044015b600060405180830381600087803b1580156112ed57600080fd5b505af1158015611301573d6000803e3d6000fd5b505050505b5050600160655550565b600260655414156113335760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff161561135b5760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561155657600084848361ffff1681811061138357611383614dad565b9050602002016020810190611398919061499f565b61ffff8116600090815260a2602052604090208054919250906113bc575050611544565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561140357600080fd5b505afa158015611417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143b9190614d25565b6001600160a01b031614611450575050611544565b6001818101546301000000900460ff16141561146d575050611544565b600181015460ff16611480575050611544565b600181015460985461010090910461ffff169061149d9082614d75565b82600301546114ac9190614dc3565b4211156114bb57505050611544565b6114c6601786614dc3565b6097549095506114da9061ffff1682614dc3565b60975490915061ffff168114156114f2574260048301555b60018201805461ffff8084166101000262ffff0019909216919091179091556040519084169033907f0fdfd2278a82d89a285de1659c49e93d0371d707c27ecacda4f1bbf8f7db693590600090a35050505b8061154e81614ddb565b91505061135f565b50600081116115a05760405162461bcd60e51b81526020600482015260166024820152754e6f7468696e6720746f206b6565702061637469766560501b604482015260640161087b565b6115b181662386f26fc10000614d75565b609c546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190614d94565b10156116725760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820686f6e657960801b604482015260640161087b565b609c54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac906044016112d3565b600260655414156116cc5760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff16156116f45760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561187357600084848361ffff1681811061171c5761171c614dad565b9050602002016020810190611731919061499f565b61ffff8116600090815260a260205260409020805491925090611755575050611861565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561179c57600080fd5b505afa1580156117b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d49190614d25565b6001600160a01b0316146117e9575050611861565b6117f56102bc85614dc3565b6001828101805460ff1981168317825560975462ffffff1990911661010061ffff928316021790921790554260038401819055600484015560405191955083169033907fc1d9120cbac78180337285e846163621e353501870b4e46763cd01d125bc5f0790600090a350505b8061186b81614ddb565b9150506116f8565b50600081116115a05760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20616374697661746560681b604482015260640161087b565b61ffff808216600090815260a2602052604081206098546001820154929391926118ea9261010090910416614d75565b81600301546118f99190614dc3565b4210159392505050565b600260655414156119265760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff161561194e5760405162461bcd60e51b815260040161087b90614d05565b336119975760405162461bcd60e51b8152602060048201526019602482015278043616e206e6f74206d696e7420746f2061646472657373203603c1b604482015260640161087b565b609d546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b1580156119de57600080fd5b505afa1580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a169190614d25565b6001600160a01b031614611a5c5760405162461bcd60e51b815260206004820152600d60248201526c139bc8121a5d99481bdddb9959609a1b604482015260640161087b565b611a6f6108fc662386f26fc10000614d75565b609c546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611ab257600080fd5b505afa158015611ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aea9190614d94565b1015611b2b5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820486f6e657960801b604482015260640161087b565b609954611b389042614dfd565b61ffff8216600090815260a1602052604090205410611b8d5760405162461bcd60e51b815260206004820152601160248201527026b4b73a103132b29031b7b7b63237bbb760791b604482015260640161087b565b6000611b976143c9565b905060008161ffff1611611bdb5760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0819985a5b195960aa1b604482015260640161087b565b61ffff808316600090815260a1602090815260408083204290819055815160e0810183528686168082526001828601818152609780548a16858801908152606086018a8152608087018b815260a0880189815260c08901998a52968c5260a2909a529790992094518555905191840180549851965160ff90811663010000000263ff00000019988c166101000262ffffff19909b169490911693909317989098179590951617909555925160028401559251600383015591516004918201558154640100000000900490921691611cb183614ddb565b82546101009290920a61ffff818102199093169183160217909155609d5460405163617a881b60e01b815291851660048301526001600160a01b0316915063617a881b90602401600060405180830381600087803b158015611d1257600080fd5b505af1158015611d26573d6000803e3d6000fd5b5050609c546001600160a01b03169150639dc29fac905033611d516108fc662386f26fc10000614d75565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d9757600080fd5b505af1158015611dab573d6000803e3d6000fd5b5050609e546040516340c10f1960e01b815233600482015261ffff851660248201526001600160a01b0390911692506340c10f199150604401600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b505060405161ffff841681523392507fa72b9f69ceff29b665f9add67b0f19138fd338f2e79ece3cdcd167943e531a58915060200160405180910390a250506001606555565b60608167ffffffffffffffff811115611e7357611e73614b45565b604051908082528060200260200182016040528015611eac57816020015b611e996148ce565b815260200190600190039081611e915790505b50905060005b61ffff8116831115611f965760a2600085858461ffff16818110611ed857611ed8614dad565b9050602002016020810190611eed919061499f565b61ffff90811682526020808301939093526040918201600020825160e08101845281548152600182015460ff8082169683019690965261010081048416948201949094526301000000909304909316606083015260028301546080830152600383015460a083015260049092015460c0820152835190918491908416908110611f7857611f78614dad565b60200260200101819052508080611f8e90614ddb565b915050611eb2565b505b92915050565b609b54604051632118854760e21b81526001600160a01b0383811660048301526000928392911690638462151c9060240160006040518083038186803b158015611fe757600080fd5b505afa158015611ffb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120239190810190614e14565b905060005b81518161ffff16101561221b576000828261ffff168151811061204d5761204d614dad565b6020908102919091010151609b54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b1580156120a057600080fd5b505afa1580156120b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d89190614ea5565b6120e25750612209565b609b546040516331a9108f60e11b815261ffff831660048201526001600160a01b03878116921690636352211e9060240160206040518083038186803b15801561212b57600080fd5b505afa15801561213f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121639190614d25565b6001600160a01b0316146121775750612209565b61ffff8116600090815260a06020526040812054801580159061219b5750609a5481115b156121be576098546121ad8242614dfd565b6121b79190614edd565b91506121ee565b609a544210156121d157600091506121ee565b609854609a546121e19042614dfd565b6121eb9190614edd565b91505b6121f9826064614d75565b6122039087614dc3565b95505050505b8061221381614ddb565b915050612028565b5061222d82662386f26fc10000614d75565b9392505050565b6033546001600160a01b0316331461225e5760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b0381166122845760405162461bcd60e51b815260040161087b90614ef1565b609e80546001600160a01b0319166001600160a01b038316179055604051694265657344656c75786560b01b8152600a015b6040519081900381206001600160a01b0383168252907fbf2cc7083b32d1f5c82633af784e1285df86eb43c88d0752feea4bebb4a0b6d2906020016108d8565b600260655414156123195760405162461bcd60e51b815260040161087b90614cce565b6002606555609f54610100900460ff16156123465760405162461bcd60e51b815260040161087b90614d05565b3361238f5760405162461bcd60e51b8152602060048201526019602482015278043616e206e6f74206d696e7420746f2061646472657373203603c1b604482015260640161087b565b609d546040516340c10f1960e01b815233600482015261ffff831660248201526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156123de57600080fd5b505af11580156123f2573d6000803e3d6000fd5b505060405161ffff841681523392507ff6b907f000734a9a2ead9c2160cb1cc3ae13292659e4d5a5f9bb983d519474a3915060200160405180910390a2506001606555565b6033546001600160a01b031633146124615760405162461bcd60e51b815260040161087b90614c83565b61246b6000614668565b565b600260655414156124905760405162461bcd60e51b815260040161087b90614cce565b6002606555609a5442116124dd5760405162461bcd60e51b815260206004820152601460248201527314995dd85c991cc8191a591b89dd081cdd185c9d60621b604482015260640161087b565b609f5460ff16156125005760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561294357600084848361ffff1681811061252857612528614dad565b905060200201602081019061253d919061499f565b609e54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b15801561258557600080fd5b505afa158015612599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125bd9190614ea5565b6125c75750612931565b609e546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561260e57600080fd5b505afa158015612622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126469190614d25565b6001600160a01b03161461265a5750612931565b61ffff8116600090815260a260205260409020805415806126805750600181015460ff16155b1561268c575050612931565b600381015460018201546000908190600a906301000000900460ff166128375760048501546126bd57600485018490555b60985460018601546000916126da91610100900461ffff16614d75565b6126e49086614dc3565b90508042106127335760006126f98683614dfd565b9050609854816127099190614edd565b945061271685600d614d75565b60018801805462ffffff1916905542600289015593506127959050565b6098546127408642614dfd565b61274a9190614edd565b935061275784600d614d75565b9250838660010160018282829054906101000a900461ffff1661277a9190614f1f565b92506101000a81548161ffff021916908361ffff1602179055505b61ffff8716600090815260a4602052604090205460ff16156128315761ffff8716600090815260a4602052604081205460a591906001906127da9060ff166002614f42565b6127e49190614f6b565b60ff16600a8111156127f8576127f8614cb8565b600a81111561280957612809614cb8565b600a81111561281a5761281a614cb8565b815260208101919091526040016000205460ff1691505b5061290b565b6001858101546301000000900460ff16141561290b5760985461285a8542614dfd565b6128649190614edd565b61286f906009614d75565b6128799083614dc3565b61ffff8716600090815260a4602052604090205490925060ff161561290b5761ffff8616600090815260a4602052604081205460a591906128be9060ff166002614f42565b60ff16600a8111156128d2576128d2614cb8565b600a8111156128e3576128e3614cb8565b600a8111156128f4576128f4614cb8565b815260208101919091526040016000205460ff1690505b6129158183614d75565b61291f9089614dc3565b97504285600301819055505050505050505b8061293b81614ddb565b915050612504565b50600081116129875760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b604482015260640161087b565b6129988166038d7ea4c68000614d75565b9050609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e857600080fd5b505afa1580156129fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a209190614d94565b609c54604080516318160ddd60e01b8152905184926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015612a6457600080fd5b505afa158015612a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9c9190614d94565b612aa69190614dc3565b1115612bc557609c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612afa57600080fd5b505afa158015612b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b329190614d94565b609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8057600080fd5b505afa158015612b94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb89190614d94565b612bc29190614dfd565b90505b609c546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015612c1157600080fd5b505af1158015612c25573d6000803e3d6000fd5b50506040518381523392507f258e6d8bbf25dcd0a12d45ef02d409614b701b29f42df2c374756afb6d387242915060200160405180910390a25050600160655550565b60026065541415612c8b5760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff1615612cb35760405162461bcd60e51b815260040161087b90614d05565b60005b61ffff811682111561130657600083838361ffff16818110612cda57612cda614dad565b9050602002016020810190612cef919061499f565b61ffff8116600090815260a260205260409020805491925090612d13575050612e0a565b60018101546301000000900460ff16612d2d575050612e0a565b609e546040516331a9108f60e11b815261ffff8416600482015233916001600160a01b031690636352211e9060240160206040518083038186803b158015612d7457600080fd5b505afa158015612d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dac9190614d25565b6001600160a01b031614612dc1575050612e0a565b60018101805463ff0000001916905542600482015560405161ffff83169033907f54753f57c3fdfcf5a9f22cd75f9456acb076e936f7c3d85d8e81fd5e096c795490600090a350505b80612e1481614ddb565b915050612cb6565b600054610100900460ff1680612e35575060005460ff16155b612e515760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff16158015612e73576000805461ffff19166101011790555b612e7b6146ba565b612e83614735565b6097805463ffffffff191663ffff000a1790556201518060988190556099556361743530609a558015612ebc576000805461ff00191690555b50565b6033546001600160a01b03163314612ee95760405162461bcd60e51b815260040161087b90614c83565b60988190556040516f090dedccaf28ae0dec6d098cadccee8d60831b81526010016108a5565b6033546001600160a01b03163314612f395760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b038116612f5f5760405162461bcd60e51b815260040161087b90614ef1565b609b80546001600160a01b0319166001600160a01b0383161790556040516a426561727344656c75786560a81b8152600b016122b6565b612f9e6148ce565b5061ffff908116600090815260a26020908152604091829020825160e08101845281548152600182015460ff80821694830194909452610100810490951693810193909352630100000090930416606082015260028201546080820152600382015460a082015260049091015460c082015290565b6033546001600160a01b0316331461303d5760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b0381166130635760405162461bcd60e51b815260040161087b90614ef1565b60a380546001600160a01b0319166001600160a01b0383161790556040516f486f6e6579436f6d627344656c75786560801b81526010016122b6565b609e54604051632118854760e21b81526001600160a01b0383811660048301526000928392911690638462151c9060240160006040518083038186803b1580156130e857600080fd5b505afa1580156130fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131249190810190614e14565b905060005b81518161ffff1610156134f7576000828261ffff168151811061314e5761314e614dad565b6020908102919091010151609e54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b1580156131a157600080fd5b505afa1580156131b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d99190614ea5565b6131e357506134e5565b609e546040516331a9108f60e11b815261ffff831660048201526001600160a01b03878116921690636352211e9060240160206040518083038186803b15801561322c57600080fd5b505afa158015613240573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132649190614d25565b6001600160a01b03161461327857506134e5565b61ffff8116600090815260a2602052604090208054158061329e5750600181015460ff16155b156132aa5750506134e5565b600381015460018201546000908190600a906301000000900460ff166133f45760985460018601546000916132e791610100900461ffff16614d75565b6132f19086614dc3565b905080421061332b5760006133068683614dfd565b9050609854816133169190614edd565b945061332385600d614d75565b935050613352565b6098546133388642614dfd565b6133429190614edd565b935061334f84600d614d75565b92505b61ffff8716600090815260a4602052604090205460ff16156133ee5761ffff8716600090815260a4602052604081205460a591906001906133979060ff166002614f42565b6133a19190614f6b565b60ff16600a8111156133b5576133b5614cb8565b600a8111156133c6576133c6614cb8565b600a8111156133d7576133d7614cb8565b815260208101919091526040016000205460ff1691505b506134c8565b6001858101546301000000900460ff1614156134c8576098546134178542614dfd565b6134219190614edd565b61342c906009614d75565b6134369083614dc3565b61ffff8716600090815260a4602052604090205490925060ff16156134c85761ffff8616600090815260a4602052604081205460a5919061347b9060ff166002614f42565b60ff16600a81111561348f5761348f614cb8565b600a8111156134a0576134a0614cb8565b600a8111156134b1576134b1614cb8565b815260208101919091526040016000205460ff1690505b6134d28183614d75565b6134dc908a614dc3565b98505050505050505b806134ef81614ddb565b915050613129565b5061222d8266038d7ea4c68000614d75565b6033546001600160a01b031633146135335760405162461bcd60e51b815260040161087b90614c83565b609a8190556040518181527f9d86a54a685ef1d2e3a4057066e86daa95db7e8918c2a9f2279b1010a72fc5a09060200160405180910390a150565b6033546001600160a01b031633146135985760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b0381166135be5760405162461bcd60e51b815260040161087b90614ef1565b609c80546001600160a01b0319166001600160a01b038316179055604051692437b732bcaa37b5b2b760b11b8152600a016122b6565b600260655414156136175760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff161561363f5760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff81168311156138cb57600084848361ffff1681811061366757613667614dad565b905060200201602081019061367c919061499f565b609e546040516331a9108f60e11b815261ffff831660048201529192506000916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156136c957600080fd5b505afa1580156136dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137019190614d25565b6001600160a01b0316141561374e5761ffff16600090815260a26020526040812081815560018101805463ffffffff1916905560028101829055600381018290556004015550613aa69050565b609e546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561379557600080fd5b505afa1580156137a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cd9190614d25565b6001600160a01b0316146137e157506138b9565b61ffff8116600090815260a26020526040812081815560018101805463ffffffff191690556002810182905560038101829055600401556138246104b084614dc3565b609e546040516388157c9760e01b815261ffff841660048201529194506001600160a01b0316906388157c9790602401600060405180830381600087803b15801561386e57600080fd5b505af1158015613882573d6000803e3d6000fd5b505060405161ffff841692503391507f867faa498a34a8b06889d023b7da91b733f57d42f4c960b9124ea1a36c0e4c2990600090a3505b806138c381614ddb565b915050613643565b506138dd81662386f26fc10000614d75565b9050600081116139215760405162461bcd60e51b815260206004820152600f60248201526e2737ba3434b733903a3790313ab93760891b604482015260640161087b565b609c60009054906101000a90046001600160a01b03166001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b15801561396f57600080fd5b505afa158015613983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a79190614d94565b609c54604080516318160ddd60e01b8152905184926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156139eb57600080fd5b505afa1580156139ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a239190614d94565b613a2d9190614dc3565b1115613a6f5760405162461bcd60e51b8152602060048201526011602482015270121bdb995e4818d85c081c995858da1959607a1b604482015260640161087b565b609c546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f19906044016112d3565b50506001606555565b60026065541415613ad25760405162461bcd60e51b815260040161087b90614cce565b6002606555609f5460ff1615613afa5760405162461bcd60e51b815260040161087b90614d05565b609e546040516331a9108f60e11b815261ffff8616600482015233916001600160a01b031690636352211e9060240160206040518083038186803b158015613b4157600080fd5b505afa158015613b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b799190614d25565b6001600160a01b031614613bc85760405162461bcd60e51b8152602060048201526016602482015275596f7520646f6e2774206f776e20746869732042656560501b604482015260640161087b565b80518214613c0a5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081c995c5d595cdd608a1b604482015260640161087b565b61ffff8416600090815260a4602052604081205460ff16905b83811015613e6d576000858583818110613c3f57613c3f614dad565b905060200201359050838281518110613c5a57613c5a614dad565b602090810291909101015160a354604051627eeac760e11b8152336004820152602481018490526001600160a01b039091169062fdd58e9060440160206040518083038186803b158015613cad57600080fd5b505afa158015613cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce59190614d94565b1080613cf6575060a65460ff168310155b15613d015750613e5b565b82848381518110613d1457613d14614dad565b6020026020010151826001613d299190614dc3565b613d339190614d75565b613d3d9190614dc3565b60a65490935060ff168310613dbb57613d57816001614dc3565b60a654613d679060ff1685614dfd565b613d719190614edd565b848381518110613d8357613d83614dad565b6020026020010151613d959190614dfd565b848381518110613da757613da7614dad565b602090810291909101015260a65460ff1692505b60a35484516001600160a01b039091169063f5298aca9033908490889087908110613de857613de8614dad565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526044820152606401600060405180830381600087803b158015613e4157600080fd5b505af1158015613e55573d6000803e3d6000fd5b50505050505b80613e6581614fdc565b915050613c23565b5060a65460ff16811115613eb85760405162461bcd60e51b815260206004820152601260248201527113195d995b1a5b99c81d5c0819985a5b195960721b604482015260640161087b565b61ffff8516600081815260a46020908152604091829020805460ff191660ff8616179055815192835282018390527fdd4c13c4424c8513dd8d7d4660ef23fef72bf898ff3165d37f9034bdbd007dd5910160405180910390a150506001606555505050565b6033546001600160a01b03163314613f475760405162461bcd60e51b815260040161087b90614c83565b6097805461ffff191661ffff83161790556040517f4e6f4f6645706f63684265666f7265496e6163746976654265650000000000008152601a0160405190819003812061ffff83168252907f8900c724b8277bf649404278b740479df79c4d47d3c867e02c2fb2702e6f74c2906020016108d8565b6033546001600160a01b03163314613fe65760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b03811661400c5760405162461bcd60e51b815260040161087b90614ef1565b609d80546001600160a01b0319166001600160a01b03831617905560405168486f6e65794869766560b81b81526009016122b6565b6033546001600160a01b0316331461406b5760405162461bcd60e51b815260040161087b90614c83565b6001600160a01b0381166140d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161087b565b612ebc81614668565b600260655414156140fc5760405162461bcd60e51b815260040161087b90614cce565b6002606555609a5442116141495760405162461bcd60e51b815260206004820152601460248201527314995dd85c991cc8191a591b89dd081cdd185c9d60621b604482015260640161087b565b609f5462010000900460ff16156141725760405162461bcd60e51b815260040161087b90614d05565b6000805b61ffff811683111561437457600084848361ffff1681811061419a5761419a614dad565b90506020020160208101906141af919061499f565b609b54604051634f558e7960e01b815261ffff831660048201529192506001600160a01b031690634f558e799060240160206040518083038186803b1580156141f757600080fd5b505afa15801561420b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061422f9190614ea5565b6142395750614362565b609b546040516331a9108f60e11b815261ffff8316600482015233916001600160a01b031690636352211e9060240160206040518083038186803b15801561428057600080fd5b505afa158015614294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b89190614d25565b6001600160a01b0316146142cc5750614362565b61ffff8116600090815260a0602052604081205480158015906142f05750609a5481115b15614313576098546143028242614dfd565b61430c9190614edd565b9150614330565b609854609a546143239042614dfd565b61432d9190614edd565b91505b61433b826064614d75565b6143459086614dc3565b61ffff909316600090815260a06020526040902042905550909250505b8061436c81614ddb565b915050614176565b50600081116143b85760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b604482015260640161087b565b61299881662386f26fc10000614d75565b6000806000609e60009054906101000a90046001600160a01b03166001600160a01b0316634c0f38c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561441c57600080fd5b505afa158015614430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144549190614d94565b60975490915061ffff80831664010000000090920416106144ac5760405162461bcd60e51b815260206004820152601260248201527113505617d4d554141316481c995858da195960721b604482015260640161087b565b6097546040516bffffffffffffffffffffffff193360601b1660208201524460348201524260548201524360748201526001600160f01b031964010000000090920460f090811b8316609483015284901b909116609682015260009060980160408051601f198184030181529190528051602090910120905061452f8282614ff7565b93508261453b81614ddb565b93505061ffff841661454b578193505b61ffff8416600090815260a2602052604090205461459a5760975461ffff6201000090910481169085161015614594576097805463ffff000019166201000061ffff8716021790555b50505090565b60028361ffff1611156146625760005b60975462010000900461ffff16600090815260a260205260409020541561464c576097805462010000900461ffff169060026145e583614ddb565b91906101000a81548161ffff021916908361ffff160217905550508261ffff16609760029054906101000a900461ffff1661ffff16141561464757801561463157600094505050505090565b506097805463ffff000019166201000017905560015b6145aa565b505060975462010000900461ffff169392505050565b506144ac565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806146d3575060005460ff16155b6146ef5760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff16158015614711576000805461ffff19166101011790555b614719614794565b6147216147fe565b8015612ebc576000805461ff001916905550565b600054610100900460ff168061474e575060005460ff16155b61476a5760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff1615801561478c576000805461ffff19166101011790555b61472161485e565b600054610100900460ff16806147ad575060005460ff16155b6147c95760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff16158015614721576000805461ffff19166101011790558015612ebc576000805461ff001916905550565b600054610100900460ff1680614817575060005460ff16155b6148335760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff16158015614855576000805461ffff19166101011790555b61472133614668565b600054610100900460ff1680614877575060005460ff16155b6148935760405162461bcd60e51b815260040161087b90614f8e565b600054610100900460ff161580156148b5576000805461ffff19166101011790555b60016065558015612ebc576000805461ff001916905550565b6040518060e0016040528060008152602001600060ff168152602001600061ffff168152602001600060ff1681526020016000815260200160008152602001600081525090565b60006020828403121561492757600080fd5b5035919050565b60ff81168114612ebc57600080fd5b60008060006060848603121561495257600080fd5b833561495d8161492e565b9250602084013561496d8161492e565b9150604084013561497d8161492e565b809150509250925092565b803561ffff8116811461499a57600080fd5b919050565b6000602082840312156149b157600080fd5b61222d82614988565b60008083601f8401126149cc57600080fd5b50813567ffffffffffffffff8111156149e457600080fd5b6020830191508360208260051b85010111156149ff57600080fd5b9250929050565b60008060208385031215614a1957600080fd5b823567ffffffffffffffff811115614a3057600080fd5b614a3c858286016149ba565b90969095509350505050565b8051825260ff602082015116602083015261ffff604082015116604083015260ff60608201511660608301526080810151608083015260a081015160a083015260c081015160c08301525050565b6020808252825182820181905260009190848201906040850190845b81811015614ad857614ac5838551614a48565b9284019260e09290920191600101614ab2565b50909695505050505050565b6001600160a01b0381168114612ebc57600080fd5b600060208284031215614b0b57600080fd5b813561222d81614ae4565b60e08101611f988284614a48565b600060208284031215614b3657600080fd5b8135600b811061222d57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614b8457614b84614b45565b604052919050565b600067ffffffffffffffff821115614ba657614ba6614b45565b5060051b60200190565b60008060008060608587031215614bc657600080fd5b614bcf85614988565b935060208086013567ffffffffffffffff80821115614bed57600080fd5b614bf989838a016149ba565b90965094506040880135915080821115614c1257600080fd5b508601601f81018813614c2457600080fd5b8035614c37614c3282614b8c565b614b5b565b81815260059190911b8201830190838101908a831115614c5657600080fd5b928401925b82841015614c7457833582529284019290840190614c5b565b979a9699509497505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052602160045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b600060208284031215614d3757600080fd5b815161222d81614ae4565b600060208284031215614d5457600080fd5b815161222d8161492e565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614d8f57614d8f614d5f565b500290565b600060208284031215614da657600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b60008219821115614dd657614dd6614d5f565b500190565b600061ffff80831681811415614df357614df3614d5f565b6001019392505050565b600082821015614e0f57614e0f614d5f565b500390565b60006020808385031215614e2757600080fd5b825167ffffffffffffffff811115614e3e57600080fd5b8301601f81018513614e4f57600080fd5b8051614e5d614c3282614b8c565b81815260059190911b82018301908381019087831115614e7c57600080fd5b928401925b82841015614e9a57835182529284019290840190614e81565b979650505050505050565b600060208284031215614eb757600080fd5b8151801515811461222d57600080fd5b634e487b7160e01b600052601260045260246000fd5b600082614eec57614eec614ec7565b500490565b602080825260149082015273043616e206e6f74206265206164647265737320360641b604082015260600190565b600061ffff83811690831681811015614f3a57614f3a614d5f565b039392505050565b600060ff821660ff84168160ff0481118215151615614f6357614f63614d5f565b029392505050565b600060ff821660ff841680821015614f8557614f85614d5f565b90039392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000600019821415614ff057614ff0614d5f565b5060010190565b600061ffff8084168061500c5761500c614ec7565b9216919091069291505056fea164736f6c6343000809000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
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.