More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 133 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Reward | 19893945 | 118 days ago | IN | 0.00089 ETH | 0.00086334 | ||||
Claim Reward | 18031185 | 379 days ago | IN | 0.00089 ETH | 0.00246815 | ||||
Claim Reward | 17697548 | 426 days ago | IN | 0.00089 ETH | 0.00222509 | ||||
Claim Reward | 17601531 | 439 days ago | IN | 0.00089 ETH | 0.0018232 | ||||
Deposit | 17601505 | 439 days ago | IN | 0.00089 ETH | 0.00448992 | ||||
Claim Reward | 17466078 | 458 days ago | IN | 0.00089 ETH | 0.00241111 | ||||
Claim Reward | 17424172 | 464 days ago | IN | 0.00089 ETH | 0.00334669 | ||||
Claim Reward | 17149035 | 503 days ago | IN | 0.00089 ETH | 0.00425536 | ||||
Claim Reward | 17144372 | 504 days ago | IN | 0.00089 ETH | 0.00513307 | ||||
Claim Reward | 17142062 | 504 days ago | IN | 0.00089 ETH | 0.00427293 | ||||
Claim Reward | 17141413 | 504 days ago | IN | 0.00089 ETH | 0.00438822 | ||||
Claim Reward | 17000541 | 524 days ago | IN | 0.00089 ETH | 0.00259979 | ||||
Claim Reward | 16992441 | 525 days ago | IN | 0.00089 ETH | 0.00341449 | ||||
Claim Reward | 16925258 | 535 days ago | IN | 0.00089 ETH | 0.0032213 | ||||
Claim Reward | 16896731 | 539 days ago | IN | 0.00089 ETH | 0.00498015 | ||||
Claim Reward | 16860665 | 544 days ago | IN | 0.00089 ETH | 0.00161309 | ||||
Deposit | 16810184 | 551 days ago | IN | 0.00089 ETH | 0.01083696 | ||||
Claim Reward | 16774944 | 556 days ago | IN | 0.00089 ETH | 0.00327825 | ||||
Claim Reward | 16688632 | 568 days ago | IN | 0.00089 ETH | 0.00434913 | ||||
Deposit | 16675433 | 570 days ago | IN | 0.00089 ETH | 0.00949842 | ||||
Claim Reward | 16638310 | 575 days ago | IN | 0.00089 ETH | 0.00535722 | ||||
Deposit | 16624756 | 577 days ago | IN | 0.00089 ETH | 0.01373022 | ||||
Deposit | 16564546 | 585 days ago | IN | 0.00089 ETH | 0.0089735 | ||||
Claim Reward | 16553821 | 587 days ago | IN | 0.00089 ETH | 0.00241487 | ||||
Claim Reward | 16535472 | 589 days ago | IN | 0.00089 ETH | 0.00364877 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19893945 | 118 days ago | 0.00089 ETH | ||||
18031185 | 379 days ago | 0.00089 ETH | ||||
17697548 | 426 days ago | 0.00089 ETH | ||||
17601531 | 439 days ago | 0.00089 ETH | ||||
17601505 | 439 days ago | 0.00089 ETH | ||||
17466078 | 458 days ago | 0.00089 ETH | ||||
17424172 | 464 days ago | 0.00089 ETH | ||||
17149035 | 503 days ago | 0.00089 ETH | ||||
17144372 | 504 days ago | 0.00089 ETH | ||||
17142062 | 504 days ago | 0.00089 ETH | ||||
17141413 | 504 days ago | 0.00089 ETH | ||||
17000541 | 524 days ago | 0.00089 ETH | ||||
16992441 | 525 days ago | 0.00089 ETH | ||||
16925258 | 535 days ago | 0.00089 ETH | ||||
16896731 | 539 days ago | 0.00089 ETH | ||||
16860665 | 544 days ago | 0.00089 ETH | ||||
16810184 | 551 days ago | 0.00089 ETH | ||||
16774944 | 556 days ago | 0.00089 ETH | ||||
16688632 | 568 days ago | 0.00089 ETH | ||||
16675433 | 570 days ago | 0.00089 ETH | ||||
16638310 | 575 days ago | 0.00089 ETH | ||||
16624756 | 577 days ago | 0.00089 ETH | ||||
16564546 | 585 days ago | 0.00089 ETH | ||||
16553821 | 587 days ago | 0.00089 ETH | ||||
16535472 | 589 days ago | 0.00089 ETH |
Loading...
Loading
Contract Name:
AlcazarNftStaking
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @author Brewlabs * This contract has been developed by brewlabs.info */ import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; contract AlcazarNftStaking is Ownable, IERC721Receiver, ReentrancyGuard { using SafeERC20 for IERC20; bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; uint256 private constant BLOCKS_PER_DAY = 6426; uint256 private constant PERCENT_PRECISION = 10000; uint256 private PRECISION_FACTOR; // Whether it is initialized bool public isInitialized; uint256 public duration = 365; // 365 days // The block number when staking starts. uint256 public startBlock; // The block number when staking ends. uint256 public bonusEndBlock; // tokens created per block. uint256 public rewardPerBlock; // The block number of the last pool update uint256 public lastRewardBlock; address public treasury = 0x64961Ffd0d84b2355eC2B5d35B0d8D8825A774dc; uint256 public performanceFee = 0.00089 ether; address public feeAddress; uint256 public rewardFee = 10; // The staked token IERC721 public stakingNft; // The earned token IERC20 public earnedToken; // Accrued token per share uint256 public accTokenPerShare; uint256 public oneTimeLimit = 40; uint256 public totalStaked; uint256 private totalEarned; uint256 private paidRewards; uint256 private shouldTotalPaid; struct UserInfo { uint256 amount; // number of staked NFTs uint256[] tokenIds; // staked tokenIds uint256 rewardDebt; // Reward debt } // Info of each user that stakes tokenIds mapping(address => UserInfo) public userInfo; event Deposit(address indexed user, uint256[] tokenIds); event Withdraw(address indexed user, uint256[] tokenIds); event Claim(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256[] tokenIds); event AdminTokenRecovered(address tokenRecovered, uint256 amount); event NewStartAndEndBlocks(uint256 startBlock, uint256 endBlock); event NewRewardPerBlock(uint256 rewardPerBlock); event RewardsStop(uint256 blockNumber); event EndBlockUpdated(uint256 blockNumber); event FeeAddressUpdated(address addr); event ServiceInfoUpadted(address addr, uint256 fee); event DurationUpdated(uint256 duration); constructor() { feeAddress = msg.sender; } /* * @notice Initialize the contract * @param _stakingNft: nft address to stake * @param _earnedToken: earned token address * @param _rewardPerBlock: reward per block (in earnedToken) */ function initialize(IERC721 _stakingNft, IERC20 _earnedToken, uint256 _rewardPerBlock) external onlyOwner { require(!isInitialized, "Already initialized"); // Make this contract initialized isInitialized = true; stakingNft = _stakingNft; earnedToken = _earnedToken; rewardPerBlock = _rewardPerBlock; uint256 decimalsRewardToken = uint256(IERC20Metadata(address(earnedToken)).decimals()); require(decimalsRewardToken < 30, "Must be inferior to 30"); PRECISION_FACTOR = uint256(10 ** (40 - decimalsRewardToken)); } /* * @notice Deposit staked tokens and collect reward tokens (if any) * @param _amount: amount to withdraw (in earnedToken) */ function deposit(uint256[] memory _tokenIds) external payable nonReentrant { require(startBlock > 0 && startBlock < block.number, "Staking hasn't started yet"); require(_tokenIds.length > 0, "must add at least one tokenId"); require(_tokenIds.length <= oneTimeLimit, "cannot exceed one-time limit"); _transferPerformanceFee(); _updatePool(); UserInfo storage user = userInfo[msg.sender]; if (user.amount > 0) { uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (pending > 0) { require(availableRewardTokens() >= pending, "Insufficient reward tokens"); paidRewards += pending; uint256 fee = pending * rewardFee / PERCENT_PRECISION; earnedToken.safeTransfer(feeAddress, fee); earnedToken.safeTransfer(address(msg.sender), pending - fee); emit Claim(msg.sender, pending); } } for (uint256 i = 0; i < _tokenIds.length; i++) { uint256 tokenId = _tokenIds[i]; stakingNft.safeTransferFrom(msg.sender, address(this), tokenId); user.tokenIds.push(tokenId); } user.amount = user.amount + _tokenIds.length; user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; totalStaked = totalStaked + _tokenIds.length; emit Deposit(msg.sender, _tokenIds); } /* * @notice Withdraw staked tokenIds and collect reward tokens * @param _amount: number of tokenIds to unstake */ function withdraw(uint256 _amount) external payable nonReentrant { require(_amount > 0, "Amount should be greator than 0"); require(_amount <= oneTimeLimit, "cannot exceed one-time limit"); UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "Amount to withdraw too high"); _transferPerformanceFee(); _updatePool(); if (user.amount > 0) { uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (pending > 0) { require(availableRewardTokens() >= pending, "Insufficient reward tokens"); paidRewards += pending; uint256 fee = pending * rewardFee / PERCENT_PRECISION; earnedToken.safeTransfer(feeAddress, fee); earnedToken.safeTransfer(address(msg.sender), pending - fee); emit Claim(msg.sender, pending); } } uint256[] memory _tokenIds = new uint256[](_amount); for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = user.tokenIds[user.tokenIds.length - 1]; user.tokenIds.pop(); _tokenIds[i] = tokenId; stakingNft.safeTransferFrom(address(this), msg.sender, tokenId); } user.amount = user.amount - _amount; user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; totalStaked = totalStaked - _amount; emit Withdraw(msg.sender, _tokenIds); } function claimReward() external payable nonReentrant { UserInfo storage user = userInfo[msg.sender]; _transferPerformanceFee(); _updatePool(); if (user.amount == 0) return; uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (pending > 0) { require(availableRewardTokens() >= pending, "Insufficient reward tokens"); paidRewards += pending; uint256 fee = pending * rewardFee / PERCENT_PRECISION; earnedToken.safeTransfer(feeAddress, fee); earnedToken.safeTransfer(address(msg.sender), pending - fee); } user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; emit Claim(msg.sender, pending); } /* * @notice Withdraw staked NFTs without caring about rewards * @dev Needs to be for emergency. */ function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; if (_amount > oneTimeLimit) _amount = oneTimeLimit; uint256[] memory _tokenIds = new uint256[](_amount); for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = user.tokenIds[user.tokenIds.length - 1]; user.tokenIds.pop(); _tokenIds[i] = tokenId; stakingNft.safeTransferFrom(address(this), msg.sender, tokenId); } user.amount = user.amount - _amount; user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; totalStaked = totalStaked - _amount; emit EmergencyWithdraw(msg.sender, _tokenIds); } function stakedInfo(address _user) external view returns (uint256, uint256[] memory) { return (userInfo[_user].amount, userInfo[_user].tokenIds); } /** * @notice Available amount of reward token */ function availableRewardTokens() public view returns (uint256) { return earnedToken.balanceOf(address(this)); } function insufficientRewards() external view returns (uint256) { uint256 adjustedShouldTotalPaid = shouldTotalPaid; uint256 remainRewards = availableRewardTokens() + paidRewards; if (startBlock == 0) { adjustedShouldTotalPaid += rewardPerBlock * duration * BLOCKS_PER_DAY; } else { uint256 remainBlocks = _getMultiplier(lastRewardBlock, bonusEndBlock); adjustedShouldTotalPaid += rewardPerBlock * remainBlocks; } if (remainRewards >= adjustedShouldTotalPaid) return 0; return adjustedShouldTotalPaid - remainRewards; } /* * @notice View function to see pending reward on frontend. * @param _user: user address * @return Pending reward for a given user */ function pendingReward(address _user) external view returns (uint256) { UserInfo storage user = userInfo[_user]; uint256 adjustedTokenPerShare = accTokenPerShare; if (block.number > lastRewardBlock && totalStaked != 0 && lastRewardBlock > 0) { uint256 multiplier = _getMultiplier(lastRewardBlock, block.number); uint256 rewards = multiplier * rewardPerBlock; adjustedTokenPerShare += (rewards * PRECISION_FACTOR) / totalStaked; } return (user.amount * adjustedTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; } /** * Admin Methods */ function increaseEmissionRate(uint256 _amount) external onlyOwner { require(startBlock > 0, "pool is not started"); require(bonusEndBlock > block.number, "pool was already finished"); require(_amount > 0, "invalid amount"); _updatePool(); earnedToken.safeTransferFrom(msg.sender, address(this), _amount); uint256 remainRewards = availableRewardTokens() + paidRewards; if (remainRewards > shouldTotalPaid) { remainRewards = remainRewards - shouldTotalPaid; uint256 remainBlocks = bonusEndBlock - block.number; rewardPerBlock = remainRewards / remainBlocks; emit NewRewardPerBlock(rewardPerBlock); } } /* * @notice Withdraw reward token * @dev Only callable by owner. Needs to be for emergency. */ function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(block.number > bonusEndBlock, "Pool is running"); require(availableRewardTokens() >= _amount, "Insufficient reward tokens"); if (_amount == 0) _amount = availableRewardTokens(); earnedToken.safeTransfer(address(msg.sender), _amount); } function startReward() external onlyOwner { require(startBlock == 0, "Pool was already started"); startBlock = block.number + 100; bonusEndBlock = startBlock + duration * BLOCKS_PER_DAY; lastRewardBlock = startBlock; emit NewStartAndEndBlocks(startBlock, bonusEndBlock); } function stopReward() external onlyOwner { _updatePool(); uint256 remainRewards = availableRewardTokens() + paidRewards; if (remainRewards > shouldTotalPaid) { remainRewards = remainRewards - shouldTotalPaid; earnedToken.transfer(msg.sender, remainRewards); } bonusEndBlock = block.number; emit RewardsStop(bonusEndBlock); } function updateEndBlock(uint256 _endBlock) external onlyOwner { require(startBlock > 0, "Pool is not started"); require(bonusEndBlock > block.number, "Pool was already finished"); require(_endBlock > block.number && _endBlock > startBlock, "Invalid end block"); bonusEndBlock = _endBlock; emit EndBlockUpdated(_endBlock); } /* * @notice Update reward per block * @dev Only callable by owner. * @param _rewardPerBlock: the reward per block */ function updateRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { rewardPerBlock = _rewardPerBlock; emit NewRewardPerBlock(_rewardPerBlock); } function setDuration(uint256 _duration) external onlyOwner { require(_duration >= 30, "lower limit reached"); duration = _duration; if (startBlock > 0) { bonusEndBlock = startBlock + duration * BLOCKS_PER_DAY; require(bonusEndBlock > block.number, "invalid duration"); } emit DurationUpdated(_duration); } function setFeeAddress(address _addr) external onlyOwner { require(_addr != address(0x0), "Invalid address"); feeAddress = _addr; emit FeeAddressUpdated(_addr); } function setServiceInfo(address _treasury, uint256 _fee) external { require(msg.sender == treasury, "setServiceInfo: FORBIDDEN"); require(_treasury != address(0x0), "Invalid address"); treasury = _treasury; performanceFee = _fee; emit ServiceInfoUpadted(_treasury, _fee); } /** * @notice It allows the admin to recover wrong tokens sent to the contract * @param _token: the address of the token to withdraw * @dev This function is only callable by admin. */ function rescueTokens(address _token) external onlyOwner { require(_token != address(earnedToken), "Cannot be reward token"); uint256 amount = address(this).balance; if (_token == address(0x0)) { payable(msg.sender).transfer(amount); } else { amount = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(address(msg.sender), amount); } emit AdminTokenRecovered(_token, amount); } /** * Internal Methods */ /* * @notice Update reward variables of the given pool to be up-to-date. */ function _updatePool() internal { if (block.number <= lastRewardBlock || lastRewardBlock == 0) return; if (totalStaked == 0) { lastRewardBlock = block.number; return; } uint256 multiplier = _getMultiplier(lastRewardBlock, block.number); uint256 _reward = multiplier * rewardPerBlock; accTokenPerShare += (_reward * PRECISION_FACTOR) / totalStaked; lastRewardBlock = block.number; shouldTotalPaid += _reward; } /* * @notice Return reward multiplier over the given _from to _to block. * @param _from: block to start * @param _to: block to finish */ function _getMultiplier(uint256 _from, uint256 _to) internal view returns (uint256) { if (_to <= bonusEndBlock) { return _to - _from; } else if (_from >= bonusEndBlock) { return 0; } else { return bonusEndBlock - _from; } } function _transferPerformanceFee() internal { require(msg.value >= performanceFee, "should pay small gas to compound or harvest"); payable(treasury).transfer(performanceFee); if (msg.value > performanceFee) { payable(msg.sender).transfer(msg.value - performanceFee); } } /** * onERC721Received(address operator, address from, uint256 tokenId, bytes data) → bytes4 * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. */ function onERC721Received(address, address, uint256, bytes calldata) external view override returns (bytes4) { require(msg.sender == address(stakingNft), "not enabled NFT"); return _ERC721_RECEIVED; } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// 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 // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // 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 v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(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); } } } }
{ "optimizer": { "enabled": true, "runs": 100 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenRecovered","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"DurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"EndBlockUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"FeeAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"NewRewardPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewStartAndEndBlocks","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":"uint256","name":"blockNumber","type":"uint256"}],"name":"RewardsStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ServiceInfoUpadted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"accTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableRewardTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earnedToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_stakingNft","type":"address"},{"internalType":"contract IERC20","name":"_earnedToken","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"insufficientRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneTimeLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setServiceInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"stakedInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingNft","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"name":"updateEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405261016d600455600980546001600160a01b0319167364961ffd0d84b2355ec2b5d35b0d8d8825a774dc1790556603297345d9a000600a908155600c55602860105534801561005157600080fd5b5061005b33610076565b60018055600b80546001600160a01b031916331790556100c6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612cbc80620000d66000396000f3fe6080604052600436106102225760003560e01c806380dc06721161012e578063a2cd12d2116100ab578063f2fde38b1161006f578063f2fde38b14610612578063f3aeb31d14610632578063f40f0f5214610647578063f4ef5ed514610667578063f6be71d11461068757600080fd5b8063a2cd12d21461059b578063a9f8d181146105b1578063b4938777146105c7578063b88a802f146105f5578063db2e21bc146105fd57600080fd5b80638ae39cac116100f25780638ae39cac1461052f5780638b424267146105455780638da5cb5b1461055b5780638f662915146105705780639f94e2721461058657600080fd5b806380dc0672146104ae578063817b1cd2146104c357806381b61948146104d95780638705fcd4146104f9578063877887821461051957600080fd5b80633279beab116101bc57806361d027b31161018057806361d027b3146104245780636982d815146104445780636e707b7314610464578063715018a614610484578063746c8ae11461049957600080fd5b80633279beab14610384578063392e53cd146103a457806341275358146103ce57806348cd4cb1146103fb578063598b8e711461041157600080fd5b80626f02311461022e578062ae3bf81461025057806301f8a976146102705780630fb5a6b414610290578063150b7a02146102b95780631794bb3c146102f25780631959a002146103125780631aed65531461035b5780632e1a7d4d1461037157600080fd5b3661022957005b600080fd5b34801561023a57600080fd5b5061024e61024936600461282b565b6106a7565b005b34801561025c57600080fd5b5061024e61026b36600461262a565b610800565b34801561027c57600080fd5b5061024e61028b36600461282b565b610997565b34801561029c57600080fd5b506102a660045481565b6040519081526020015b60405180910390f35b3480156102c557600080fd5b506102d96102d4366004612646565b6109fb565b6040516001600160e01b031990911681526020016102b0565b3480156102fe57600080fd5b5061024e61030d3660046127eb565b610a5c565b34801561031e57600080fd5b5061034661032d36600461262a565b6015602052600090815260409020805460029091015482565b604080519283526020830191909152016102b0565b34801561036757600080fd5b506102a660065481565b61024e61037f36600461282b565b610bf2565b34801561039057600080fd5b5061024e61039f36600461282b565b610ffd565b3480156103b057600080fd5b506003546103be9060ff1681565b60405190151581526020016102b0565b3480156103da57600080fd5b50600b546103ee906001600160a01b031681565b6040516102b091906128d2565b34801561040757600080fd5b506102a660055481565b61024e61041f36600461270b565b6110c0565b34801561043057600080fd5b506009546103ee906001600160a01b031681565b34801561045057600080fd5b50600d546103ee906001600160a01b031681565b34801561047057600080fd5b50600e546103ee906001600160a01b031681565b34801561049057600080fd5b5061024e611419565b3480156104a557600080fd5b5061024e611454565b3480156104ba57600080fd5b5061024e611546565b3480156104cf57600080fd5b506102a660115481565b3480156104e557600080fd5b5061024e6104f43660046126e0565b61166a565b34801561050557600080fd5b5061024e61051436600461262a565b611738565b34801561052557600080fd5b506102a6600a5481565b34801561053b57600080fd5b506102a660075481565b34801561055157600080fd5b506102a6600c5481565b34801561056757600080fd5b506103ee6117d8565b34801561057c57600080fd5b506102a6600f5481565b34801561059257600080fd5b506102a66117e7565b3480156105a757600080fd5b506102a660105481565b3480156105bd57600080fd5b506102a660085481565b3480156105d357600080fd5b506105e76105e236600461262a565b61186d565b6040516102b0929190612a6c565b61024e6118e9565b34801561060957600080fd5b5061024e611a47565b34801561061e57600080fd5b5061024e61062d36600461262a565b611c7f565b34801561063e57600080fd5b506102a6611d1c565b34801561065357600080fd5b506102a661066236600461262a565b611dc5565b34801561067357600080fd5b5061024e61068236600461282b565b611e82565b34801561069357600080fd5b5061024e6106a236600461282b565b612033565b336106b06117d8565b6001600160a01b0316146106df5760405162461bcd60e51b81526004016106d690612992565b60405180910390fd5b6000600554116107275760405162461bcd60e51b8152602060048201526013602482015272141bdbdb081a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016106d6565b43600654116107745760405162461bcd60e51b8152602060048201526019602482015278141bdbdb081dd85cc8185b1c9958591e48199a5b9a5cda1959603a1b60448201526064016106d6565b4381118015610784575060055481115b6107c45760405162461bcd60e51b8152602060048201526011602482015270496e76616c696420656e6420626c6f636b60781b60448201526064016106d6565b60068190556040518181527f0972575658363b3e7c472ab3a6a918726742c853b732f6a4a2763e2e3a94c977906020015b60405180910390a150565b336108096117d8565b6001600160a01b03161461082f5760405162461bcd60e51b81526004016106d690612992565b600e546001600160a01b03828116911614156108865760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba103132903932bbb0b932103a37b5b2b760511b60448201526064016106d6565b476001600160a01b0382166108c857604051339082156108fc029083906000818181858888f193505050501580156108c2573d6000803e3d6000fd5b5061095a565b6040516370a0823160e01b81526001600160a01b038316906370a08231906108f49030906004016128d2565b60206040518083038186803b15801561090c57600080fd5b505afa158015610920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109449190612843565b905061095a6001600160a01b0383163383612149565b7f74f5dcd55c394cb1c6d3b9da22c2464bcc46c38cc3865bd629ed75823249b40b828260405161098b92919061290a565b60405180910390a15050565b336109a06117d8565b6001600160a01b0316146109c65760405162461bcd60e51b81526004016106d690612992565b60078190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df906020016107f5565b600d546000906001600160a01b03163314610a4a5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd08195b98589b195908139195608a1b60448201526064016106d6565b50630a85bd0160e11b95945050505050565b33610a656117d8565b6001600160a01b031614610a8b5760405162461bcd60e51b81526004016106d690612992565b60035460ff1615610ad45760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016106d6565b6003805460ff19166001179055600d80546001600160a01b038086166001600160a01b031992831617909255600e8054928516929091168217905560078290556040805163313ce56760e01b815290516000929163313ce567916004808301926020929190829003018186803b158015610b4d57600080fd5b505afa158015610b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b85919061285b565b60ff169050601e8110610bd35760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b60448201526064016106d6565b610bde816028612bc7565b610be990600a612b00565b60025550505050565b60026001541415610c155760405162461bcd60e51b81526004016106d6906129fe565b600260015580610c675760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e20300060448201526064016106d6565b601054811115610c895760405162461bcd60e51b81526004016106d6906129c7565b3360009081526015602052604090208054821115610ce95760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f2068696768000000000060448201526064016106d6565b610cf16121a4565b610cf961228c565b805415610dfc5760008160020154600254600f548460000154610d1c9190612ba8565b610d269190612a9d565b610d309190612bc7565b90508015610dfa5780610d416117e7565b1015610d5f5760405162461bcd60e51b81526004016106d690612a35565b8060136000828254610d719190612a85565b9091555050600c5460009061271090610d8a9084612ba8565b610d949190612a9d565b600b54600e54919250610db4916001600160a01b03908116911683612149565b610dd533610dc28385612bc7565b600e546001600160a01b03169190612149565b6040518281523390600080516020612c678339815191529060200160405180910390a2505b505b60008267ffffffffffffffff811115610e2557634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e4e578160200160208202803683370190505b50905060005b83811015610f775760018084018054600092610e6f91612bc7565b81548110610e8d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905083600101805480610ebb57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905580838381518110610ef257634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600d54604051632142170760e11b81526001600160a01b03909116906342842e0e90610f31903090339086906004016128e6565b600060405180830381600087803b158015610f4b57600080fd5b505af1158015610f5f573d6000803e3d6000fd5b50505050508080610f6f90612c0a565b915050610e54565b508154610f85908490612bc7565b808355600254600f549091610f9a9190612ba8565b610fa49190612a9d565b6002830155601154610fb7908490612bc7565b60115560405133907f67e9df8b3c7743c9f1b625ba4f2b4e601206dbd46ed5c33c85a1242e4d23a2d190610fec908490612923565b60405180910390a250506001805550565b336110066117d8565b6001600160a01b03161461102c5760405162461bcd60e51b81526004016106d690612992565b600654431161106f5760405162461bcd60e51b815260206004820152600f60248201526e506f6f6c2069732072756e6e696e6760881b60448201526064016106d6565b806110786117e7565b10156110965760405162461bcd60e51b81526004016106d690612a35565b806110a6576110a36117e7565b90505b600e546110bd906001600160a01b03163383612149565b50565b600260015414156110e35760405162461bcd60e51b81526004016106d6906129fe565b6002600155600554158015906110fa575043600554105b6111465760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e67206861736e277420737461727465642079657400000000000060448201526064016106d6565b60008151116111975760405162461bcd60e51b815260206004820152601d60248201527f6d75737420616464206174206c65617374206f6e6520746f6b656e496400000060448201526064016106d6565b601054815111156111ba5760405162461bcd60e51b81526004016106d6906129c7565b6111c26121a4565b6111ca61228c565b3360009081526015602052604090208054156112c95760008160020154600254600f5484600001546111fc9190612ba8565b6112069190612a9d565b6112109190612bc7565b905080156112c757806112216117e7565b101561123f5760405162461bcd60e51b81526004016106d690612a35565b80601360008282546112519190612a85565b9091555050600c546000906127109061126a9084612ba8565b6112749190612a9d565b600b54600e54919250611294916001600160a01b03908116911683612149565b6112a233610dc28385612bc7565b6040518281523390600080516020612c678339815191529060200160405180910390a2505b505b60005b82518110156113925760008382815181106112f757634e487b7160e01b600052603260045260246000fd5b6020908102919091010151600d54604051632142170760e11b81529192506001600160a01b0316906342842e0e90611337903390309086906004016128e6565b600060405180830381600087803b15801561135157600080fd5b505af1158015611365573d6000803e3d6000fd5b5050505060018381018054918201815560009081526020902001558061138a81612c0a565b9150506112cc565b50815181546113a19190612a85565b808255600254600f5490916113b69190612ba8565b6113c09190612a9d565b600282015581516011546113d49190612a85565b60115560405133907fff409334d2645d660e7cfa41a637aa21f45a79ecb9660a6931aa923bf75577c790611409908590612923565b60405180910390a2505060018055565b336114226117d8565b6001600160a01b0316146114485760405162461bcd60e51b81526004016106d690612992565b6114526000612326565b565b3361145d6117d8565b6001600160a01b0316146114835760405162461bcd60e51b81526004016106d690612992565b600554156114ce5760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b60448201526064016106d6565b6114d9436064612a85565b6005556004546114ec9061191a90612ba8565b6005546114f99190612a85565b600681905560055460088190556040517f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069261153c928252602082015260400190565b60405180910390a1565b3361154f6117d8565b6001600160a01b0316146115755760405162461bcd60e51b81526004016106d690612992565b61157d61228c565b600060135461158a6117e7565b6115949190612a85565b9050601454811115611634576014546115ad9082612bc7565b600e5460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb906115e0903390859060040161290a565b602060405180830381600087803b1580156115fa57600080fd5b505af115801561160e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163291906127cb565b505b4360068190556040519081527ffed9fcb0ca3d1e761a4b929792bb24082fba92dca81252646ad306d306806566906020016107f5565b6009546001600160a01b031633146116c05760405162461bcd60e51b815260206004820152601960248201527839b2ba29b2b93b34b1b2a4b733379d102327a92124a22222a760391b60448201526064016106d6565b6001600160a01b0382166116e65760405162461bcd60e51b81526004016106d690612969565b600980546001600160a01b0319166001600160a01b038416179055600a8190556040517f232f2e6280d2064b1e439bf40ecdada042d84eefbb55039e4c49e8dc4f4c90c99061098b908490849061290a565b336117416117d8565b6001600160a01b0316146117675760405162461bcd60e51b81526004016106d690612992565b6001600160a01b03811661178d5760405162461bcd60e51b81526004016106d690612969565b600b80546001600160a01b0319166001600160a01b0383161790556040517f446e39bcf1b47cfadfaa23442cb4b34682cfe6bd9220da084894e3b1f834e4f3906107f59083906128d2565b6000546001600160a01b031690565b600e546040516370a0823160e01b81526000916001600160a01b0316906370a08231906118189030906004016128d2565b60206040518083038186803b15801561183057600080fd5b505afa158015611844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118689190612843565b905090565b6001600160a01b0381166000908152601560209081526040808320805460019091018054835181860281018601909452808452606094929391928391908301828280156118d957602002820191906000526020600020905b8154815260200190600101908083116118c5575b5050505050905091509150915091565b6002600154141561190c5760405162461bcd60e51b81526004016106d6906129fe565b60026001553360009081526015602052604090206119286121a4565b61193061228c565b805461193c5750611a41565b60008160020154600254600f5484600001546119589190612ba8565b6119629190612a9d565b61196c9190612bc7565b90508015611a00578061197d6117e7565b101561199b5760405162461bcd60e51b81526004016106d690612a35565b80601360008282546119ad9190612a85565b9091555050600c54600090612710906119c69084612ba8565b6119d09190612a9d565b600b54600e549192506119f0916001600160a01b03908116911683612149565b6119fe33610dc28385612bc7565b505b600254600f548354611a129190612ba8565b611a1c9190612a9d565b60028301556040518181523390600080516020612c6783398151915290602001611409565b60018055565b60026001541415611a6a5760405162461bcd60e51b81526004016106d6906129fe565b60026001553360009081526015602052604090208054601054811115611a8f57506010545b60008167ffffffffffffffff811115611ab857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611ae1578160200160208202803683370190505b50905060005b82811015611c0a5760018085018054600092611b0291612bc7565b81548110611b2057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905084600101805480611b4e57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905580838381518110611b8557634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600d54604051632142170760e11b81526001600160a01b03909116906342842e0e90611bc4903090339086906004016128e6565b600060405180830381600087803b158015611bde57600080fd5b505af1158015611bf2573d6000803e3d6000fd5b50505050508080611c0290612c0a565b915050611ae7565b508254611c18908390612bc7565b808455600254600f549091611c2d9190612ba8565b611c379190612a9d565b6002840155601154611c4a908390612bc7565b60115560405133907f1ad6082f7aa3e32095e38fd4c0bf76fa2bb7584e81474cf3519d2dea4081181c90610fec908490612923565b33611c886117d8565b6001600160a01b031614611cae5760405162461bcd60e51b81526004016106d690612992565b6001600160a01b038116611d135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d6565b6110bd81612326565b60008060145490506000601354611d316117e7565b611d3b9190612a85565b905060055460001415611d765761191a600454600754611d5b9190612ba8565b611d659190612ba8565b611d6f9083612a85565b9150611da4565b6000611d86600854600654612376565b905080600754611d969190612ba8565b611da09084612a85565b9250505b818110611db45760009250505090565b611dbe8183612bc7565b9250505090565b6001600160a01b0381166000908152601560205260408120600f5460085443118015611df2575060115415155b8015611e0057506000600854115b15611e51576000611e1360085443612376565b9050600060075482611e259190612ba8565b905060115460025482611e389190612ba8565b611e429190612a9d565b611e4c9084612a85565b925050505b60028083015490548354611e66908490612ba8565b611e709190612a9d565b611e7a9190612bc7565b949350505050565b33611e8b6117d8565b6001600160a01b031614611eb15760405162461bcd60e51b81526004016106d690612992565b600060055411611ef95760405162461bcd60e51b81526020600482015260136024820152721c1bdbdb081a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016106d6565b4360065411611f465760405162461bcd60e51b81526020600482015260196024820152781c1bdbdb081dd85cc8185b1c9958591e48199a5b9a5cda1959603a1b60448201526064016106d6565b60008111611f875760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016106d6565b611f8f61228c565b600e54611fa7906001600160a01b03163330846123b7565b6000601354611fb46117e7565b611fbe9190612a85565b905060145481111561202f57601454611fd79082612bc7565b9050600043600654611fe99190612bc7565b9050611ff58183612a9d565b60078190556040519081527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a1505b5050565b3361203c6117d8565b6001600160a01b0316146120625760405162461bcd60e51b81526004016106d690612992565b601e8110156120a95760405162461bcd60e51b81526020600482015260136024820152721b1bddd95c881b1a5b5a5d081c995858da1959606a1b60448201526064016106d6565b6004819055600554156121195761191a6004546120c69190612ba8565b6005546120d39190612a85565b600681905543106121195760405162461bcd60e51b815260206004820152601060248201526f34b73b30b634b210323ab930ba34b7b760811b60448201526064016106d6565b6040518181527f91abcc2d6823e3a3f11d31b208dd3065d2c6a791f1c7c9fe96a42ce12897eac5906020016107f5565b61219f8363a9059cbb60e01b848460405160240161216892919061290a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526123de565b505050565b600a5434101561220a5760405162461bcd60e51b815260206004820152602b60248201527f73686f756c642070617920736d616c6c2067617320746f20636f6d706f756e6460448201526a081bdc881a185c9d995cdd60aa1b60648201526084016106d6565b600954600a546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015612246573d6000803e3d6000fd5b50600a5434111561145257600a5433906108fc906122649034612bc7565b6040518115909202916000818181858888f193505050501580156110bd573d6000803e3d6000fd5b6008544311158061229d5750600854155b156122a457565b6011546122b15743600855565b60006122bf60085443612376565b90506000600754826122d19190612ba8565b9050601154600254826122e49190612ba8565b6122ee9190612a9d565b600f60008282546122ff9190612a85565b9091555050436008556014805482919060009061231d908490612a85565b90915550505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060065482116123925761238b8383612bc7565b90506123b1565b60065483106123a3575060006123b1565b8260065461238b9190612bc7565b92915050565b6123d8846323b872dd60e01b858585604051602401612168939291906128e6565b50505050565b6000612433826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124b09092919063ffffffff16565b80519091501561219f578080602001905181019061245191906127cb565b61219f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106d6565b60606124bf84846000856124c9565b90505b9392505050565b60608247101561252a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106d6565b843b6125785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106d6565b600080866001600160a01b0316858760405161259491906128b6565b60006040518083038185875af1925050503d80600081146125d1576040519150601f19603f3d011682016040523d82523d6000602084013e6125d6565b606091505b50915091506125e68282866125f1565b979650505050505050565b606083156126005750816124c2565b8251156126105782518084602001fd5b8160405162461bcd60e51b81526004016106d69190612936565b60006020828403121561263b578081fd5b81356124c281612c51565b60008060008060006080868803121561265d578081fd5b853561266881612c51565b9450602086013561267881612c51565b935060408601359250606086013567ffffffffffffffff8082111561269b578283fd5b818801915088601f8301126126ae578283fd5b8135818111156126bc578384fd5b8960208285010111156126cd578384fd5b9699959850939650602001949392505050565b600080604083850312156126f2578182fd5b82356126fd81612c51565b946020939093013593505050565b6000602080838503121561271d578182fd5b823567ffffffffffffffff80821115612734578384fd5b818501915085601f830112612747578384fd5b81358181111561275957612759612c3b565b8060051b604051601f19603f8301168101818110858211171561277e5761277e612c3b565b604052828152858101935084860182860187018a101561279c578788fd5b8795505b838610156127be5780358552600195909501949386019386016127a0565b5098975050505050505050565b6000602082840312156127dc578081fd5b815180151581146124c2578182fd5b6000806000606084860312156127ff578283fd5b833561280a81612c51565b9250602084013561281a81612c51565b929592945050506040919091013590565b60006020828403121561283c578081fd5b5035919050565b600060208284031215612854578081fd5b5051919050565b60006020828403121561286c578081fd5b815160ff811681146124c2578182fd5b6000815180845260208085019450808401835b838110156128ab5781518752958201959082019060010161288f565b509495945050505050565b600082516128c8818460208701612bde565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020815260006124c2602083018461287c565b6020815260008251806020840152612955816040850160208701612bde565b601f01601f19169190910160400192915050565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601c908201527f63616e6e6f7420657863656564206f6e652d74696d65206c696d697400000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601a908201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604082015260600190565b8281526040602082015260006124bf604083018461287c565b60008219821115612a9857612a98612c25565b500190565b600082612ab857634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115612af8578160001904821115612ade57612ade612c25565b80851615612aeb57918102915b93841c9390800290612ac2565b509250929050565b60006124c28383600082612b16575060016123b1565b81612b23575060006123b1565b8160018114612b395760028114612b4357612b5f565b60019150506123b1565b60ff841115612b5457612b54612c25565b50506001821b6123b1565b5060208310610133831016604e8410600b8410161715612b82575081810a6123b1565b612b8c8383612abd565b8060001904821115612ba057612ba0612c25565b029392505050565b6000816000190483118215151615612bc257612bc2612c25565b500290565b600082821015612bd957612bd9612c25565b500390565b60005b83811015612bf9578181015183820152602001612be1565b838111156123d85750506000910152565b6000600019821415612c1e57612c1e612c25565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110bd57600080fdfe47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4a2646970667358221220e0aa4f64cc85ef1deb3eb799e6ce1d51b577def8dc68eb82ec8fb52f29d5be3764736f6c63430008040033
Deployed Bytecode
0x6080604052600436106102225760003560e01c806380dc06721161012e578063a2cd12d2116100ab578063f2fde38b1161006f578063f2fde38b14610612578063f3aeb31d14610632578063f40f0f5214610647578063f4ef5ed514610667578063f6be71d11461068757600080fd5b8063a2cd12d21461059b578063a9f8d181146105b1578063b4938777146105c7578063b88a802f146105f5578063db2e21bc146105fd57600080fd5b80638ae39cac116100f25780638ae39cac1461052f5780638b424267146105455780638da5cb5b1461055b5780638f662915146105705780639f94e2721461058657600080fd5b806380dc0672146104ae578063817b1cd2146104c357806381b61948146104d95780638705fcd4146104f9578063877887821461051957600080fd5b80633279beab116101bc57806361d027b31161018057806361d027b3146104245780636982d815146104445780636e707b7314610464578063715018a614610484578063746c8ae11461049957600080fd5b80633279beab14610384578063392e53cd146103a457806341275358146103ce57806348cd4cb1146103fb578063598b8e711461041157600080fd5b80626f02311461022e578062ae3bf81461025057806301f8a976146102705780630fb5a6b414610290578063150b7a02146102b95780631794bb3c146102f25780631959a002146103125780631aed65531461035b5780632e1a7d4d1461037157600080fd5b3661022957005b600080fd5b34801561023a57600080fd5b5061024e61024936600461282b565b6106a7565b005b34801561025c57600080fd5b5061024e61026b36600461262a565b610800565b34801561027c57600080fd5b5061024e61028b36600461282b565b610997565b34801561029c57600080fd5b506102a660045481565b6040519081526020015b60405180910390f35b3480156102c557600080fd5b506102d96102d4366004612646565b6109fb565b6040516001600160e01b031990911681526020016102b0565b3480156102fe57600080fd5b5061024e61030d3660046127eb565b610a5c565b34801561031e57600080fd5b5061034661032d36600461262a565b6015602052600090815260409020805460029091015482565b604080519283526020830191909152016102b0565b34801561036757600080fd5b506102a660065481565b61024e61037f36600461282b565b610bf2565b34801561039057600080fd5b5061024e61039f36600461282b565b610ffd565b3480156103b057600080fd5b506003546103be9060ff1681565b60405190151581526020016102b0565b3480156103da57600080fd5b50600b546103ee906001600160a01b031681565b6040516102b091906128d2565b34801561040757600080fd5b506102a660055481565b61024e61041f36600461270b565b6110c0565b34801561043057600080fd5b506009546103ee906001600160a01b031681565b34801561045057600080fd5b50600d546103ee906001600160a01b031681565b34801561047057600080fd5b50600e546103ee906001600160a01b031681565b34801561049057600080fd5b5061024e611419565b3480156104a557600080fd5b5061024e611454565b3480156104ba57600080fd5b5061024e611546565b3480156104cf57600080fd5b506102a660115481565b3480156104e557600080fd5b5061024e6104f43660046126e0565b61166a565b34801561050557600080fd5b5061024e61051436600461262a565b611738565b34801561052557600080fd5b506102a6600a5481565b34801561053b57600080fd5b506102a660075481565b34801561055157600080fd5b506102a6600c5481565b34801561056757600080fd5b506103ee6117d8565b34801561057c57600080fd5b506102a6600f5481565b34801561059257600080fd5b506102a66117e7565b3480156105a757600080fd5b506102a660105481565b3480156105bd57600080fd5b506102a660085481565b3480156105d357600080fd5b506105e76105e236600461262a565b61186d565b6040516102b0929190612a6c565b61024e6118e9565b34801561060957600080fd5b5061024e611a47565b34801561061e57600080fd5b5061024e61062d36600461262a565b611c7f565b34801561063e57600080fd5b506102a6611d1c565b34801561065357600080fd5b506102a661066236600461262a565b611dc5565b34801561067357600080fd5b5061024e61068236600461282b565b611e82565b34801561069357600080fd5b5061024e6106a236600461282b565b612033565b336106b06117d8565b6001600160a01b0316146106df5760405162461bcd60e51b81526004016106d690612992565b60405180910390fd5b6000600554116107275760405162461bcd60e51b8152602060048201526013602482015272141bdbdb081a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016106d6565b43600654116107745760405162461bcd60e51b8152602060048201526019602482015278141bdbdb081dd85cc8185b1c9958591e48199a5b9a5cda1959603a1b60448201526064016106d6565b4381118015610784575060055481115b6107c45760405162461bcd60e51b8152602060048201526011602482015270496e76616c696420656e6420626c6f636b60781b60448201526064016106d6565b60068190556040518181527f0972575658363b3e7c472ab3a6a918726742c853b732f6a4a2763e2e3a94c977906020015b60405180910390a150565b336108096117d8565b6001600160a01b03161461082f5760405162461bcd60e51b81526004016106d690612992565b600e546001600160a01b03828116911614156108865760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba103132903932bbb0b932103a37b5b2b760511b60448201526064016106d6565b476001600160a01b0382166108c857604051339082156108fc029083906000818181858888f193505050501580156108c2573d6000803e3d6000fd5b5061095a565b6040516370a0823160e01b81526001600160a01b038316906370a08231906108f49030906004016128d2565b60206040518083038186803b15801561090c57600080fd5b505afa158015610920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109449190612843565b905061095a6001600160a01b0383163383612149565b7f74f5dcd55c394cb1c6d3b9da22c2464bcc46c38cc3865bd629ed75823249b40b828260405161098b92919061290a565b60405180910390a15050565b336109a06117d8565b6001600160a01b0316146109c65760405162461bcd60e51b81526004016106d690612992565b60078190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df906020016107f5565b600d546000906001600160a01b03163314610a4a5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd08195b98589b195908139195608a1b60448201526064016106d6565b50630a85bd0160e11b95945050505050565b33610a656117d8565b6001600160a01b031614610a8b5760405162461bcd60e51b81526004016106d690612992565b60035460ff1615610ad45760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016106d6565b6003805460ff19166001179055600d80546001600160a01b038086166001600160a01b031992831617909255600e8054928516929091168217905560078290556040805163313ce56760e01b815290516000929163313ce567916004808301926020929190829003018186803b158015610b4d57600080fd5b505afa158015610b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b85919061285b565b60ff169050601e8110610bd35760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b60448201526064016106d6565b610bde816028612bc7565b610be990600a612b00565b60025550505050565b60026001541415610c155760405162461bcd60e51b81526004016106d6906129fe565b600260015580610c675760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e20300060448201526064016106d6565b601054811115610c895760405162461bcd60e51b81526004016106d6906129c7565b3360009081526015602052604090208054821115610ce95760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f2068696768000000000060448201526064016106d6565b610cf16121a4565b610cf961228c565b805415610dfc5760008160020154600254600f548460000154610d1c9190612ba8565b610d269190612a9d565b610d309190612bc7565b90508015610dfa5780610d416117e7565b1015610d5f5760405162461bcd60e51b81526004016106d690612a35565b8060136000828254610d719190612a85565b9091555050600c5460009061271090610d8a9084612ba8565b610d949190612a9d565b600b54600e54919250610db4916001600160a01b03908116911683612149565b610dd533610dc28385612bc7565b600e546001600160a01b03169190612149565b6040518281523390600080516020612c678339815191529060200160405180910390a2505b505b60008267ffffffffffffffff811115610e2557634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e4e578160200160208202803683370190505b50905060005b83811015610f775760018084018054600092610e6f91612bc7565b81548110610e8d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905083600101805480610ebb57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905580838381518110610ef257634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600d54604051632142170760e11b81526001600160a01b03909116906342842e0e90610f31903090339086906004016128e6565b600060405180830381600087803b158015610f4b57600080fd5b505af1158015610f5f573d6000803e3d6000fd5b50505050508080610f6f90612c0a565b915050610e54565b508154610f85908490612bc7565b808355600254600f549091610f9a9190612ba8565b610fa49190612a9d565b6002830155601154610fb7908490612bc7565b60115560405133907f67e9df8b3c7743c9f1b625ba4f2b4e601206dbd46ed5c33c85a1242e4d23a2d190610fec908490612923565b60405180910390a250506001805550565b336110066117d8565b6001600160a01b03161461102c5760405162461bcd60e51b81526004016106d690612992565b600654431161106f5760405162461bcd60e51b815260206004820152600f60248201526e506f6f6c2069732072756e6e696e6760881b60448201526064016106d6565b806110786117e7565b10156110965760405162461bcd60e51b81526004016106d690612a35565b806110a6576110a36117e7565b90505b600e546110bd906001600160a01b03163383612149565b50565b600260015414156110e35760405162461bcd60e51b81526004016106d6906129fe565b6002600155600554158015906110fa575043600554105b6111465760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e67206861736e277420737461727465642079657400000000000060448201526064016106d6565b60008151116111975760405162461bcd60e51b815260206004820152601d60248201527f6d75737420616464206174206c65617374206f6e6520746f6b656e496400000060448201526064016106d6565b601054815111156111ba5760405162461bcd60e51b81526004016106d6906129c7565b6111c26121a4565b6111ca61228c565b3360009081526015602052604090208054156112c95760008160020154600254600f5484600001546111fc9190612ba8565b6112069190612a9d565b6112109190612bc7565b905080156112c757806112216117e7565b101561123f5760405162461bcd60e51b81526004016106d690612a35565b80601360008282546112519190612a85565b9091555050600c546000906127109061126a9084612ba8565b6112749190612a9d565b600b54600e54919250611294916001600160a01b03908116911683612149565b6112a233610dc28385612bc7565b6040518281523390600080516020612c678339815191529060200160405180910390a2505b505b60005b82518110156113925760008382815181106112f757634e487b7160e01b600052603260045260246000fd5b6020908102919091010151600d54604051632142170760e11b81529192506001600160a01b0316906342842e0e90611337903390309086906004016128e6565b600060405180830381600087803b15801561135157600080fd5b505af1158015611365573d6000803e3d6000fd5b5050505060018381018054918201815560009081526020902001558061138a81612c0a565b9150506112cc565b50815181546113a19190612a85565b808255600254600f5490916113b69190612ba8565b6113c09190612a9d565b600282015581516011546113d49190612a85565b60115560405133907fff409334d2645d660e7cfa41a637aa21f45a79ecb9660a6931aa923bf75577c790611409908590612923565b60405180910390a2505060018055565b336114226117d8565b6001600160a01b0316146114485760405162461bcd60e51b81526004016106d690612992565b6114526000612326565b565b3361145d6117d8565b6001600160a01b0316146114835760405162461bcd60e51b81526004016106d690612992565b600554156114ce5760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b60448201526064016106d6565b6114d9436064612a85565b6005556004546114ec9061191a90612ba8565b6005546114f99190612a85565b600681905560055460088190556040517f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069261153c928252602082015260400190565b60405180910390a1565b3361154f6117d8565b6001600160a01b0316146115755760405162461bcd60e51b81526004016106d690612992565b61157d61228c565b600060135461158a6117e7565b6115949190612a85565b9050601454811115611634576014546115ad9082612bc7565b600e5460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb906115e0903390859060040161290a565b602060405180830381600087803b1580156115fa57600080fd5b505af115801561160e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163291906127cb565b505b4360068190556040519081527ffed9fcb0ca3d1e761a4b929792bb24082fba92dca81252646ad306d306806566906020016107f5565b6009546001600160a01b031633146116c05760405162461bcd60e51b815260206004820152601960248201527839b2ba29b2b93b34b1b2a4b733379d102327a92124a22222a760391b60448201526064016106d6565b6001600160a01b0382166116e65760405162461bcd60e51b81526004016106d690612969565b600980546001600160a01b0319166001600160a01b038416179055600a8190556040517f232f2e6280d2064b1e439bf40ecdada042d84eefbb55039e4c49e8dc4f4c90c99061098b908490849061290a565b336117416117d8565b6001600160a01b0316146117675760405162461bcd60e51b81526004016106d690612992565b6001600160a01b03811661178d5760405162461bcd60e51b81526004016106d690612969565b600b80546001600160a01b0319166001600160a01b0383161790556040517f446e39bcf1b47cfadfaa23442cb4b34682cfe6bd9220da084894e3b1f834e4f3906107f59083906128d2565b6000546001600160a01b031690565b600e546040516370a0823160e01b81526000916001600160a01b0316906370a08231906118189030906004016128d2565b60206040518083038186803b15801561183057600080fd5b505afa158015611844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118689190612843565b905090565b6001600160a01b0381166000908152601560209081526040808320805460019091018054835181860281018601909452808452606094929391928391908301828280156118d957602002820191906000526020600020905b8154815260200190600101908083116118c5575b5050505050905091509150915091565b6002600154141561190c5760405162461bcd60e51b81526004016106d6906129fe565b60026001553360009081526015602052604090206119286121a4565b61193061228c565b805461193c5750611a41565b60008160020154600254600f5484600001546119589190612ba8565b6119629190612a9d565b61196c9190612bc7565b90508015611a00578061197d6117e7565b101561199b5760405162461bcd60e51b81526004016106d690612a35565b80601360008282546119ad9190612a85565b9091555050600c54600090612710906119c69084612ba8565b6119d09190612a9d565b600b54600e549192506119f0916001600160a01b03908116911683612149565b6119fe33610dc28385612bc7565b505b600254600f548354611a129190612ba8565b611a1c9190612a9d565b60028301556040518181523390600080516020612c6783398151915290602001611409565b60018055565b60026001541415611a6a5760405162461bcd60e51b81526004016106d6906129fe565b60026001553360009081526015602052604090208054601054811115611a8f57506010545b60008167ffffffffffffffff811115611ab857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611ae1578160200160208202803683370190505b50905060005b82811015611c0a5760018085018054600092611b0291612bc7565b81548110611b2057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905084600101805480611b4e57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905580838381518110611b8557634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600d54604051632142170760e11b81526001600160a01b03909116906342842e0e90611bc4903090339086906004016128e6565b600060405180830381600087803b158015611bde57600080fd5b505af1158015611bf2573d6000803e3d6000fd5b50505050508080611c0290612c0a565b915050611ae7565b508254611c18908390612bc7565b808455600254600f549091611c2d9190612ba8565b611c379190612a9d565b6002840155601154611c4a908390612bc7565b60115560405133907f1ad6082f7aa3e32095e38fd4c0bf76fa2bb7584e81474cf3519d2dea4081181c90610fec908490612923565b33611c886117d8565b6001600160a01b031614611cae5760405162461bcd60e51b81526004016106d690612992565b6001600160a01b038116611d135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d6565b6110bd81612326565b60008060145490506000601354611d316117e7565b611d3b9190612a85565b905060055460001415611d765761191a600454600754611d5b9190612ba8565b611d659190612ba8565b611d6f9083612a85565b9150611da4565b6000611d86600854600654612376565b905080600754611d969190612ba8565b611da09084612a85565b9250505b818110611db45760009250505090565b611dbe8183612bc7565b9250505090565b6001600160a01b0381166000908152601560205260408120600f5460085443118015611df2575060115415155b8015611e0057506000600854115b15611e51576000611e1360085443612376565b9050600060075482611e259190612ba8565b905060115460025482611e389190612ba8565b611e429190612a9d565b611e4c9084612a85565b925050505b60028083015490548354611e66908490612ba8565b611e709190612a9d565b611e7a9190612bc7565b949350505050565b33611e8b6117d8565b6001600160a01b031614611eb15760405162461bcd60e51b81526004016106d690612992565b600060055411611ef95760405162461bcd60e51b81526020600482015260136024820152721c1bdbdb081a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016106d6565b4360065411611f465760405162461bcd60e51b81526020600482015260196024820152781c1bdbdb081dd85cc8185b1c9958591e48199a5b9a5cda1959603a1b60448201526064016106d6565b60008111611f875760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016106d6565b611f8f61228c565b600e54611fa7906001600160a01b03163330846123b7565b6000601354611fb46117e7565b611fbe9190612a85565b905060145481111561202f57601454611fd79082612bc7565b9050600043600654611fe99190612bc7565b9050611ff58183612a9d565b60078190556040519081527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a1505b5050565b3361203c6117d8565b6001600160a01b0316146120625760405162461bcd60e51b81526004016106d690612992565b601e8110156120a95760405162461bcd60e51b81526020600482015260136024820152721b1bddd95c881b1a5b5a5d081c995858da1959606a1b60448201526064016106d6565b6004819055600554156121195761191a6004546120c69190612ba8565b6005546120d39190612a85565b600681905543106121195760405162461bcd60e51b815260206004820152601060248201526f34b73b30b634b210323ab930ba34b7b760811b60448201526064016106d6565b6040518181527f91abcc2d6823e3a3f11d31b208dd3065d2c6a791f1c7c9fe96a42ce12897eac5906020016107f5565b61219f8363a9059cbb60e01b848460405160240161216892919061290a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526123de565b505050565b600a5434101561220a5760405162461bcd60e51b815260206004820152602b60248201527f73686f756c642070617920736d616c6c2067617320746f20636f6d706f756e6460448201526a081bdc881a185c9d995cdd60aa1b60648201526084016106d6565b600954600a546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015612246573d6000803e3d6000fd5b50600a5434111561145257600a5433906108fc906122649034612bc7565b6040518115909202916000818181858888f193505050501580156110bd573d6000803e3d6000fd5b6008544311158061229d5750600854155b156122a457565b6011546122b15743600855565b60006122bf60085443612376565b90506000600754826122d19190612ba8565b9050601154600254826122e49190612ba8565b6122ee9190612a9d565b600f60008282546122ff9190612a85565b9091555050436008556014805482919060009061231d908490612a85565b90915550505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060065482116123925761238b8383612bc7565b90506123b1565b60065483106123a3575060006123b1565b8260065461238b9190612bc7565b92915050565b6123d8846323b872dd60e01b858585604051602401612168939291906128e6565b50505050565b6000612433826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124b09092919063ffffffff16565b80519091501561219f578080602001905181019061245191906127cb565b61219f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106d6565b60606124bf84846000856124c9565b90505b9392505050565b60608247101561252a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106d6565b843b6125785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106d6565b600080866001600160a01b0316858760405161259491906128b6565b60006040518083038185875af1925050503d80600081146125d1576040519150601f19603f3d011682016040523d82523d6000602084013e6125d6565b606091505b50915091506125e68282866125f1565b979650505050505050565b606083156126005750816124c2565b8251156126105782518084602001fd5b8160405162461bcd60e51b81526004016106d69190612936565b60006020828403121561263b578081fd5b81356124c281612c51565b60008060008060006080868803121561265d578081fd5b853561266881612c51565b9450602086013561267881612c51565b935060408601359250606086013567ffffffffffffffff8082111561269b578283fd5b818801915088601f8301126126ae578283fd5b8135818111156126bc578384fd5b8960208285010111156126cd578384fd5b9699959850939650602001949392505050565b600080604083850312156126f2578182fd5b82356126fd81612c51565b946020939093013593505050565b6000602080838503121561271d578182fd5b823567ffffffffffffffff80821115612734578384fd5b818501915085601f830112612747578384fd5b81358181111561275957612759612c3b565b8060051b604051601f19603f8301168101818110858211171561277e5761277e612c3b565b604052828152858101935084860182860187018a101561279c578788fd5b8795505b838610156127be5780358552600195909501949386019386016127a0565b5098975050505050505050565b6000602082840312156127dc578081fd5b815180151581146124c2578182fd5b6000806000606084860312156127ff578283fd5b833561280a81612c51565b9250602084013561281a81612c51565b929592945050506040919091013590565b60006020828403121561283c578081fd5b5035919050565b600060208284031215612854578081fd5b5051919050565b60006020828403121561286c578081fd5b815160ff811681146124c2578182fd5b6000815180845260208085019450808401835b838110156128ab5781518752958201959082019060010161288f565b509495945050505050565b600082516128c8818460208701612bde565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020815260006124c2602083018461287c565b6020815260008251806020840152612955816040850160208701612bde565b601f01601f19169190910160400192915050565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601c908201527f63616e6e6f7420657863656564206f6e652d74696d65206c696d697400000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601a908201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604082015260600190565b8281526040602082015260006124bf604083018461287c565b60008219821115612a9857612a98612c25565b500190565b600082612ab857634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115612af8578160001904821115612ade57612ade612c25565b80851615612aeb57918102915b93841c9390800290612ac2565b509250929050565b60006124c28383600082612b16575060016123b1565b81612b23575060006123b1565b8160018114612b395760028114612b4357612b5f565b60019150506123b1565b60ff841115612b5457612b54612c25565b50506001821b6123b1565b5060208310610133831016604e8410600b8410161715612b82575081810a6123b1565b612b8c8383612abd565b8060001904821115612ba057612ba0612c25565b029392505050565b6000816000190483118215151615612bc257612bc2612c25565b500290565b600082821015612bd957612bd9612c25565b500390565b60005b83811015612bf9578181015183820152602001612be1565b838111156123d85750506000910152565b6000600019821415612c1e57612c1e612c25565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110bd57600080fdfe47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4a2646970667358221220e0aa4f64cc85ef1deb3eb799e6ce1d51b577def8dc68eb82ec8fb52f29d5be3764736f6c63430008040033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.