Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14596282 | 860 days ago | IN | 0 ETH | 0.06862544 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FastFoodFrensFryVault
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@ FastFoodFrensFryVault @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,,,,,@@@@@@@@@@***,,,@@@@@@@@@@,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,,,,,@@@@@@@@@@***,,,@@@@@@@@@@,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,,,,,***@@@****,,,,,,****@@@***,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,,,,,***@@@****,,,,,,****@@@***,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,,,,,,,,***,,,,,,,,,,,,,,***,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@(((((((((((((////(((((((((((((///(((((((@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@((((((####################((((################@@@@@@@@@@***(@@@@@@@@ // @@@@@@@@(((((((///((((##########@@@###////##########@@@###@@@@@@@@@***@#***(@@@@ // @@@@@@@@(((((((///((((##########@@@###////##########@@@###@@@@@@@****@**@**@&**/ // @@@@@///(((((((((((((((((#######@@@///(((((((#######@@@///@@@@@@***@**@@*/@***&@ // @@@@@((((((((((((((((((((#############(((((((#############@@@@@@*****@**@****@@@ // @@@@@(((((((///(((((((((((((((((((((((((((///(((((((((((((@@@@@@*******@***@@@@@ // @@@@@(((((((///(((((((((((((((((((((((((((///(((((((((((((@@@@@@@********/@@@@@@ // @@@@@(((((((((((((////////////////////////////////////////@@@@@@//@@@@@@@@@@@@@@ // @@@@@///((((((((((////&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@//@@@@@@@@@@@@@@@ // @@@@@@@@((((((((((((((////////////////////////////////////@@@//@@@@@@@@@@@@@@@@@ // @@@@@@@@((((((((((((((////////////////////////////////////@@//@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@(((///(((((((((((((((((///((((((((((((((@@@@**@//@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((((@@@@@@@@@@/(((%@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@(((((((((((((///(((((((((((((((((((((((%@**(((@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@(((((((((((((///((((((((((((((((((((((@#*//(@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@///@@@((((((((((((((((((((////(((@@@@@**@//@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((((@@@@@**/@@@@@@@@@@@@@@@@@@@@@@@@@@@ pragma solidity 0.8.11; import {MathUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {EnumerableSetUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import {IERC20Burnable} from "./interface/IERC20Burnable.sol"; import {BasicRNGUpgradeable} from "./base/BasicRNGUpgradeable.sol"; /** * @title Fast Food Frens' Fry Vault * @notice Deposit your Fast Food Frens and earn fries. */ contract FastFoodFrensFryVault is Initializable, OwnableUpgradeable, PausableUpgradeable, BasicRNGUpgradeable { using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; event HardWorkerTaxed(address indexed account, uint256 amount); event HardWorkerPaid(address indexed account, uint256 amount); event TaxTheftSuccessful(address indexed account, uint256 indexed id, uint256 total, uint256 tax); event TaxTheftFail(address indexed account, uint256 indexed id, uint256 total, uint256 tax); /* -------------------------------------------------------------------------- */ /* Farming State */ /* -------------------------------------------------------------------------- */ /// @notice Rewards end timestamp. uint256 public endTime; /// @notice Rewards emitted per day staked. uint256 public rate; /// @notice Staking token contract address. IERC721 public stakingToken; /// @notice Rewards token contract address. IERC20Burnable public rewardToken; /// @notice Spookies token contract address. IERC721 public spookiesToken; /// @notice Fast Food Doges token contract address. IERC721 public dogesToken; /// @notice Set of staked token ids by address. mapping(address => EnumerableSetUpgradeable.UintSet) internal _depositedIds; /// @notice Mapping of timestamps from each staked token id. mapping(uint256 => uint256) internal _depositedTimestamps; /// @notice Mapping of timestamps of initial staking date from each staked token id. mapping(uint256 => uint256) internal _initialDepositedTimestamps; /* -------------------------------------------------------------------------- */ /* Staking Variables */ /* -------------------------------------------------------------------------- */ /// @notice Price in FRY to unlock before minStakingPeriod uint128 public earlyWithdrawPenalty; /// @notice Min staking time uint64 public minStakingPeriod; /// @notice Hardworker are subject to taxation uint32 public hardworkerTax; /// @notice Tax Thief fail subject to higher taxation uint32 public taxtheftTax; /* -------------------------------------------------------------------------- */ /* initialize contract */ /* -------------------------------------------------------------------------- */ /// @notice Initialize contract function initialize( address newStakingToken, address newRewardToken, address newSpookiesToken, address newDogesToken, uint256 newRate, uint256 newEndTime, uint128 newEarlyWithdrawPenalty, uint64 newMinStakingPeriod, uint32 newHardworkerTax, uint32 newTaxtheftTax ) external initializer { __Ownable_init(); __Pausable_init(); stakingToken = IERC721(newStakingToken); // FFF rewardToken = IERC20Burnable(newRewardToken); // FRY spookiesToken = IERC721(newSpookiesToken); // Spookies dogesToken = IERC721(newDogesToken); // FFD rate = newRate; // Daily emissions by token endTime = newEndTime; // End date timemstamp earlyWithdrawPenalty = newEarlyWithdrawPenalty; //169 ether minStakingPeriod = newMinStakingPeriod; //90 days hardworkerTax = newHardworkerTax; // 69 taxtheftTax = newTaxtheftTax; //169 // approve contract for rewardToken rewardToken.approve(address(this), type(uint256).max); _pause(); } /* -------------------------------------------------------------------------- */ /* Deposit / Withdraw */ /* -------------------------------------------------------------------------- */ /// @notice Deposit tokens with `ids`. Tokens MUST have been approved to this contract first. function deposit(uint256[] memory ids) external whenNotPaused { for (uint256 i; i < ids.length; i++) { // Add the new deposit to the mapping _depositedIds[msg.sender].add(ids[i]); _initialDepositedTimestamps[ids[i]] = block.timestamp; _depositedTimestamps[ids[i]] = block.timestamp; // Transfer the deposited token to this contract stakingToken.transferFrom(msg.sender, address(this), ids[i]); } } /// @notice Withdraw tokens with `ids` and claim their pending rewards. function withdraw(uint256[] memory ids) external whenNotPaused { uint256 penalty = getEarlyWithdrawPenalty(ids); if (penalty > 0) rewardToken.burnFrom(msg.sender, penalty); uint256 collectionBonus = getCollectionsBonus(msg.sender); uint256 totalRewards; for (uint256 i; i < ids.length; i++) { require(_depositedIds[msg.sender].contains(ids[i]), "Query for a token you don't own"); uint256 timeBonus = getTimeBonus(ids[i]); totalRewards += (_rewards(_depositedTimestamps[ids[i]]) * (1000 + collectionBonus + timeBonus)) / 1000; _depositedIds[msg.sender].remove(ids[i]); delete _initialDepositedTimestamps[ids[i]]; delete _depositedTimestamps[ids[i]]; stakingToken.safeTransferFrom(address(this), msg.sender, ids[i]); } payHardworker(totalRewards); } /// @notice Calculate total rewards for given account without tax /// @param account Holder address. function earned(address account) external view returns (uint256[] memory rewards) { uint256 length = _depositedIds[account].length(); uint256 collectionBonus = getCollectionsBonus(account); rewards = new uint256[](length); for (uint256 i; i < length; i++) { uint256 tokenId = _depositedIds[account].at(i); uint256 timeBonus = getTimeBonus(tokenId); rewards[i] = (_rewards(_depositedTimestamps[tokenId]) * (1000 + collectionBonus + timeBonus)) / 1000; } } /// @notice Internally calculates base rewards for token `_id`. function _rewards(uint256 timestamp) internal view returns (uint256) { if (timestamp == 0) return 0; return ((MathUpgradeable.min(block.timestamp, endTime) - timestamp) * rate) / 1 days; } /// @notice Retrieve token initialDepositedTimestamps by account. /// @param account Token owner address. function initialDepositTimestampsOf(address account) external view returns (uint256[] memory initialDepositTimestamps) { uint256 length = _depositedIds[account].length(); initialDepositTimestamps = new uint256[](length); for (uint256 i; i < length; i++) initialDepositTimestamps[i] = _initialDepositedTimestamps[_depositedIds[account].at(i)]; } /// @notice Retrieve token ids deposited by account. /// @param account Token owner address. function depositsOf(address account) external view returns (uint256[] memory ids) { uint256 length = _depositedIds[account].length(); ids = new uint256[](length); for (uint256 i; i < length; i++) ids[i] = _depositedIds[account].at(i); } /// @notice Claim all pending rewards with hardworkerTax function claimAll() external whenNotPaused { uint256 totalRewards = 0; uint256 collectionBonus = getCollectionsBonus(msg.sender); for (uint256 i; i < _depositedIds[msg.sender].length(); i++) { //Sum up rewards and update last checkpoint uint256 tokenId = _depositedIds[msg.sender].at(i); uint256 timestamp = _depositedTimestamps[tokenId]; uint256 timeBonus = getTimeBonus(tokenId); _depositedTimestamps[tokenId] = block.timestamp; totalRewards += (_rewards(timestamp) * (1000 + collectionBonus + timeBonus)) / 1000; } payHardworker(totalRewards); } /* -------------------------------------------------------------------------- */ /* Claim Logic */ /* -------------------------------------------------------------------------- */ /// @notice Claim pending rewards for ids with hardworkerTax function claimHardWorker(uint256[] memory ids) external whenNotPaused { uint256 totalRewards = 0; uint256 collectionBonus = getCollectionsBonus(msg.sender); for (uint256 i; i < ids.length; i++) { require(_depositedIds[msg.sender].contains(ids[i]), "Query for a token you don't own"); uint256 timestamp = _depositedTimestamps[ids[i]]; uint256 timeBonus = getTimeBonus(ids[i]); _depositedTimestamps[ids[i]] = block.timestamp; totalRewards += (_rewards(timestamp) * (1000 + collectionBonus + timeBonus)) / 1000; } payHardworker(totalRewards); } /// @notice Claim pending rewards for ids trying to avoid tax function claimTaxTheft(uint256[] memory ids) external whenNotPaused { uint256 totalRewards = 0; uint256 collectionBonus = getCollectionsBonus(msg.sender); bool[] memory res = randomBoolArray(ids.length); for (uint256 i; i < ids.length; i++) { require(_depositedIds[msg.sender].contains(ids[i]), "Query for a token you don't own"); uint256 timestamp = _depositedTimestamps[ids[i]]; uint256 timeBonus = getTimeBonus(ids[i]); _depositedTimestamps[ids[i]] = block.timestamp; uint256 rewards = (_rewards(timestamp) * (1000 + collectionBonus + timeBonus)) / 1000; if (res[i]) { // TaxTheftSuccessful : no tax + bonus hardworkerTax uint256 bonux = (rewards * hardworkerTax) / 1000; uint256 total = rewards + bonux; totalRewards += total; emit TaxTheftSuccessful(msg.sender, ids[i], total, bonux); } else { //TaxTheftFail : tax is increased ! uint256 malux = (rewards * taxtheftTax) / 1000; uint256 total = rewards - malux; totalRewards += total; emit TaxTheftFail(msg.sender, ids[i], total, malux); } } rewardToken.transfer(msg.sender, totalRewards); //send rewards } function payHardworker(uint256 totalRewards) internal { uint256 taxed = (totalRewards * hardworkerTax) / 1000; uint256 pay = totalRewards - taxed; rewardToken.burnFrom(address(this), taxed); //burn taxed rewardToken.transfer(msg.sender, pay); //send rewards emit HardWorkerTaxed(msg.sender, taxed); emit HardWorkerPaid(msg.sender, pay); } /* -------------------------------------------------------------------------- */ /* Bonus Logic */ /* -------------------------------------------------------------------------- */ /// @notice Calculate time bonus for a stakingToken. function getTimeBonus(uint256 id) public view returns (uint256) { if (_initialDepositedTimestamps[id] == 0) return 0; uint256 stakingDuration = block.timestamp - _initialDepositedTimestamps[id]; if (stakingDuration > 270 days) return 300; if (stakingDuration > 180 days) return 200; if (stakingDuration > 90 days) return 100; return 0; } /// @notice Calculate Collections Bonus for given account. function getCollectionsBonus(address account) public view returns (uint256) { uint256 spookiesBalance = spookiesToken.balanceOf(account); uint256 dogesBalance = dogesToken.balanceOf(account); return getSpookiesBonus(spookiesBalance) + getDogesBonus(dogesBalance); } /// @notice Calculate Spookies Bonus for given account. function getSpookiesBonus(uint256 balance) public pure returns (uint256) { if (balance > 15) return 69; if (balance > 8) return 50; if (balance > 6) return 40; if (balance > 4) return 30; if (balance > 2) return 20; if (balance > 0) return 10; return 0; } /// @notice Calculate Doges Bonus for given account. function getDogesBonus(uint256 balance) public pure returns (uint256) { if (balance > 19) return 69; if (balance > 12) return 50; if (balance > 9) return 40; if (balance > 6) return 30; if (balance > 3) return 20; if (balance > 0) return 10; return 0; } /* -------------------------------------------------------------------------- */ /* Early Withdraw Penality */ /* -------------------------------------------------------------------------- */ /// @notice Withdraw tokens with `ids` and claim their pending rewards. function getEarlyWithdrawPenalty(uint256[] memory ids) public view returns (uint256) { uint256 totalPenality; for (uint256 i; i < ids.length; i++) { uint256 stakingDuration = block.timestamp - _initialDepositedTimestamps[ids[i]]; if (stakingDuration < minStakingPeriod) totalPenality += earlyWithdrawPenalty; } return totalPenality; } /* -------------------------------------------------------------------------- */ /* Staking Variables Setters */ /* -------------------------------------------------------------------------- */ /// @notice Set the new earlyWithdrawPenalty /// @param newEarlyWithdrawPenalty In FRY function setEarlyWithdrawPenalty(uint128 newEarlyWithdrawPenalty) external onlyOwner { earlyWithdrawPenalty = newEarlyWithdrawPenalty; } /// @notice Set the new minStakingPeriod /// @param newMinStakingPeriod In seconds function setMinStakingPeriod(uint64 newMinStakingPeriod) external onlyOwner { minStakingPeriod = newMinStakingPeriod; } /// @notice Set the new hardworkerTax /// @param newHardworkerTax (ex: 69 --> 6.9%) function setHardworkerTax(uint32 newHardworkerTax) external onlyOwner { hardworkerTax = newHardworkerTax; } /// @notice Set the new taxtheftTax /// @param newTaxtheftTax (ex: 169 --> 16.9%) function setTaxtheftTax(uint32 newTaxtheftTax) external onlyOwner { taxtheftTax = newTaxtheftTax; } /* -------------------------------------------------------------------------- */ /* Owner Logic */ /* -------------------------------------------------------------------------- */ /// @notice Set the new token rewards rate. /// @param newRate Emission rate in wei. function setRate(uint256 newRate) external onlyOwner { rate = newRate; } /// @notice Set the new rewards end time. /// @param newEndTime End timestamp. function setEndTime(uint256 newEndTime) external onlyOwner { require(newEndTime > block.timestamp, "End time must be greater than now"); endTime = newEndTime; } /// @notice Set the new staking token contract address. /// @param newStakingToken Staking token address. function setStakingToken(address newStakingToken) external onlyOwner { stakingToken = IERC721(newStakingToken); } /// @notice Set the new reward token contract address. /// @param newRewardToken Rewards token address. function setRewardToken(address newRewardToken) external onlyOwner { rewardToken = IERC20Burnable(newRewardToken); } /// @notice Set the new spookies token contract address. /// @param newSpookiesToken Staking token address. function setSpookiesToken(address newSpookiesToken) external onlyOwner { spookiesToken = IERC721(newSpookiesToken); } /// @notice Set the new FFD token contract address. /// @param newDogesToken Staking token address. function setDogesToken(address newDogesToken) external onlyOwner { spookiesToken = IERC721(newDogesToken); } /// @notice Withdraw rewardToken in contract function withdrawRewardToken() external onlyOwner { uint256 balance = rewardToken.balanceOf(address(this)); rewardToken.transferFrom(address(this), msg.sender, balance); } /// @notice Toggle if the contract is paused. function togglePaused() external onlyOwner { if (paused()) _unpause(); else _pause(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ 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() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) 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.11; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IERC20Burnable is IERC20 { function burn(address from, uint256 amount) external; function burnFrom(address account, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /// @title BasicRNGUpgradeable Pseudo Random Generation abstract contract BasicRNGUpgradeable is Initializable { /// @notice nonces uint256 private _nonces; ///@notice generate 'random' bytes function randomBytes() internal returns (bytes32) { return keccak256(abi.encodePacked(block.timestamp, block.difficulty, msg.sender, _nonces++)); } ///@notice generate a 'random' number < mod function random(uint256 mod) internal returns (uint256) { return uint256(randomBytes()) % mod; } ///@notice generate a 'random' array of bool of defined size function randomBoolArray(uint256 size) internal returns (bool[] memory output) { require(size <= 256, "Exceed max size : 256"); output = new bool[](size); uint256 rand = uint256(randomBytes()); for (uint256 i; i < size; i++) output[i] = (rand >> i) & 1 == 1; } function __BasicRNG_init() internal onlyInitializing { __BasicRNG_init_unchained(); } function __BasicRNG_init_unchained() internal onlyInitializing {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) 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 // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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); }
{ "optimizer": { "enabled": false, "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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"HardWorkerPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"HardWorkerTaxed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tax","type":"uint256"}],"name":"TaxTheftFail","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tax","type":"uint256"}],"name":"TaxTheftSuccessful","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claimHardWorker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claimTaxTheft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositsOf","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dogesToken","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyWithdrawPenalty","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256[]","name":"rewards","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCollectionsBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"getDogesBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"getEarlyWithdrawPenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"getSpookiesBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTimeBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hardworkerTax","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"initialDepositTimestampsOf","outputs":[{"internalType":"uint256[]","name":"initialDepositTimestamps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newStakingToken","type":"address"},{"internalType":"address","name":"newRewardToken","type":"address"},{"internalType":"address","name":"newSpookiesToken","type":"address"},{"internalType":"address","name":"newDogesToken","type":"address"},{"internalType":"uint256","name":"newRate","type":"uint256"},{"internalType":"uint256","name":"newEndTime","type":"uint256"},{"internalType":"uint128","name":"newEarlyWithdrawPenalty","type":"uint128"},{"internalType":"uint64","name":"newMinStakingPeriod","type":"uint64"},{"internalType":"uint32","name":"newHardworkerTax","type":"uint32"},{"internalType":"uint32","name":"newTaxtheftTax","type":"uint32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minStakingPeriod","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20Burnable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDogesToken","type":"address"}],"name":"setDogesToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newEarlyWithdrawPenalty","type":"uint128"}],"name":"setEarlyWithdrawPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newEndTime","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newHardworkerTax","type":"uint32"}],"name":"setHardworkerTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newMinStakingPeriod","type":"uint64"}],"name":"setMinStakingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardToken","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSpookiesToken","type":"address"}],"name":"setSpookiesToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newStakingToken","type":"address"}],"name":"setStakingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newTaxtheftTax","type":"uint32"}],"name":"setTaxtheftTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spookiesToken","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxtheftTax","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061461f806100206000396000f3fe608060405234801561001057600080fd5b50600436106102475760003560e01c806372f702f31161013b578063cb87cfdf116100b8578063e0f695e81161007c578063e0f695e814610678578063e3a9db1a14610694578063e9970f04146106c4578063f2fde38b146106e2578063f7c618c1146106fe57610247565b8063cb87cfdf146105e6578063ccb98ffc14610604578063d1058e5914610620578063d29004d91461062a578063da700fbc1461064857610247565b8063983d95ce116100ff578063983d95ce14610544578063a0abbaba14610560578063aa7a07e91461057c578063b3f3f42b14610586578063c3182360146105b657610247565b806372f702f3146104a05780637e5b5c44146104be5780638aee8127146104da5780638da5cb5b146104f657806394ed01471461051457610247565b806334fcf437116101c9578063598b8e711161018d578063598b8e71146104105780635ba2db511461042c5780635c975abb14610448578063617944cf14610466578063715018a61461049657610247565b806334fcf4371461039257806336566f06146103ae57806341cc342d146103b857806343f40728146103d4578063441f61ed146103f257610247565b80631458a566116102105780631458a566146103025780631e9b12ef1461031e5780632c4e722e1461033a5780632cffc8fc146103585780633197cbb61461037457610247565b80628cc2621461024c578063026548911461027c57806306391d77146102ac578063069c34f6146102c85780630fdb5a86146102e6575b600080fd5b61026660048036038101906102619190613685565b61071c565b604051610273919061377a565b60405180910390f35b610296600480360381019061029191906137c8565b6108b6565b6040516102a39190613804565b60405180910390f35b6102c660048036038101906102c191906138e3565b61092e565b005b6102d0610cab565b6040516102dd91906139d1565b60405180910390f35b61030060048036038101906102fb9190613b45565b610cc5565b005b61031c60048036038101906103179190613b8e565b610ec6565b005b61033860048036038101906103339190613685565b610f6e565b005b61034261102e565b60405161034f9190613804565b60405180910390f35b610372600480360381019061036d9190613685565b611034565b005b61037c6110f4565b6040516103899190613804565b60405180910390f35b6103ac60048036038101906103a791906137c8565b6110fa565b005b6103b6611180565b005b6103d260048036038101906103cd9190613bbb565b611221565b005b6103dc6112c1565b6040516103e99190613bf7565b60405180910390f35b6103fa6112d7565b6040516104079190613c71565b60405180910390f35b61042a60048036038101906104259190613b45565b6112fd565b005b61044660048036038101906104419190613bbb565b6114e3565b005b610450611583565b60405161045d9190613ca7565b60405180910390f35b610480600480360381019061047b9190613685565b61159a565b60405161048d919061377a565b60405180910390f35b61049e6116da565b005b6104a8611762565b6040516104b59190613c71565b60405180910390f35b6104d860048036038101906104d39190613685565b611788565b005b6104f460048036038101906104ef9190613685565b611848565b005b6104fe611908565b60405161050b9190613cd1565b60405180910390f35b61052e60048036038101906105299190613685565b611932565b60405161053b9190613804565b60405180910390f35b61055e60048036038101906105599190613b45565b611a98565b005b61057a60048036038101906105759190613b45565b611e81565b005b6105846122c7565b005b6105a0600480360381019061059b9190613b45565b612489565b6040516105ad9190613804565b60405180910390f35b6105d060048036038101906105cb91906137c8565b61255a565b6040516105dd9190613804565b60405180910390f35b6105ee6125ef565b6040516105fb9190613bf7565b60405180910390f35b61061e600480360381019061061991906137c8565b612605565b005b6106286126cd565b005b610632612870565b60405161063f9190613cfb565b60405180910390f35b610662600480360381019061065d91906137c8565b612892565b60405161066f9190613804565b60405180910390f35b610692600480360381019061068d9190613d16565b61290a565b005b6106ae60048036038101906106a99190613685565b6129c2565b6040516106bb919061377a565b60405180910390f35b6106cc612aef565b6040516106d99190613c71565b60405180910390f35b6106fc60048036038101906106f79190613685565b612b15565b005b610706612c0d565b6040516107139190613d64565b60405180910390f35b60606000610767609e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c33565b9050600061077484611932565b90508167ffffffffffffffff8111156107905761078f613a02565b5b6040519080825280602002602001820160405280156107be5781602001602082028036833780820191505090505b50925060005b828110156108ae57600061081f82609e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4890919063ffffffff16565b9050600061082c8261255a565b90506103e881856103e86108409190613dae565b61084a9190613dae565b610866609f600086815260200190815260200160002054612c62565b6108709190613e04565b61087a9190613e8d565b86848151811061088d5761088c613ebe565b5b602002602001018181525050505080806108a690613eed565b9150506107c4565b505050919050565b6000600f8211156108ca5760459050610929565b60088211156108dc5760329050610929565b60068211156108ee5760289050610929565b600482111561090057601e9050610929565b60028211156109125760149050610929565b600082111561092457600a9050610929565b600090505b919050565b600060019054906101000a900460ff166109565760008054906101000a900460ff161561095f565b61095e612caf565b5b61099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590613fb9565b60405180910390fd5b60008060019054906101000a900460ff1615905080156109ee576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6109f6612cc0565b6109fe612d19565b8a609a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089609b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088609c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087609d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086609981905550856098819055508460a160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360a160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260a160186101000a81548163ffffffff021916908363ffffffff1602179055508160a1601c6101000a81548163ffffffff021916908363ffffffff160217905550609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610c31929190613fd9565b6020604051808303816000875af1158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c74919061402e565b50610c7d612d72565b8015610c9e5760008060016101000a81548160ff0219169083151502179055505b5050505050505050505050565b60a160109054906101000a900467ffffffffffffffff1681565b610ccd611583565b15610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d04906140a7565b60405180910390fd5b600080610d1933611932565b905060005b8351811015610eb757610d92848281518110610d3d57610d3c613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e1590919063ffffffff16565b610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890614113565b60405180910390fd5b6000609f6000868481518110610dea57610de9613ebe565b5b602002602001015181526020019081526020016000205490506000610e28868481518110610e1b57610e1a613ebe565b5b602002602001015161255a565b905042609f6000888681518110610e4257610e41613ebe565b5b60200260200101518152602001908152602001600020819055506103e881856103e8610e6e9190613dae565b610e789190613dae565b610e8184612c62565b610e8b9190613e04565b610e959190613e8d565b85610ea09190613dae565b945050508080610eaf90613eed565b915050610d1e565b50610ec182612e2f565b505050565b610ece613045565b73ffffffffffffffffffffffffffffffffffffffff16610eec611908565b73ffffffffffffffffffffffffffffffffffffffff1614610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f399061417f565b60405180910390fd5b8060a160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b610f76613045565b73ffffffffffffffffffffffffffffffffffffffff16610f94611908565b73ffffffffffffffffffffffffffffffffffffffff1614610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe19061417f565b60405180910390fd5b80609a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60995481565b61103c613045565b73ffffffffffffffffffffffffffffffffffffffff1661105a611908565b73ffffffffffffffffffffffffffffffffffffffff16146110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a79061417f565b60405180910390fd5b80609c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60985481565b611102613045565b73ffffffffffffffffffffffffffffffffffffffff16611120611908565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061417f565b60405180910390fd5b8060998190555050565b611188613045565b73ffffffffffffffffffffffffffffffffffffffff166111a6611908565b73ffffffffffffffffffffffffffffffffffffffff16146111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f39061417f565b60405180910390fd5b611204611583565b156112165761121161304d565b61121f565b61121e612d72565b5b565b611229613045565b73ffffffffffffffffffffffffffffffffffffffff16611247611908565b73ffffffffffffffffffffffffffffffffffffffff161461129d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112949061417f565b60405180910390fd5b8060a160186101000a81548163ffffffff021916908363ffffffff16021790555050565b60a160189054906101000a900463ffffffff1681565b609c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611305611583565b15611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c906140a7565b60405180910390fd5b60005b81518110156114df576113bc82828151811061136757611366613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130ef90919063ffffffff16565b504260a060008484815181106113d5576113d4613ebe565b5b602002602001015181526020019081526020016000208190555042609f600084848151811061140757611406613ebe565b5b6020026020010151815260200190815260200160002081905550609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd333085858151811061147457611473613ebe565b5b60200260200101516040518463ffffffff1660e01b815260040161149a9392919061419f565b600060405180830381600087803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b5050505080806114d790613eed565b915050611348565b5050565b6114eb613045565b73ffffffffffffffffffffffffffffffffffffffff16611509611908565b73ffffffffffffffffffffffffffffffffffffffff161461155f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115569061417f565b60405180910390fd5b8060a1601c6101000a81548163ffffffff021916908363ffffffff16021790555050565b6000606560009054906101000a900460ff16905090565b606060006115e5609e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c33565b90508067ffffffffffffffff81111561160157611600613a02565b5b60405190808252806020026020018201604052801561162f5781602001602082028036833780820191505090505b50915060005b818110156116d35760a0600061169283609e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4890919063ffffffff16565b8152602001908152602001600020548382815181106116b4576116b3613ebe565b5b60200260200101818152505080806116cb90613eed565b915050611635565b5050919050565b6116e2613045565b73ffffffffffffffffffffffffffffffffffffffff16611700611908565b73ffffffffffffffffffffffffffffffffffffffff1614611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d9061417f565b60405180910390fd5b6117606000613109565b565b609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611790613045565b73ffffffffffffffffffffffffffffffffffffffff166117ae611908565b73ffffffffffffffffffffffffffffffffffffffff1614611804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fb9061417f565b60405180910390fd5b80609c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611850613045565b73ffffffffffffffffffffffffffffffffffffffff1661186e611908565b73ffffffffffffffffffffffffffffffffffffffff16146118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb9061417f565b60405180910390fd5b80609b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080609c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016119909190613cd1565b602060405180830381865afa1580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d191906141eb565b90506000609d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611a309190613cd1565b602060405180830381865afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7191906141eb565b9050611a7c81612892565b611a85836108b6565b611a8f9190613dae565b92505050919050565b611aa0611583565b15611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad7906140a7565b60405180910390fd5b6000611aeb82612489565b90506000811115611b8657609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc679033836040518363ffffffff1660e01b8152600401611b53929190613fd9565b600060405180830381600087803b158015611b6d57600080fd5b505af1158015611b81573d6000803e3d6000fd5b505050505b6000611b9133611932565b90506000805b8451811015611e7157611c0b858281518110611bb657611bb5613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e1590919063ffffffff16565b611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4190614113565b60405180910390fd5b6000611c6f868381518110611c6257611c61613ebe565b5b602002602001015161255a565b90506103e881856103e8611c839190613dae565b611c8d9190613dae565b611cc3609f60008a8781518110611ca757611ca6613ebe565b5b6020026020010151815260200190815260200160002054612c62565b611ccd9190613e04565b611cd79190613e8d565b83611ce29190613dae565b9250611d4f868381518110611cfa57611cf9613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131cf90919063ffffffff16565b5060a06000878481518110611d6757611d66613ebe565b5b6020026020010151815260200190815260200160002060009055609f6000878481518110611d9857611d97613ebe565b5b6020026020010151815260200190815260200160002060009055609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033898681518110611e0557611e04613ebe565b5b60200260200101516040518463ffffffff1660e01b8152600401611e2b9392919061419f565b600060405180830381600087803b158015611e4557600080fd5b505af1158015611e59573d6000803e3d6000fd5b50505050508080611e6990613eed565b915050611b97565b50611e7b81612e2f565b50505050565b611e89611583565b15611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec0906140a7565b60405180910390fd5b600080611ed533611932565b90506000611ee384516131e9565b905060005b845181101561221f57611f5c858281518110611f0757611f06613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e1590919063ffffffff16565b611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9290614113565b60405180910390fd5b6000609f6000878481518110611fb457611fb3613ebe565b5b602002602001015181526020019081526020016000205490506000611ff2878481518110611fe557611fe4613ebe565b5b602002602001015161255a565b905042609f600089868151811061200c5761200b613ebe565b5b602002602001015181526020019081526020016000208190555060006103e882876103e861203a9190613dae565b6120449190613dae565b61204d85612c62565b6120579190613e04565b6120619190613e8d565b905084848151811061207657612075613ebe565b5b6020026020010151156121485760006103e860a160189054906101000a900463ffffffff1663ffffffff16836120ac9190613e04565b6120b69190613e8d565b9050600081836120c69190613dae565b905080896120d49190613dae565b98508986815181106120e9576120e8613ebe565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167f76b48e21a8fd2cf7570edc471a033121c55ad37cfc77f948b184ff3e05fd71668385604051612139929190614218565b60405180910390a35050612209565b60006103e860a1601c9054906101000a900463ffffffff1663ffffffff16836121719190613e04565b61217b9190613e8d565b90506000818361218b9190614241565b905080896121999190613dae565b98508986815181106121ae576121ad613ebe565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167f15989836dc9259bee71972d99325b98f8299c03a57100e62ddb06aebbe3f5a8c83856040516121fe929190614218565b60405180910390a350505b505050808061221790613eed565b915050611ee8565b50609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b815260040161227d929190613fd9565b6020604051808303816000875af115801561229c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c0919061402e565b5050505050565b6122cf613045565b73ffffffffffffffffffffffffffffffffffffffff166122ed611908565b73ffffffffffffffffffffffffffffffffffffffff1614612343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233a9061417f565b60405180910390fd5b6000609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123a09190613cd1565b602060405180830381865afa1580156123bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e191906141eb565b9050609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b81526004016124429392919061419f565b6020604051808303816000875af1158015612461573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612485919061402e565b5050565b60008060005b835181101561255057600060a060008684815181106124b1576124b0613ebe565b5b6020026020010151815260200190815260200160002054426124d39190614241565b905060a160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1681101561253c5760a160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16836125399190613dae565b92505b50808061254890613eed565b91505061248f565b5080915050919050565b60008060a0600084815260200190815260200160002054141561258057600090506125ea565b600060a0600084815260200190815260200160002054426125a19190614241565b9050630163f5008111156125ba5761012c9150506125ea565b62ed4e008111156125cf5760c89150506125ea565b6276a7008111156125e45760649150506125ea565b60009150505b919050565b60a1601c9054906101000a900463ffffffff1681565b61260d613045565b73ffffffffffffffffffffffffffffffffffffffff1661262b611908565b73ffffffffffffffffffffffffffffffffffffffff1614612681576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126789061417f565b60405180910390fd5b4281116126c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ba906142e7565b60405180910390fd5b8060988190555050565b6126d5611583565b15612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c906140a7565b60405180910390fd5b60008061272133611932565b905060005b61276d609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c33565b8110156128625760006127c782609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4890919063ffffffff16565b90506000609f600083815260200190815260200160002054905060006127ec8361255a565b905042609f6000858152602001908152602001600020819055506103e881866103e86128189190613dae565b6128229190613dae565b61282b84612c62565b6128359190613e04565b61283f9190613e8d565b8661284a9190613dae565b9550505050808061285a90613eed565b915050612726565b5061286c82612e2f565b5050565b60a160009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600060138211156128a65760459050612905565b600c8211156128b85760329050612905565b60098211156128ca5760289050612905565b60068211156128dc57601e9050612905565b60038211156128ee5760149050612905565b600082111561290057600a9050612905565b600090505b919050565b612912613045565b73ffffffffffffffffffffffffffffffffffffffff16612930611908565b73ffffffffffffffffffffffffffffffffffffffff1614612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9061417f565b60405180910390fd5b8060a160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b60606000612a0d609e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c33565b90508067ffffffffffffffff811115612a2957612a28613a02565b5b604051908082528060200260200182016040528015612a575781602001602082028036833780820191505090505b50915060005b81811015612ae857612ab681609e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4890919063ffffffff16565b838281518110612ac957612ac8613ebe565b5b6020026020010181815250508080612ae090613eed565b915050612a5d565b5050919050565b609d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b1d613045565b73ffffffffffffffffffffffffffffffffffffffff16612b3b611908565b73ffffffffffffffffffffffffffffffffffffffff1614612b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b889061417f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf890614379565b60405180910390fd5b612c0a81613109565b50565b609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612c41826000016132dd565b9050919050565b6000612c5783600001836132ee565b60001c905092915050565b600080821415612c755760009050612caa565b6201518060995483612c8942609854613319565b612c939190614241565b612c9d9190613e04565b612ca79190613e8d565b90505b919050565b6000612cba30613332565b15905090565b600060019054906101000a900460ff16612d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d069061440b565b60405180910390fd5b612d17613355565b565b600060019054906101000a900460ff16612d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5f9061440b565b60405180910390fd5b612d706133b6565b565b612d7a611583565b15612dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db1906140a7565b60405180910390fd5b6001606560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612dfe613045565b604051612e0b9190613cd1565b60405180910390a1565b6000612e27836000018360001b613422565b905092915050565b60006103e860a160189054906101000a900463ffffffff1663ffffffff1683612e589190613e04565b612e629190613e8d565b905060008183612e729190614241565b9050609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc679030846040518363ffffffff1660e01b8152600401612ed1929190613fd9565b600060405180830381600087803b158015612eeb57600080fd5b505af1158015612eff573d6000803e3d6000fd5b50505050609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612f60929190613fd9565b6020604051808303816000875af1158015612f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa3919061402e565b503373ffffffffffffffffffffffffffffffffffffffff167f81bf301ad61835f65f3f697ba395e70f94b8c41c1f412f3d57cc3835d3dfa3b983604051612fea9190613804565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f579aca2749e8480300319147da5ff5964a2f382bccd3368e14ae0d200793827d826040516130389190613804565b60405180910390a2505050565b600033905090565b613055611583565b613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308b90614477565b60405180910390fd5b6000606560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130d8613045565b6040516130e59190613cd1565b60405180910390a1565b6000613101836000018360001b613445565b905092915050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006131e1836000018360001b6134b5565b905092915050565b6060610100821115613230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613227906144e3565b60405180910390fd5b8167ffffffffffffffff81111561324a57613249613a02565b5b6040519080825280602002602001820160405280156132785781602001602082028036833780820191505090505b50905060006132856135c9565b60001c905060005b838110156132d6576001808284901c16148382815181106132b1576132b0613ebe565b5b60200260200101901515908115158152505080806132ce90613eed565b91505061328d565b5050919050565b600081600001805490509050919050565b600082600001828154811061330657613305613ebe565b5b9060005260206000200154905092915050565b6000818310613328578161332a565b825b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff166133a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339b9061440b565b60405180910390fd5b6133b46133af613045565b613109565b565b600060019054906101000a900460ff16613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc9061440b565b60405180910390fd5b6000606560006101000a81548160ff021916908315150217905550565b600080836001016000848152602001908152602001600020541415905092915050565b60006134518383613422565b6134aa5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506134af565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146135bd5760006001826134e79190614241565b90506000600186600001805490506134ff9190614241565b905081811461356e5760008660000182815481106135205761351f613ebe565b5b906000526020600020015490508087600001848154811061354457613543613ebe565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061358257613581614503565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506135c3565b60009150505b92915050565b6000424433609760008154809291906135e190613eed565b919050556040516020016135f8949392919061459b565b60405160208183030381529060405280519060200120905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061365282613627565b9050919050565b61366281613647565b811461366d57600080fd5b50565b60008135905061367f81613659565b92915050565b60006020828403121561369b5761369a61361d565b5b60006136a984828501613670565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6136f1816136de565b82525050565b600061370383836136e8565b60208301905092915050565b6000602082019050919050565b6000613727826136b2565b61373181856136bd565b935061373c836136ce565b8060005b8381101561376d57815161375488826136f7565b975061375f8361370f565b925050600181019050613740565b5085935050505092915050565b60006020820190508181036000830152613794818461371c565b905092915050565b6137a5816136de565b81146137b057600080fd5b50565b6000813590506137c28161379c565b92915050565b6000602082840312156137de576137dd61361d565b5b60006137ec848285016137b3565b91505092915050565b6137fe816136de565b82525050565b600060208201905061381960008301846137f5565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6138448161381f565b811461384f57600080fd5b50565b6000813590506138618161383b565b92915050565b600067ffffffffffffffff82169050919050565b61388481613867565b811461388f57600080fd5b50565b6000813590506138a18161387b565b92915050565b600063ffffffff82169050919050565b6138c0816138a7565b81146138cb57600080fd5b50565b6000813590506138dd816138b7565b92915050565b6000806000806000806000806000806101408b8d0312156139075761390661361d565b5b60006139158d828e01613670565b9a505060206139268d828e01613670565b99505060406139378d828e01613670565b98505060606139488d828e01613670565b97505060806139598d828e016137b3565b96505060a061396a8d828e016137b3565b95505060c061397b8d828e01613852565b94505060e061398c8d828e01613892565b93505061010061399e8d828e016138ce565b9250506101206139b08d828e016138ce565b9150509295989b9194979a5092959850565b6139cb81613867565b82525050565b60006020820190506139e660008301846139c2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a3a826139f1565b810181811067ffffffffffffffff82111715613a5957613a58613a02565b5b80604052505050565b6000613a6c613613565b9050613a788282613a31565b919050565b600067ffffffffffffffff821115613a9857613a97613a02565b5b602082029050602081019050919050565b600080fd5b6000613ac1613abc84613a7d565b613a62565b90508083825260208201905060208402830185811115613ae457613ae3613aa9565b5b835b81811015613b0d5780613af988826137b3565b845260208401935050602081019050613ae6565b5050509392505050565b600082601f830112613b2c57613b2b6139ec565b5b8135613b3c848260208601613aae565b91505092915050565b600060208284031215613b5b57613b5a61361d565b5b600082013567ffffffffffffffff811115613b7957613b78613622565b5b613b8584828501613b17565b91505092915050565b600060208284031215613ba457613ba361361d565b5b6000613bb284828501613892565b91505092915050565b600060208284031215613bd157613bd061361d565b5b6000613bdf848285016138ce565b91505092915050565b613bf1816138a7565b82525050565b6000602082019050613c0c6000830184613be8565b92915050565b6000819050919050565b6000613c37613c32613c2d84613627565b613c12565b613627565b9050919050565b6000613c4982613c1c565b9050919050565b6000613c5b82613c3e565b9050919050565b613c6b81613c50565b82525050565b6000602082019050613c866000830184613c62565b92915050565b60008115159050919050565b613ca181613c8c565b82525050565b6000602082019050613cbc6000830184613c98565b92915050565b613ccb81613647565b82525050565b6000602082019050613ce66000830184613cc2565b92915050565b613cf58161381f565b82525050565b6000602082019050613d106000830184613cec565b92915050565b600060208284031215613d2c57613d2b61361d565b5b6000613d3a84828501613852565b91505092915050565b6000613d4e82613c3e565b9050919050565b613d5e81613d43565b82525050565b6000602082019050613d796000830184613d55565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613db9826136de565b9150613dc4836136de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613df957613df8613d7f565b5b828201905092915050565b6000613e0f826136de565b9150613e1a836136de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5357613e52613d7f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e98826136de565b9150613ea3836136de565b925082613eb357613eb2613e5e565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613ef8826136de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2b57613f2a613d7f565b5b600182019050919050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000613fa3602e83613f36565b9150613fae82613f47565b604082019050919050565b60006020820190508181036000830152613fd281613f96565b9050919050565b6000604082019050613fee6000830185613cc2565b613ffb60208301846137f5565b9392505050565b61400b81613c8c565b811461401657600080fd5b50565b60008151905061402881614002565b92915050565b6000602082840312156140445761404361361d565b5b600061405284828501614019565b91505092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614091601083613f36565b915061409c8261405b565b602082019050919050565b600060208201905081810360008301526140c081614084565b9050919050565b7f517565727920666f72206120746f6b656e20796f7520646f6e2774206f776e00600082015250565b60006140fd601f83613f36565b9150614108826140c7565b602082019050919050565b6000602082019050818103600083015261412c816140f0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614169602083613f36565b915061417482614133565b602082019050919050565b600060208201905081810360008301526141988161415c565b9050919050565b60006060820190506141b46000830186613cc2565b6141c16020830185613cc2565b6141ce60408301846137f5565b949350505050565b6000815190506141e58161379c565b92915050565b6000602082840312156142015761420061361d565b5b600061420f848285016141d6565b91505092915050565b600060408201905061422d60008301856137f5565b61423a60208301846137f5565b9392505050565b600061424c826136de565b9150614257836136de565b92508282101561426a57614269613d7f565b5b828203905092915050565b7f456e642074696d65206d7573742062652067726561746572207468616e206e6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006142d1602183613f36565b91506142dc82614275565b604082019050919050565b60006020820190508181036000830152614300816142c4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614363602683613f36565b915061436e82614307565b604082019050919050565b6000602082019050818103600083015261439281614356565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006143f5602b83613f36565b915061440082614399565b604082019050919050565b60006020820190508181036000830152614424816143e8565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614461601483613f36565b915061446c8261442b565b602082019050919050565b6000602082019050818103600083015261449081614454565b9050919050565b7f457863656564206d61782073697a65203a203235360000000000000000000000600082015250565b60006144cd601583613f36565b91506144d882614497565b602082019050919050565b600060208201905081810360008301526144fc816144c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000819050919050565b61454d614548826136de565b614532565b82525050565b60008160601b9050919050565b600061456b82614553565b9050919050565b600061457d82614560565b9050919050565b61459561459082613647565b614572565b82525050565b60006145a7828761453c565b6020820191506145b7828661453c565b6020820191506145c78285614584565b6014820191506145d7828461453c565b6020820191508190509594505050505056fea26469706673582212205dde6e3c1bfafe07aa6b341b092b98d36764da215cd9f8e110a62cfa9b148d8564736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102475760003560e01c806372f702f31161013b578063cb87cfdf116100b8578063e0f695e81161007c578063e0f695e814610678578063e3a9db1a14610694578063e9970f04146106c4578063f2fde38b146106e2578063f7c618c1146106fe57610247565b8063cb87cfdf146105e6578063ccb98ffc14610604578063d1058e5914610620578063d29004d91461062a578063da700fbc1461064857610247565b8063983d95ce116100ff578063983d95ce14610544578063a0abbaba14610560578063aa7a07e91461057c578063b3f3f42b14610586578063c3182360146105b657610247565b806372f702f3146104a05780637e5b5c44146104be5780638aee8127146104da5780638da5cb5b146104f657806394ed01471461051457610247565b806334fcf437116101c9578063598b8e711161018d578063598b8e71146104105780635ba2db511461042c5780635c975abb14610448578063617944cf14610466578063715018a61461049657610247565b806334fcf4371461039257806336566f06146103ae57806341cc342d146103b857806343f40728146103d4578063441f61ed146103f257610247565b80631458a566116102105780631458a566146103025780631e9b12ef1461031e5780632c4e722e1461033a5780632cffc8fc146103585780633197cbb61461037457610247565b80628cc2621461024c578063026548911461027c57806306391d77146102ac578063069c34f6146102c85780630fdb5a86146102e6575b600080fd5b61026660048036038101906102619190613685565b61071c565b604051610273919061377a565b60405180910390f35b610296600480360381019061029191906137c8565b6108b6565b6040516102a39190613804565b60405180910390f35b6102c660048036038101906102c191906138e3565b61092e565b005b6102d0610cab565b6040516102dd91906139d1565b60405180910390f35b61030060048036038101906102fb9190613b45565b610cc5565b005b61031c60048036038101906103179190613b8e565b610ec6565b005b61033860048036038101906103339190613685565b610f6e565b005b61034261102e565b60405161034f9190613804565b60405180910390f35b610372600480360381019061036d9190613685565b611034565b005b61037c6110f4565b6040516103899190613804565b60405180910390f35b6103ac60048036038101906103a791906137c8565b6110fa565b005b6103b6611180565b005b6103d260048036038101906103cd9190613bbb565b611221565b005b6103dc6112c1565b6040516103e99190613bf7565b60405180910390f35b6103fa6112d7565b6040516104079190613c71565b60405180910390f35b61042a60048036038101906104259190613b45565b6112fd565b005b61044660048036038101906104419190613bbb565b6114e3565b005b610450611583565b60405161045d9190613ca7565b60405180910390f35b610480600480360381019061047b9190613685565b61159a565b60405161048d919061377a565b60405180910390f35b61049e6116da565b005b6104a8611762565b6040516104b59190613c71565b60405180910390f35b6104d860048036038101906104d39190613685565b611788565b005b6104f460048036038101906104ef9190613685565b611848565b005b6104fe611908565b60405161050b9190613cd1565b60405180910390f35b61052e60048036038101906105299190613685565b611932565b60405161053b9190613804565b60405180910390f35b61055e60048036038101906105599190613b45565b611a98565b005b61057a60048036038101906105759190613b45565b611e81565b005b6105846122c7565b005b6105a0600480360381019061059b9190613b45565b612489565b6040516105ad9190613804565b60405180910390f35b6105d060048036038101906105cb91906137c8565b61255a565b6040516105dd9190613804565b60405180910390f35b6105ee6125ef565b6040516105fb9190613bf7565b60405180910390f35b61061e600480360381019061061991906137c8565b612605565b005b6106286126cd565b005b610632612870565b60405161063f9190613cfb565b60405180910390f35b610662600480360381019061065d91906137c8565b612892565b60405161066f9190613804565b60405180910390f35b610692600480360381019061068d9190613d16565b61290a565b005b6106ae60048036038101906106a99190613685565b6129c2565b6040516106bb919061377a565b60405180910390f35b6106cc612aef565b6040516106d99190613c71565b60405180910390f35b6106fc60048036038101906106f79190613685565b612b15565b005b610706612c0d565b6040516107139190613d64565b60405180910390f35b60606000610767609e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c33565b9050600061077484611932565b90508167ffffffffffffffff8111156107905761078f613a02565b5b6040519080825280602002602001820160405280156107be5781602001602082028036833780820191505090505b50925060005b828110156108ae57600061081f82609e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4890919063ffffffff16565b9050600061082c8261255a565b90506103e881856103e86108409190613dae565b61084a9190613dae565b610866609f600086815260200190815260200160002054612c62565b6108709190613e04565b61087a9190613e8d565b86848151811061088d5761088c613ebe565b5b602002602001018181525050505080806108a690613eed565b9150506107c4565b505050919050565b6000600f8211156108ca5760459050610929565b60088211156108dc5760329050610929565b60068211156108ee5760289050610929565b600482111561090057601e9050610929565b60028211156109125760149050610929565b600082111561092457600a9050610929565b600090505b919050565b600060019054906101000a900460ff166109565760008054906101000a900460ff161561095f565b61095e612caf565b5b61099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590613fb9565b60405180910390fd5b60008060019054906101000a900460ff1615905080156109ee576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6109f6612cc0565b6109fe612d19565b8a609a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089609b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088609c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087609d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086609981905550856098819055508460a160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360a160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260a160186101000a81548163ffffffff021916908363ffffffff1602179055508160a1601c6101000a81548163ffffffff021916908363ffffffff160217905550609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610c31929190613fd9565b6020604051808303816000875af1158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c74919061402e565b50610c7d612d72565b8015610c9e5760008060016101000a81548160ff0219169083151502179055505b5050505050505050505050565b60a160109054906101000a900467ffffffffffffffff1681565b610ccd611583565b15610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d04906140a7565b60405180910390fd5b600080610d1933611932565b905060005b8351811015610eb757610d92848281518110610d3d57610d3c613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e1590919063ffffffff16565b610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890614113565b60405180910390fd5b6000609f6000868481518110610dea57610de9613ebe565b5b602002602001015181526020019081526020016000205490506000610e28868481518110610e1b57610e1a613ebe565b5b602002602001015161255a565b905042609f6000888681518110610e4257610e41613ebe565b5b60200260200101518152602001908152602001600020819055506103e881856103e8610e6e9190613dae565b610e789190613dae565b610e8184612c62565b610e8b9190613e04565b610e959190613e8d565b85610ea09190613dae565b945050508080610eaf90613eed565b915050610d1e565b50610ec182612e2f565b505050565b610ece613045565b73ffffffffffffffffffffffffffffffffffffffff16610eec611908565b73ffffffffffffffffffffffffffffffffffffffff1614610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f399061417f565b60405180910390fd5b8060a160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b610f76613045565b73ffffffffffffffffffffffffffffffffffffffff16610f94611908565b73ffffffffffffffffffffffffffffffffffffffff1614610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe19061417f565b60405180910390fd5b80609a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60995481565b61103c613045565b73ffffffffffffffffffffffffffffffffffffffff1661105a611908565b73ffffffffffffffffffffffffffffffffffffffff16146110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a79061417f565b60405180910390fd5b80609c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60985481565b611102613045565b73ffffffffffffffffffffffffffffffffffffffff16611120611908565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061417f565b60405180910390fd5b8060998190555050565b611188613045565b73ffffffffffffffffffffffffffffffffffffffff166111a6611908565b73ffffffffffffffffffffffffffffffffffffffff16146111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f39061417f565b60405180910390fd5b611204611583565b156112165761121161304d565b61121f565b61121e612d72565b5b565b611229613045565b73ffffffffffffffffffffffffffffffffffffffff16611247611908565b73ffffffffffffffffffffffffffffffffffffffff161461129d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112949061417f565b60405180910390fd5b8060a160186101000a81548163ffffffff021916908363ffffffff16021790555050565b60a160189054906101000a900463ffffffff1681565b609c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611305611583565b15611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c906140a7565b60405180910390fd5b60005b81518110156114df576113bc82828151811061136757611366613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130ef90919063ffffffff16565b504260a060008484815181106113d5576113d4613ebe565b5b602002602001015181526020019081526020016000208190555042609f600084848151811061140757611406613ebe565b5b6020026020010151815260200190815260200160002081905550609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd333085858151811061147457611473613ebe565b5b60200260200101516040518463ffffffff1660e01b815260040161149a9392919061419f565b600060405180830381600087803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b5050505080806114d790613eed565b915050611348565b5050565b6114eb613045565b73ffffffffffffffffffffffffffffffffffffffff16611509611908565b73ffffffffffffffffffffffffffffffffffffffff161461155f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115569061417f565b60405180910390fd5b8060a1601c6101000a81548163ffffffff021916908363ffffffff16021790555050565b6000606560009054906101000a900460ff16905090565b606060006115e5609e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c33565b90508067ffffffffffffffff81111561160157611600613a02565b5b60405190808252806020026020018201604052801561162f5781602001602082028036833780820191505090505b50915060005b818110156116d35760a0600061169283609e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4890919063ffffffff16565b8152602001908152602001600020548382815181106116b4576116b3613ebe565b5b60200260200101818152505080806116cb90613eed565b915050611635565b5050919050565b6116e2613045565b73ffffffffffffffffffffffffffffffffffffffff16611700611908565b73ffffffffffffffffffffffffffffffffffffffff1614611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d9061417f565b60405180910390fd5b6117606000613109565b565b609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611790613045565b73ffffffffffffffffffffffffffffffffffffffff166117ae611908565b73ffffffffffffffffffffffffffffffffffffffff1614611804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fb9061417f565b60405180910390fd5b80609c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611850613045565b73ffffffffffffffffffffffffffffffffffffffff1661186e611908565b73ffffffffffffffffffffffffffffffffffffffff16146118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb9061417f565b60405180910390fd5b80609b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080609c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016119909190613cd1565b602060405180830381865afa1580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d191906141eb565b90506000609d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611a309190613cd1565b602060405180830381865afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7191906141eb565b9050611a7c81612892565b611a85836108b6565b611a8f9190613dae565b92505050919050565b611aa0611583565b15611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad7906140a7565b60405180910390fd5b6000611aeb82612489565b90506000811115611b8657609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc679033836040518363ffffffff1660e01b8152600401611b53929190613fd9565b600060405180830381600087803b158015611b6d57600080fd5b505af1158015611b81573d6000803e3d6000fd5b505050505b6000611b9133611932565b90506000805b8451811015611e7157611c0b858281518110611bb657611bb5613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e1590919063ffffffff16565b611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4190614113565b60405180910390fd5b6000611c6f868381518110611c6257611c61613ebe565b5b602002602001015161255a565b90506103e881856103e8611c839190613dae565b611c8d9190613dae565b611cc3609f60008a8781518110611ca757611ca6613ebe565b5b6020026020010151815260200190815260200160002054612c62565b611ccd9190613e04565b611cd79190613e8d565b83611ce29190613dae565b9250611d4f868381518110611cfa57611cf9613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131cf90919063ffffffff16565b5060a06000878481518110611d6757611d66613ebe565b5b6020026020010151815260200190815260200160002060009055609f6000878481518110611d9857611d97613ebe565b5b6020026020010151815260200190815260200160002060009055609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033898681518110611e0557611e04613ebe565b5b60200260200101516040518463ffffffff1660e01b8152600401611e2b9392919061419f565b600060405180830381600087803b158015611e4557600080fd5b505af1158015611e59573d6000803e3d6000fd5b50505050508080611e6990613eed565b915050611b97565b50611e7b81612e2f565b50505050565b611e89611583565b15611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec0906140a7565b60405180910390fd5b600080611ed533611932565b90506000611ee384516131e9565b905060005b845181101561221f57611f5c858281518110611f0757611f06613ebe565b5b6020026020010151609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e1590919063ffffffff16565b611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9290614113565b60405180910390fd5b6000609f6000878481518110611fb457611fb3613ebe565b5b602002602001015181526020019081526020016000205490506000611ff2878481518110611fe557611fe4613ebe565b5b602002602001015161255a565b905042609f600089868151811061200c5761200b613ebe565b5b602002602001015181526020019081526020016000208190555060006103e882876103e861203a9190613dae565b6120449190613dae565b61204d85612c62565b6120579190613e04565b6120619190613e8d565b905084848151811061207657612075613ebe565b5b6020026020010151156121485760006103e860a160189054906101000a900463ffffffff1663ffffffff16836120ac9190613e04565b6120b69190613e8d565b9050600081836120c69190613dae565b905080896120d49190613dae565b98508986815181106120e9576120e8613ebe565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167f76b48e21a8fd2cf7570edc471a033121c55ad37cfc77f948b184ff3e05fd71668385604051612139929190614218565b60405180910390a35050612209565b60006103e860a1601c9054906101000a900463ffffffff1663ffffffff16836121719190613e04565b61217b9190613e8d565b90506000818361218b9190614241565b905080896121999190613dae565b98508986815181106121ae576121ad613ebe565b5b60200260200101513373ffffffffffffffffffffffffffffffffffffffff167f15989836dc9259bee71972d99325b98f8299c03a57100e62ddb06aebbe3f5a8c83856040516121fe929190614218565b60405180910390a350505b505050808061221790613eed565b915050611ee8565b50609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b815260040161227d929190613fd9565b6020604051808303816000875af115801561229c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c0919061402e565b5050505050565b6122cf613045565b73ffffffffffffffffffffffffffffffffffffffff166122ed611908565b73ffffffffffffffffffffffffffffffffffffffff1614612343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233a9061417f565b60405180910390fd5b6000609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123a09190613cd1565b602060405180830381865afa1580156123bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e191906141eb565b9050609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b81526004016124429392919061419f565b6020604051808303816000875af1158015612461573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612485919061402e565b5050565b60008060005b835181101561255057600060a060008684815181106124b1576124b0613ebe565b5b6020026020010151815260200190815260200160002054426124d39190614241565b905060a160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1681101561253c5760a160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16836125399190613dae565b92505b50808061254890613eed565b91505061248f565b5080915050919050565b60008060a0600084815260200190815260200160002054141561258057600090506125ea565b600060a0600084815260200190815260200160002054426125a19190614241565b9050630163f5008111156125ba5761012c9150506125ea565b62ed4e008111156125cf5760c89150506125ea565b6276a7008111156125e45760649150506125ea565b60009150505b919050565b60a1601c9054906101000a900463ffffffff1681565b61260d613045565b73ffffffffffffffffffffffffffffffffffffffff1661262b611908565b73ffffffffffffffffffffffffffffffffffffffff1614612681576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126789061417f565b60405180910390fd5b4281116126c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ba906142e7565b60405180910390fd5b8060988190555050565b6126d5611583565b15612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c906140a7565b60405180910390fd5b60008061272133611932565b905060005b61276d609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c33565b8110156128625760006127c782609e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4890919063ffffffff16565b90506000609f600083815260200190815260200160002054905060006127ec8361255a565b905042609f6000858152602001908152602001600020819055506103e881866103e86128189190613dae565b6128229190613dae565b61282b84612c62565b6128359190613e04565b61283f9190613e8d565b8661284a9190613dae565b9550505050808061285a90613eed565b915050612726565b5061286c82612e2f565b5050565b60a160009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600060138211156128a65760459050612905565b600c8211156128b85760329050612905565b60098211156128ca5760289050612905565b60068211156128dc57601e9050612905565b60038211156128ee5760149050612905565b600082111561290057600a9050612905565b600090505b919050565b612912613045565b73ffffffffffffffffffffffffffffffffffffffff16612930611908565b73ffffffffffffffffffffffffffffffffffffffff1614612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9061417f565b60405180910390fd5b8060a160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b60606000612a0d609e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c33565b90508067ffffffffffffffff811115612a2957612a28613a02565b5b604051908082528060200260200182016040528015612a575781602001602082028036833780820191505090505b50915060005b81811015612ae857612ab681609e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4890919063ffffffff16565b838281518110612ac957612ac8613ebe565b5b6020026020010181815250508080612ae090613eed565b915050612a5d565b5050919050565b609d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b1d613045565b73ffffffffffffffffffffffffffffffffffffffff16612b3b611908565b73ffffffffffffffffffffffffffffffffffffffff1614612b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b889061417f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf890614379565b60405180910390fd5b612c0a81613109565b50565b609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612c41826000016132dd565b9050919050565b6000612c5783600001836132ee565b60001c905092915050565b600080821415612c755760009050612caa565b6201518060995483612c8942609854613319565b612c939190614241565b612c9d9190613e04565b612ca79190613e8d565b90505b919050565b6000612cba30613332565b15905090565b600060019054906101000a900460ff16612d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d069061440b565b60405180910390fd5b612d17613355565b565b600060019054906101000a900460ff16612d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5f9061440b565b60405180910390fd5b612d706133b6565b565b612d7a611583565b15612dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db1906140a7565b60405180910390fd5b6001606560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612dfe613045565b604051612e0b9190613cd1565b60405180910390a1565b6000612e27836000018360001b613422565b905092915050565b60006103e860a160189054906101000a900463ffffffff1663ffffffff1683612e589190613e04565b612e629190613e8d565b905060008183612e729190614241565b9050609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc679030846040518363ffffffff1660e01b8152600401612ed1929190613fd9565b600060405180830381600087803b158015612eeb57600080fd5b505af1158015612eff573d6000803e3d6000fd5b50505050609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612f60929190613fd9565b6020604051808303816000875af1158015612f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa3919061402e565b503373ffffffffffffffffffffffffffffffffffffffff167f81bf301ad61835f65f3f697ba395e70f94b8c41c1f412f3d57cc3835d3dfa3b983604051612fea9190613804565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f579aca2749e8480300319147da5ff5964a2f382bccd3368e14ae0d200793827d826040516130389190613804565b60405180910390a2505050565b600033905090565b613055611583565b613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308b90614477565b60405180910390fd5b6000606560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130d8613045565b6040516130e59190613cd1565b60405180910390a1565b6000613101836000018360001b613445565b905092915050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006131e1836000018360001b6134b5565b905092915050565b6060610100821115613230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613227906144e3565b60405180910390fd5b8167ffffffffffffffff81111561324a57613249613a02565b5b6040519080825280602002602001820160405280156132785781602001602082028036833780820191505090505b50905060006132856135c9565b60001c905060005b838110156132d6576001808284901c16148382815181106132b1576132b0613ebe565b5b60200260200101901515908115158152505080806132ce90613eed565b91505061328d565b5050919050565b600081600001805490509050919050565b600082600001828154811061330657613305613ebe565b5b9060005260206000200154905092915050565b6000818310613328578161332a565b825b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff166133a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339b9061440b565b60405180910390fd5b6133b46133af613045565b613109565b565b600060019054906101000a900460ff16613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc9061440b565b60405180910390fd5b6000606560006101000a81548160ff021916908315150217905550565b600080836001016000848152602001908152602001600020541415905092915050565b60006134518383613422565b6134aa5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506134af565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146135bd5760006001826134e79190614241565b90506000600186600001805490506134ff9190614241565b905081811461356e5760008660000182815481106135205761351f613ebe565b5b906000526020600020015490508087600001848154811061354457613543613ebe565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061358257613581614503565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506135c3565b60009150505b92915050565b6000424433609760008154809291906135e190613eed565b919050556040516020016135f8949392919061459b565b60405160208183030381529060405280519060200120905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061365282613627565b9050919050565b61366281613647565b811461366d57600080fd5b50565b60008135905061367f81613659565b92915050565b60006020828403121561369b5761369a61361d565b5b60006136a984828501613670565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6136f1816136de565b82525050565b600061370383836136e8565b60208301905092915050565b6000602082019050919050565b6000613727826136b2565b61373181856136bd565b935061373c836136ce565b8060005b8381101561376d57815161375488826136f7565b975061375f8361370f565b925050600181019050613740565b5085935050505092915050565b60006020820190508181036000830152613794818461371c565b905092915050565b6137a5816136de565b81146137b057600080fd5b50565b6000813590506137c28161379c565b92915050565b6000602082840312156137de576137dd61361d565b5b60006137ec848285016137b3565b91505092915050565b6137fe816136de565b82525050565b600060208201905061381960008301846137f5565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6138448161381f565b811461384f57600080fd5b50565b6000813590506138618161383b565b92915050565b600067ffffffffffffffff82169050919050565b61388481613867565b811461388f57600080fd5b50565b6000813590506138a18161387b565b92915050565b600063ffffffff82169050919050565b6138c0816138a7565b81146138cb57600080fd5b50565b6000813590506138dd816138b7565b92915050565b6000806000806000806000806000806101408b8d0312156139075761390661361d565b5b60006139158d828e01613670565b9a505060206139268d828e01613670565b99505060406139378d828e01613670565b98505060606139488d828e01613670565b97505060806139598d828e016137b3565b96505060a061396a8d828e016137b3565b95505060c061397b8d828e01613852565b94505060e061398c8d828e01613892565b93505061010061399e8d828e016138ce565b9250506101206139b08d828e016138ce565b9150509295989b9194979a5092959850565b6139cb81613867565b82525050565b60006020820190506139e660008301846139c2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a3a826139f1565b810181811067ffffffffffffffff82111715613a5957613a58613a02565b5b80604052505050565b6000613a6c613613565b9050613a788282613a31565b919050565b600067ffffffffffffffff821115613a9857613a97613a02565b5b602082029050602081019050919050565b600080fd5b6000613ac1613abc84613a7d565b613a62565b90508083825260208201905060208402830185811115613ae457613ae3613aa9565b5b835b81811015613b0d5780613af988826137b3565b845260208401935050602081019050613ae6565b5050509392505050565b600082601f830112613b2c57613b2b6139ec565b5b8135613b3c848260208601613aae565b91505092915050565b600060208284031215613b5b57613b5a61361d565b5b600082013567ffffffffffffffff811115613b7957613b78613622565b5b613b8584828501613b17565b91505092915050565b600060208284031215613ba457613ba361361d565b5b6000613bb284828501613892565b91505092915050565b600060208284031215613bd157613bd061361d565b5b6000613bdf848285016138ce565b91505092915050565b613bf1816138a7565b82525050565b6000602082019050613c0c6000830184613be8565b92915050565b6000819050919050565b6000613c37613c32613c2d84613627565b613c12565b613627565b9050919050565b6000613c4982613c1c565b9050919050565b6000613c5b82613c3e565b9050919050565b613c6b81613c50565b82525050565b6000602082019050613c866000830184613c62565b92915050565b60008115159050919050565b613ca181613c8c565b82525050565b6000602082019050613cbc6000830184613c98565b92915050565b613ccb81613647565b82525050565b6000602082019050613ce66000830184613cc2565b92915050565b613cf58161381f565b82525050565b6000602082019050613d106000830184613cec565b92915050565b600060208284031215613d2c57613d2b61361d565b5b6000613d3a84828501613852565b91505092915050565b6000613d4e82613c3e565b9050919050565b613d5e81613d43565b82525050565b6000602082019050613d796000830184613d55565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613db9826136de565b9150613dc4836136de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613df957613df8613d7f565b5b828201905092915050565b6000613e0f826136de565b9150613e1a836136de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5357613e52613d7f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e98826136de565b9150613ea3836136de565b925082613eb357613eb2613e5e565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613ef8826136de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2b57613f2a613d7f565b5b600182019050919050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000613fa3602e83613f36565b9150613fae82613f47565b604082019050919050565b60006020820190508181036000830152613fd281613f96565b9050919050565b6000604082019050613fee6000830185613cc2565b613ffb60208301846137f5565b9392505050565b61400b81613c8c565b811461401657600080fd5b50565b60008151905061402881614002565b92915050565b6000602082840312156140445761404361361d565b5b600061405284828501614019565b91505092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614091601083613f36565b915061409c8261405b565b602082019050919050565b600060208201905081810360008301526140c081614084565b9050919050565b7f517565727920666f72206120746f6b656e20796f7520646f6e2774206f776e00600082015250565b60006140fd601f83613f36565b9150614108826140c7565b602082019050919050565b6000602082019050818103600083015261412c816140f0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614169602083613f36565b915061417482614133565b602082019050919050565b600060208201905081810360008301526141988161415c565b9050919050565b60006060820190506141b46000830186613cc2565b6141c16020830185613cc2565b6141ce60408301846137f5565b949350505050565b6000815190506141e58161379c565b92915050565b6000602082840312156142015761420061361d565b5b600061420f848285016141d6565b91505092915050565b600060408201905061422d60008301856137f5565b61423a60208301846137f5565b9392505050565b600061424c826136de565b9150614257836136de565b92508282101561426a57614269613d7f565b5b828203905092915050565b7f456e642074696d65206d7573742062652067726561746572207468616e206e6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006142d1602183613f36565b91506142dc82614275565b604082019050919050565b60006020820190508181036000830152614300816142c4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614363602683613f36565b915061436e82614307565b604082019050919050565b6000602082019050818103600083015261439281614356565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006143f5602b83613f36565b915061440082614399565b604082019050919050565b60006020820190508181036000830152614424816143e8565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614461601483613f36565b915061446c8261442b565b602082019050919050565b6000602082019050818103600083015261449081614454565b9050919050565b7f457863656564206d61782073697a65203a203235360000000000000000000000600082015250565b60006144cd601583613f36565b91506144d882614497565b602082019050919050565b600060208201905081810360008301526144fc816144c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000819050919050565b61454d614548826136de565b614532565b82525050565b60008160601b9050919050565b600061456b82614553565b9050919050565b600061457d82614560565b9050919050565b61459561459082613647565b614572565b82525050565b60006145a7828761453c565b6020820191506145b7828661453c565b6020820191506145c78285614584565b6014820191506145d7828461453c565b6020820191508190509594505050505056fea26469706673582212205dde6e3c1bfafe07aa6b341b092b98d36764da215cd9f8e110a62cfa9b148d8564736f6c634300080b0033
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.