More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 25 from a total of 128 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 19838914 | 343 days ago | IN | 0 ETH | 0.00019659 | ||||
Transfer Ownersh... | 19823393 | 345 days ago | IN | 0 ETH | 0.00012916 | ||||
Withdraw | 17134995 | 722 days ago | IN | 0 ETH | 0.00614099 | ||||
Withdraw | 16673042 | 787 days ago | IN | 0 ETH | 0.0041355 | ||||
Withdraw | 16404395 | 825 days ago | IN | 0 ETH | 0.00272457 | ||||
Withdraw | 16379504 | 828 days ago | IN | 0 ETH | 0.00537863 | ||||
Withdraw | 16223169 | 850 days ago | IN | 0 ETH | 0.00231915 | ||||
Withdraw | 16170737 | 857 days ago | IN | 0 ETH | 0.00445225 | ||||
Withdraw | 16120794 | 864 days ago | IN | 0 ETH | 0.00222137 | ||||
Withdraw | 16109465 | 866 days ago | IN | 0 ETH | 0.00217591 | ||||
Withdraw | 16083926 | 870 days ago | IN | 0 ETH | 0.00300255 | ||||
Withdraw | 16073342 | 871 days ago | IN | 0 ETH | 0.00185602 | ||||
Withdraw | 16071090 | 871 days ago | IN | 0 ETH | 0.00211409 | ||||
Withdraw | 16027098 | 878 days ago | IN | 0 ETH | 0.00103203 | ||||
Withdraw | 16027097 | 878 days ago | IN | 0 ETH | 0.00532331 | ||||
Withdraw | 16026965 | 878 days ago | IN | 0 ETH | 0.00314633 | ||||
Withdraw | 16023216 | 878 days ago | IN | 0 ETH | 0.00186928 | ||||
Withdraw | 16022346 | 878 days ago | IN | 0 ETH | 0.0019662 | ||||
Withdraw | 16021743 | 878 days ago | IN | 0 ETH | 0.00226217 | ||||
Withdraw | 16016939 | 879 days ago | IN | 0 ETH | 0.00211379 | ||||
Withdraw | 16012123 | 880 days ago | IN | 0 ETH | 0.00179947 | ||||
Withdraw | 16012118 | 880 days ago | IN | 0 ETH | 0.0026147 | ||||
Withdraw | 16009499 | 880 days ago | IN | 0 ETH | 0.00197323 | ||||
Withdraw | 16007002 | 880 days ago | IN | 0 ETH | 0.00206882 | ||||
Withdraw | 16006878 | 880 days ago | IN | 0 ETH | 0.00201636 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
0x60806040 | 15782626 | 912 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
PoolStakingLock
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "./imports/IBEP20.sol"; import "./imports/SafeBEP20.sol"; contract PoolStakingLock is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IBEP20; // The address of retrostaking factory address public POOL_STAKING_FACTORY; // Whether a limit is set for users bool public hasUserLimit; // Whether a limit is set for Pool bool public hasPoolLimit; // Whether a HarvestLock bool public hasPoolHL; // Whether a WithdrawLock bool public hasPoolWL; // Whether it is initialized bool public isInitialized; // Accrued token per share uint256 public accTokenPerShare; // The block number when mining ends. uint256 public bonusEndBlock; // The block number when mining starts. uint256 public startBlock; // The block number of the last pool update uint256 public lastRewardBlock; // The pool limit (0 if none) uint256 public poolLimitPerUser; // The pool limit global staking (0 if none) uint256 public poolLimitGlobal; // The pool minimum limit for amount deposited uint256 public poolMinDeposit; // Tokens created per block. uint256 public rewardPerBlock; // Total locked up rewards uint256 public totalLockedUpRewards; // The precision factor uint256 public PRECISION_FACTOR; // Keep track of number of tokens staked in case the contract earns reflect fees uint256 public totalStaked = 0; // The reward token IBEP20 public rewardToken; // The staked token IBEP20 public stakedToken; // Info of each user that stakes tokens (stakedToken) mapping(address => UserInfo) public userInfo; struct UserInfo { uint256 amount; // How many staked tokens the user has provided uint256 rewardDebt; // Reward debt uint256 rewardLockedUp; //Reward locked up } event AdminTokenRecovery(address tokenRecovered, uint256 amount); event Deposit(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event NewStartAndEndBlocks(uint256 startBlock, uint256 endBlock); event NewRewardPerBlock(uint256 rewardPerBlock); event NewPoolLimit(uint256 poolLimitPerUser); event RewardsStop(uint256 blockNumber); event Withdraw(address indexed user, uint256 amount); event Harvest(address indexed user, uint256 amount); constructor() { POOL_STAKING_FACTORY = msg.sender; } /* * @notice Initialize the contract * @param _stakedToken: staked token address * @param _rewardToken: reward token address * @param _rewardPerBlock: reward per block (in rewardToken) * @param _startBlock: start block * @param _bonusEndBlock: end block * @param _poolLimitPerUser: pool limit per user in stakedToken (if any, else 0) * @param _poolLimitGlobal: pool limit global in stakedToken (if any, else 0) * @param _poolMinDeposit: pool minimal limit for deposited amount * @param _poolHarvestLock: pool Harvest is locked (if true is enable, else false is disable) * @param _poolWithdrawLock: pool Withdraw is locked (if true is enable, else false is disable) * @param _admin: admin address with ownership */ function initialize( IBEP20 _stakedToken, IBEP20 _rewardToken, uint256 _rewardPerBlock, uint256 _startBlock, uint256 _bonusEndBlock, uint256 _poolLimitPerUser, uint256 _poolLimitGlobal, uint256 _poolMinDeposit, bool _poolHarvestLock, bool _poolWithdrawLock, address _admin ) external { require(!isInitialized, "Already initialized"); require(msg.sender == POOL_STAKING_FACTORY, "Not factory"); // Make this contract initialized isInitialized = true; stakedToken = _stakedToken; rewardToken = _rewardToken; rewardPerBlock = _rewardPerBlock; startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; if (_poolLimitPerUser > 0) { hasUserLimit = true; poolLimitPerUser = _poolLimitPerUser; } if (_poolLimitGlobal > 0) { hasPoolLimit = true; poolLimitGlobal = _poolLimitGlobal; } if (_poolMinDeposit > 0) { poolMinDeposit = _poolMinDeposit; } if (_poolHarvestLock) { hasPoolHL = true; } if (_poolWithdrawLock) { hasPoolWL = true; } uint256 decimalsRewardToken = uint256(rewardToken.decimals()); require(decimalsRewardToken < 30, "Must be inferior to 30"); PRECISION_FACTOR = uint256(10**(uint256(30).sub(decimalsRewardToken))); // Set the lastRewardBlock as the startBlock lastRewardBlock = startBlock; // Transfer ownership to the admin address who becomes owner of the contract transferOwnership(_admin); } /* * @notice Deposit staked tokens and collect reward tokens (if any) * @param _amount: amount to withdraw (in rewardToken) */ function deposit(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; require( _getBlockNumber() < bonusEndBlock, "Cannot deposit after the last reward block" ); uint256 finalDepositAmount = 0; if (hasUserLimit) { require( _amount.add(user.amount) <= poolLimitPerUser, "User amount above limit" ); } if (hasPoolLimit) { require( _amount.add(totalStaked) <= poolLimitGlobal, "Global amount above limit" ); } require( user.amount + _amount >= poolMinDeposit, "Amount under limit" ); _updatePool(); if (user.amount > 0) { payOrLockupPending(user); } if (_amount > 0) { uint256 preStakeBalance = stakedToken.balanceOf(address(this)); stakedToken.safeTransferFrom( address(msg.sender), address(this), _amount ); finalDepositAmount = stakedToken.balanceOf(address(this)).sub( preStakeBalance ); user.amount = user.amount.add(finalDepositAmount); totalStaked = totalStaked.add(finalDepositAmount); } _updateRewardDebt(user); emit Deposit(msg.sender, _amount); } /* * @notice Withdraw staked tokens and collect reward tokens * @param _amount: amount to withdraw (in rewardToken) */ function withdraw(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; bool poolStatusWithdraw = poolWIsLock(); require(user.amount >= _amount, "Amount to withdraw too high"); _updatePool(); // Withdraw pending AUTO payOrLockupPending(user); if (!poolStatusWithdraw) { if (_amount > 0) { stakedToken.safeTransfer(address(msg.sender), _amount); user.amount = user.amount.sub(_amount); totalStaked = totalStaked.sub(_amount); } } else { revert("Pool locked"); } _updateRewardDebt(user); emit Withdraw(msg.sender, _amount); } function harvest() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; _updatePool(); // Withdraw pending AUTO require(payOrLockupPending(user), "Harvests locked"); _updateRewardDebt(user); } /* * @notice Withdraw staked tokens without caring about rewards * @dev Needs to be for emergency. */ function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 amountToTransfer = user.amount; user.amount = 0; user.rewardDebt = 0; if (amountToTransfer > 0) { stakedToken.safeTransfer(address(msg.sender), amountToTransfer); totalStaked = totalStaked.sub(amountToTransfer); } emit EmergencyWithdraw(msg.sender, user.amount); } function rewardBalance() public view returns (uint256) { uint256 balance = rewardToken.balanceOf(address(this)); if (stakedToken == rewardToken) return balance.sub(totalStaked); return balance; } function totalStakeTokenBalance() public view returns (uint256) { if (stakedToken == rewardToken) return totalStaked; return stakedToken.balanceOf(address(this)); } function poolHIsLock() public view returns (bool) { bool statusPool; if (hasPoolHL) { statusPool = bonusEndBlock >= _getBlockNumber(); if (startBlock >= _getBlockNumber()) { statusPool = false; } } return statusPool; } function poolWIsLock() public view returns (bool) { bool statusPool; if (hasPoolWL) { statusPool = bonusEndBlock >= _getBlockNumber(); if (startBlock >= _getBlockNumber()) { statusPool = false; } } return statusPool; } function poolChangeHLock(bool _value) public onlyOwner { hasPoolHL = _value; } function poolChangeWLock(bool _value) public onlyOwner { hasPoolWL = _value; } /* * @notice Stop rewards * @dev Only callable by owner. Needs to be for emergency. */ function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(_amount <= rewardBalance(), "not enough rewards"); rewardToken.safeTransfer(address(msg.sender), _amount); } /** * @notice It allows the admin to recover wrong tokens sent to the contract * @param _tokenAddress: the address of the token to withdraw * @param _tokenAmount: the number of tokens to withdraw * @dev This function is only callable by admin. */ function recoverWrongTokens(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { require( _tokenAddress != address(stakedToken), "Cannot be staked token" ); IBEP20(_tokenAddress).safeTransfer(address(msg.sender), _tokenAmount); emit AdminTokenRecovery(_tokenAddress, _tokenAmount); } /* * @notice Stop rewards * @dev Only callable by owner */ function stopReward() external onlyOwner { bonusEndBlock = _getBlockNumber(); } /* * @notice Update pool limit per user * @dev Only callable by owner. * @param _hasUserLimit: whether the limit remains forced * @param _poolLimitPerUser: new pool limit per user */ function updatePoolLimitPerUser( bool _hasUserLimit, uint256 _poolLimitPerUser ) external onlyOwner { require(hasUserLimit, "Must be set"); if (_hasUserLimit) { require( _poolLimitPerUser > poolLimitPerUser, "New limit must be higher" ); poolLimitPerUser = _poolLimitPerUser; } else { hasUserLimit = _hasUserLimit; poolLimitPerUser = 0; } emit NewPoolLimit(poolLimitPerUser); } /* * @notice Update reward per block * @dev Only callable by owner. * @param _rewardPerBlock: the reward per block */ function updateRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { require(_getBlockNumber() < startBlock, "Pool has started"); rewardPerBlock = _rewardPerBlock; emit NewRewardPerBlock(_rewardPerBlock); } /** * @notice It allows the admin to update start and end blocks * @dev This function is only callable by owner. * @param _startBlock: the new start block * @param _bonusEndBlock: the new end block */ function updateStartAndEndBlocks( uint256 _startBlock, uint256 _bonusEndBlock ) external onlyOwner { require(_getBlockNumber() < startBlock, "Pool has started"); require( _startBlock < _bonusEndBlock, "New startBlock must be lower than new endBlock" ); require( _getBlockNumber() < _startBlock, "New startBlock must be higher than current block" ); startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; // Set the lastRewardBlock as the startBlock lastRewardBlock = startBlock; emit NewStartAndEndBlocks(_startBlock, _bonusEndBlock); } /* * @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 stakedTokenSupply = totalStaked; if (_getBlockNumber() > lastRewardBlock && stakedTokenSupply != 0) { uint256 multiplier = _getMultiplier(lastRewardBlock, _getBlockNumber()); uint256 reward = multiplier.mul(rewardPerBlock); uint256 adjustedTokenPerShare = accTokenPerShare.add( reward.mul(PRECISION_FACTOR).div(stakedTokenSupply) ); uint256 pending = user .amount .mul(adjustedTokenPerShare) .div(PRECISION_FACTOR) .sub(user.rewardDebt); return pending.add(user.rewardLockedUp); } else { uint256 pending = user .amount .mul(accTokenPerShare) .div(PRECISION_FACTOR) .sub(user.rewardDebt); return pending.add(user.rewardLockedUp); } } function payOrLockupPending(UserInfo storage user) internal returns(bool) { bool poolStatusHarvest = poolHIsLock(); uint256 pending = user .amount .mul(accTokenPerShare) .div(PRECISION_FACTOR) .sub(user.rewardDebt); uint256 totalRewards = pending.add(user.rewardLockedUp); if (!poolStatusHarvest) { if (totalRewards > 0) { // reset lockup totalLockedUpRewards = totalLockedUpRewards.sub( user.rewardLockedUp ); user.rewardLockedUp = 0; // send rewards uint256 currentRewardBalance = rewardBalance(); if (currentRewardBalance > 0) { if (totalRewards > currentRewardBalance) { rewardToken.safeTransfer( address(msg.sender), currentRewardBalance ); emit Harvest(msg.sender, currentRewardBalance); } else { rewardToken.safeTransfer( address(msg.sender), totalRewards ); emit Harvest(msg.sender, totalRewards); } } } } else if (pending > 0) { user.rewardLockedUp = user.rewardLockedUp.add(pending); totalLockedUpRewards = totalLockedUpRewards.add(pending); } return !poolStatusHarvest; } function _updateRewardDebt(UserInfo storage user) internal { user.rewardDebt = user.amount.mul(accTokenPerShare).div( PRECISION_FACTOR ); } /* * @notice Update reward variables of the given pool to be up-to-date. */ function _updatePool() internal { if (_getBlockNumber() <= lastRewardBlock) { return; } uint256 stakedTokenSupply = totalStaked; if (stakedTokenSupply == 0) { lastRewardBlock = _getBlockNumber(); return; } uint256 multiplier = _getMultiplier(lastRewardBlock, _getBlockNumber()); uint256 reward = multiplier.mul(rewardPerBlock); accTokenPerShare = accTokenPerShare.add( reward.mul(PRECISION_FACTOR).div(stakedTokenSupply) ); lastRewardBlock = _getBlockNumber(); } /* * @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.sub(_from); } else if (_from >= bonusEndBlock) { return 0; } else { return bonusEndBlock.sub(_from); } } function _getBlockNumber() internal view virtual returns(uint256) { return block.number; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// 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 (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @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 ); }
pragma solidity >=0.8.0; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "./IBEP20.sol"; /** * @title SafeBEP20 * @dev Wrappers around BEP20 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 SafeBEP20 for IBEP20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { using SafeMath for uint256; using Address for address; function safeTransfer( IBEP20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IBEP20 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 * {IBEP20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IBEP20 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' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeBEP20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeBEP20: decreased allowance below zero" ); _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(IBEP20 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, "SafeBEP20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeBEP20: BEP20 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; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"AdminTokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolLimitPerUser","type":"uint256"}],"name":"NewPoolLimit","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"POOL_STAKING_FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","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":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasPoolHL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPoolLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPoolWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasUserLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBEP20","name":"_stakedToken","type":"address"},{"internalType":"contract IBEP20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"},{"internalType":"uint256","name":"_poolLimitGlobal","type":"uint256"},{"internalType":"uint256","name":"_poolMinDeposit","type":"uint256"},{"internalType":"bool","name":"_poolHarvestLock","type":"bool"},{"internalType":"bool","name":"_poolWithdrawLock","type":"bool"},{"internalType":"address","name":"_admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":[],"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":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"poolChangeHLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"poolChangeWLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"poolHIsLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLimitGlobal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolMinDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolWIsLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverWrongTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakeTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"bool","name":"_hasUserLimit","type":"bool"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"}],"name":"updatePoolLimitPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"name":"updateStartAndEndBlocks","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"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600d5534801561001557600080fd5b5061001f3361003a565b60018055600280546001600160a01b0319163317905561008a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611f69806100996000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c8063817b1cd211610146578063a9f8d181116100c3578063ccd34cd511610087578063ccd34cd5146104c1578063db2e21bc146104ca578063eae1f71c146104d2578063f2fde38b146104db578063f40f0f52146104ee578063f7c618c11461050157600080fd5b8063a9f8d18114610481578063aa5c3ab41461048a578063b6b55f2514610492578063bb703122146104a5578063cc7a262e146104ae57600080fd5b806392e8990e1161010a57806392e8990e1461042b5780639513997f1461043f578063a0b4090514610452578063a48264ff14610465578063a49ceb191461047957600080fd5b8063817b1cd2146103d4578063878403f9146103dd5780638ae39cac146104085780638da5cb5b146104115780638f6629151461042257600080fd5b80633d22e2a7116101d457806348cd4cb11161019857806348cd4cb11461039e57806351f57423146103a757806366fe9f8a146103bb578063715018a6146103c457806380dc0672146103cc57600080fd5b80633d22e2a7146103535780633f138d4b1461036757806345aa45261461037a5780634641257d1461038d578063474fa6301461039557600080fd5b80631aed65531161021b5780631aed6553146102fa5780632e1a7d4d146103115780633279beab146103245780633582e2fa14610337578063392e53cd1461033f57600080fd5b806301f8a976146102585780630d17d2a91461026d5780630d23549a1461028057806312353fb6146102935780631959a002146102b0575b600080fd5b61026b610266366004611b22565b610514565b005b61026b61027b366004611b49565b6105a0565b61026b61028e366004611b49565b6105c6565b61029b6105ec565b60405190151581526020015b60405180910390f35b6102df6102be366004611b7b565b60106020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102a7565b61030360045481565b6040519081526020016102a7565b61026b61031f366004611b22565b61061e565b61026b610332366004611b22565b61078a565b61029b6107f8565b60025461029b90600160c01b900460ff1681565b60025461029b90600160b81b900460ff1681565b61026b610375366004611b98565b610815565b61026b610388366004611bc4565b6108cf565b61026b610b29565b610303600b5481565b61030360055481565b60025461029b90600160b01b900460ff1681565b61030360075481565b61026b610bbf565b61026b610bd3565b610303600d5481565b6002546103f0906001600160a01b031681565b6040516001600160a01b0390911681526020016102a7565b610303600a5481565b6000546001600160a01b03166103f0565b61030360035481565b60025461029b90600160a01b900460ff1681565b61026b61044d366004611c72565b610be1565b61026b610460366004611c94565b610d40565b60025461029b90600160a81b900460ff1681565b610303610e40565b61030360065481565b610303610ed4565b61026b6104a0366004611b22565b610f75565b61030360095481565b600f546103f0906001600160a01b031681565b610303600c5481565b61026b6112c5565b61030360085481565b61026b6104e9366004611b7b565b611378565b6103036104fc366004611b7b565b6113ee565b600e546103f0906001600160a01b031681565b61051c611513565b60055443106105655760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b60448201526064015b60405180910390fd5b600a8190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a150565b6105a8611513565b60028054911515600160b01b0260ff60b01b19909216919091179055565b6105ce611513565b60028054911515600160b81b0260ff60b81b19909216919091179055565b6002546000908190600160b81b900460ff161561061957435b600454101590504360055410610619575060005b919050565b600260015414156106415760405162461bcd60e51b815260040161055c90611cb2565b60026001553360009081526010602052604081209061065e6105ec565b905082826000015410156106b45760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f20686967680000000000604482015260640161055c565b6106bc61156d565b6106c5826115d9565b508061070c57821561070757600f546106e8906001600160a01b03163385611745565b81546106f490846117ad565b8255600d5461070390846117ad565b600d555b610742565b60405162461bcd60e51b815260206004820152600b60248201526a141bdbdb081b1bd8dad95960aa1b604482015260640161055c565b61074b826117c2565b60405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a250506001805550565b610792611513565b61079a610ed4565b8111156107de5760405162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f756768207265776172647360701b604482015260640161055c565b600e546107f5906001600160a01b03163383611745565b50565b6002546000908190600160b01b900460ff16156106195743610605565b61081d611513565b600f546001600160a01b03838116911614156108745760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba1031329039ba30b5b2b2103a37b5b2b760511b604482015260640161055c565b6108886001600160a01b0383163383611745565b604080516001600160a01b0384168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b600254600160c01b900460ff161561091f5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161055c565b6002546001600160a01b031633146109675760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b604482015260640161055c565b6002805460ff60c01b1916600160c01b179055600f80546001600160a01b03808e166001600160a01b031992831617909255600e8054928d1692909116919091179055600a8990556005889055600487905585156109d8576002805460ff60a01b1916600160a01b17905560078690555b84156109f7576002805460ff60a81b1916600160a81b17905560088590555b8315610a035760098490555b8215610a1d576002805460ff60b01b1916600160b01b1790555b8115610a37576002805460ff60b81b1916600160b81b1790555b600e546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610a81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa59190611ce9565b60ff169050601e8110610af35760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b604482015260640161055c565b610afe601e826117ad565b610b0990600a611e06565b600c55600554600655610b1b82611378565b505050505050505050505050565b60026001541415610b4c5760405162461bcd60e51b815260040161055c90611cb2565b6002600155336000908152601060205260409020610b6861156d565b610b71816115d9565b610baf5760405162461bcd60e51b815260206004820152600f60248201526e12185c9d995cdd1cc81b1bd8dad959608a1b604482015260640161055c565b610bb8816117c2565b5060018055565b610bc7611513565b610bd160006117e1565b565b610bdb611513565b43600455565b610be9611513565b6005544310610c2d5760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b604482015260640161055c565b808210610c935760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201526d6e206e657720656e64426c6f636b60901b606482015260840161055c565b814310610cfb5760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201526f616e2063757272656e7420626c6f636b60801b606482015260840161055c565b60058290556004819055600682905560408051838152602081018390527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce0691016108c3565b610d48611513565b600254600160a01b900460ff16610d8f5760405162461bcd60e51b815260206004820152600b60248201526a135d5cdd081899481cd95d60aa1b604482015260640161055c565b8115610df0576007548111610de65760405162461bcd60e51b815260206004820152601860248201527f4e6577206c696d6974206d757374206265206869676865720000000000000000604482015260640161055c565b6007819055610e0d565b6002805460ff60a01b1916600160a01b8415150217905560006007555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c6007546040516108c391815260200190565b600e54600f546000916001600160a01b0391821691161415610e635750600d5490565b600f546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecf9190611e12565b905090565b600e546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f459190611e12565b600e54600f549192506001600160a01b039182169116141561061957600d54610f6f9082906117ad565b91505090565b60026001541415610f985760405162461bcd60e51b815260040161055c90611cb2565b600260015533600090815260106020526040902060045443106110105760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f74206465706f73697420616674657220746865206c6173742072656044820152697761726420626c6f636b60b01b606482015260840161055c565b600254600090600160a01b900460ff1615611083576007548254611035908590611831565b11156110835760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d6974000000000000000000604482015260640161055c565b600254600160a81b900460ff16156110f457600854600d546110a6908590611831565b11156110f45760405162461bcd60e51b815260206004820152601960248201527f476c6f62616c20616d6f756e742061626f7665206c696d697400000000000000604482015260640161055c565b6009548254611104908590611e2b565b10156111475760405162461bcd60e51b8152602060048201526012602482015271105b5bdd5b9d081d5b99195c881b1a5b5a5d60721b604482015260640161055c565b61114f61156d565b8154156111615761115f826115d9565b505b821561128a57600f546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d49190611e12565b600f549091506111ef906001600160a01b031633308761183d565b600f546040516370a0823160e01b81523060048201526112679183916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561123d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112619190611e12565b906117ad565b83549092506112769083611831565b8355600d546112859083611831565b600d55505b611293826117c2565b60405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610779565b600260015414156112e85760405162461bcd60e51b815260040161055c90611cb2565b6002600190815533600090815260106020526040812080548282559281019190915590801561133957600f54611328906001600160a01b03163383611745565b600d5461133590826117ad565b600d555b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2505060018055565b611380611513565b6001600160a01b0381166113e55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161055c565b6107f5816117e1565b6001600160a01b0381166000908152601060205260408120600d546006544311801561141957508015155b156114c857600061143260065461142d4390565b61187b565b9050600061144b600a54836118b590919063ffffffff16565b9050600061147a6114718561146b600c54866118b590919063ffffffff16565b906118c1565b60035490611831565b905060006114a38660010154611261600c5461146b868b600001546118b590919063ffffffff16565b90506114bc86600201548261183190919063ffffffff16565b98975050505050505050565b60006114f18360010154611261600c5461146b60035488600001546118b590919063ffffffff16565b905061150a83600201548261183190919063ffffffff16565b95945050505050565b6000546001600160a01b03163314610bd15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161055c565b600654431161157857565b600d5480611587574360065550565b600061159660065461142d4390565b905060006115af600a54836118b590919063ffffffff16565b90506115cd6114718461146b600c54856118b590919063ffffffff16565b60035543600655505050565b6000806115e46107f8565b9050600061160f8460010154611261600c5461146b60035489600001546118b590919063ffffffff16565b9050600061162a85600201548361183190919063ffffffff16565b90508261171157801561170c576002850154600b54611648916117ad565b600b5560006002860181905561165c610ed4565b9050801561170a57808211156116bd57600e54611683906001600160a01b03163383611745565b60405181815233907fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba9060200160405180910390a261170a565b600e546116d4906001600160a01b03163384611745565b60405182815233907fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba9060200160405180910390a25b505b61173c565b811561173c5760028501546117269083611831565b6002860155600b546117389083611831565b600b555b50501592915050565b6040516001600160a01b0383166024820152604481018290526117a890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118cd565b505050565b60006117b98284611e43565b90505b92915050565b600c5460035482546117d9929161146b91906118b5565b600190910155565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006117b98284611e2b565b6040516001600160a01b03808516602483015283166044820152606481018290526118759085906323b872dd60e01b90608401611771565b50505050565b600060045482116118975761189082846117ad565b90506117bc565b60045483106118a8575060006117bc565b60045461189090846117ad565b60006117b98284611e5a565b60006117b98284611e79565b6000611922826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661199f9092919063ffffffff16565b8051909150156117a857808060200190518101906119409190611e9b565b6117a85760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161055c565b60606119ae84846000856119b8565b90505b9392505050565b606082471015611a195760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161055c565b6001600160a01b0385163b611a705760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161055c565b600080866001600160a01b03168587604051611a8c9190611ee4565b60006040518083038185875af1925050503d8060008114611ac9576040519150601f19603f3d011682016040523d82523d6000602084013e611ace565b606091505b5091509150611ade828286611ae9565b979650505050505050565b60608315611af85750816119b1565b825115611b085782518084602001fd5b8160405162461bcd60e51b815260040161055c9190611f00565b600060208284031215611b3457600080fd5b5035919050565b80151581146107f557600080fd5b600060208284031215611b5b57600080fd5b81356119b181611b3b565b6001600160a01b03811681146107f557600080fd5b600060208284031215611b8d57600080fd5b81356119b181611b66565b60008060408385031215611bab57600080fd5b8235611bb681611b66565b946020939093013593505050565b60008060008060008060008060008060006101608c8e031215611be657600080fd5b8b35611bf181611b66565b9a5060208c0135611c0181611b66565b995060408c0135985060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c013593506101008c0135611c3c81611b3b565b92506101208c0135611c4d81611b3b565b91506101408c0135611c5e81611b66565b809150509295989b509295989b9093969950565b60008060408385031215611c8557600080fd5b50508035926020909101359150565b60008060408385031215611ca757600080fd5b8235611bb681611b3b565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600060208284031215611cfb57600080fd5b815160ff811681146119b157600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b80851115611d5d578160001904821115611d4357611d43611d0c565b80851615611d5057918102915b93841c9390800290611d27565b509250929050565b600082611d74575060016117bc565b81611d81575060006117bc565b8160018114611d975760028114611da157611dbd565b60019150506117bc565b60ff841115611db257611db2611d0c565b50506001821b6117bc565b5060208310610133831016604e8410600b8410161715611de0575081810a6117bc565b611dea8383611d22565b8060001904821115611dfe57611dfe611d0c565b029392505050565b60006117b98383611d65565b600060208284031215611e2457600080fd5b5051919050565b60008219821115611e3e57611e3e611d0c565b500190565b600082821015611e5557611e55611d0c565b500390565b6000816000190483118215151615611e7457611e74611d0c565b500290565b600082611e9657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611ead57600080fd5b81516119b181611b3b565b60005b83811015611ed3578181015183820152602001611ebb565b838111156118755750506000910152565b60008251611ef6818460208701611eb8565b9190910192915050565b6020815260008251806020840152611f1f816040850160208701611eb8565b601f01601f1916919091016040019291505056fea26469706673582212207b197668e428b0dc59d56c9289af1845eed4e6cb56c01c9f3c4b1229d2daafe864736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c8063817b1cd211610146578063a9f8d181116100c3578063ccd34cd511610087578063ccd34cd5146104c1578063db2e21bc146104ca578063eae1f71c146104d2578063f2fde38b146104db578063f40f0f52146104ee578063f7c618c11461050157600080fd5b8063a9f8d18114610481578063aa5c3ab41461048a578063b6b55f2514610492578063bb703122146104a5578063cc7a262e146104ae57600080fd5b806392e8990e1161010a57806392e8990e1461042b5780639513997f1461043f578063a0b4090514610452578063a48264ff14610465578063a49ceb191461047957600080fd5b8063817b1cd2146103d4578063878403f9146103dd5780638ae39cac146104085780638da5cb5b146104115780638f6629151461042257600080fd5b80633d22e2a7116101d457806348cd4cb11161019857806348cd4cb11461039e57806351f57423146103a757806366fe9f8a146103bb578063715018a6146103c457806380dc0672146103cc57600080fd5b80633d22e2a7146103535780633f138d4b1461036757806345aa45261461037a5780634641257d1461038d578063474fa6301461039557600080fd5b80631aed65531161021b5780631aed6553146102fa5780632e1a7d4d146103115780633279beab146103245780633582e2fa14610337578063392e53cd1461033f57600080fd5b806301f8a976146102585780630d17d2a91461026d5780630d23549a1461028057806312353fb6146102935780631959a002146102b0575b600080fd5b61026b610266366004611b22565b610514565b005b61026b61027b366004611b49565b6105a0565b61026b61028e366004611b49565b6105c6565b61029b6105ec565b60405190151581526020015b60405180910390f35b6102df6102be366004611b7b565b60106020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102a7565b61030360045481565b6040519081526020016102a7565b61026b61031f366004611b22565b61061e565b61026b610332366004611b22565b61078a565b61029b6107f8565b60025461029b90600160c01b900460ff1681565b60025461029b90600160b81b900460ff1681565b61026b610375366004611b98565b610815565b61026b610388366004611bc4565b6108cf565b61026b610b29565b610303600b5481565b61030360055481565b60025461029b90600160b01b900460ff1681565b61030360075481565b61026b610bbf565b61026b610bd3565b610303600d5481565b6002546103f0906001600160a01b031681565b6040516001600160a01b0390911681526020016102a7565b610303600a5481565b6000546001600160a01b03166103f0565b61030360035481565b60025461029b90600160a01b900460ff1681565b61026b61044d366004611c72565b610be1565b61026b610460366004611c94565b610d40565b60025461029b90600160a81b900460ff1681565b610303610e40565b61030360065481565b610303610ed4565b61026b6104a0366004611b22565b610f75565b61030360095481565b600f546103f0906001600160a01b031681565b610303600c5481565b61026b6112c5565b61030360085481565b61026b6104e9366004611b7b565b611378565b6103036104fc366004611b7b565b6113ee565b600e546103f0906001600160a01b031681565b61051c611513565b60055443106105655760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b60448201526064015b60405180910390fd5b600a8190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a150565b6105a8611513565b60028054911515600160b01b0260ff60b01b19909216919091179055565b6105ce611513565b60028054911515600160b81b0260ff60b81b19909216919091179055565b6002546000908190600160b81b900460ff161561061957435b600454101590504360055410610619575060005b919050565b600260015414156106415760405162461bcd60e51b815260040161055c90611cb2565b60026001553360009081526010602052604081209061065e6105ec565b905082826000015410156106b45760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f20686967680000000000604482015260640161055c565b6106bc61156d565b6106c5826115d9565b508061070c57821561070757600f546106e8906001600160a01b03163385611745565b81546106f490846117ad565b8255600d5461070390846117ad565b600d555b610742565b60405162461bcd60e51b815260206004820152600b60248201526a141bdbdb081b1bd8dad95960aa1b604482015260640161055c565b61074b826117c2565b60405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a250506001805550565b610792611513565b61079a610ed4565b8111156107de5760405162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f756768207265776172647360701b604482015260640161055c565b600e546107f5906001600160a01b03163383611745565b50565b6002546000908190600160b01b900460ff16156106195743610605565b61081d611513565b600f546001600160a01b03838116911614156108745760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba1031329039ba30b5b2b2103a37b5b2b760511b604482015260640161055c565b6108886001600160a01b0383163383611745565b604080516001600160a01b0384168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b600254600160c01b900460ff161561091f5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161055c565b6002546001600160a01b031633146109675760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b604482015260640161055c565b6002805460ff60c01b1916600160c01b179055600f80546001600160a01b03808e166001600160a01b031992831617909255600e8054928d1692909116919091179055600a8990556005889055600487905585156109d8576002805460ff60a01b1916600160a01b17905560078690555b84156109f7576002805460ff60a81b1916600160a81b17905560088590555b8315610a035760098490555b8215610a1d576002805460ff60b01b1916600160b01b1790555b8115610a37576002805460ff60b81b1916600160b81b1790555b600e546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610a81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa59190611ce9565b60ff169050601e8110610af35760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b604482015260640161055c565b610afe601e826117ad565b610b0990600a611e06565b600c55600554600655610b1b82611378565b505050505050505050505050565b60026001541415610b4c5760405162461bcd60e51b815260040161055c90611cb2565b6002600155336000908152601060205260409020610b6861156d565b610b71816115d9565b610baf5760405162461bcd60e51b815260206004820152600f60248201526e12185c9d995cdd1cc81b1bd8dad959608a1b604482015260640161055c565b610bb8816117c2565b5060018055565b610bc7611513565b610bd160006117e1565b565b610bdb611513565b43600455565b610be9611513565b6005544310610c2d5760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b604482015260640161055c565b808210610c935760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201526d6e206e657720656e64426c6f636b60901b606482015260840161055c565b814310610cfb5760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201526f616e2063757272656e7420626c6f636b60801b606482015260840161055c565b60058290556004819055600682905560408051838152602081018390527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce0691016108c3565b610d48611513565b600254600160a01b900460ff16610d8f5760405162461bcd60e51b815260206004820152600b60248201526a135d5cdd081899481cd95d60aa1b604482015260640161055c565b8115610df0576007548111610de65760405162461bcd60e51b815260206004820152601860248201527f4e6577206c696d6974206d757374206265206869676865720000000000000000604482015260640161055c565b6007819055610e0d565b6002805460ff60a01b1916600160a01b8415150217905560006007555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c6007546040516108c391815260200190565b600e54600f546000916001600160a01b0391821691161415610e635750600d5490565b600f546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecf9190611e12565b905090565b600e546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f459190611e12565b600e54600f549192506001600160a01b039182169116141561061957600d54610f6f9082906117ad565b91505090565b60026001541415610f985760405162461bcd60e51b815260040161055c90611cb2565b600260015533600090815260106020526040902060045443106110105760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f74206465706f73697420616674657220746865206c6173742072656044820152697761726420626c6f636b60b01b606482015260840161055c565b600254600090600160a01b900460ff1615611083576007548254611035908590611831565b11156110835760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d6974000000000000000000604482015260640161055c565b600254600160a81b900460ff16156110f457600854600d546110a6908590611831565b11156110f45760405162461bcd60e51b815260206004820152601960248201527f476c6f62616c20616d6f756e742061626f7665206c696d697400000000000000604482015260640161055c565b6009548254611104908590611e2b565b10156111475760405162461bcd60e51b8152602060048201526012602482015271105b5bdd5b9d081d5b99195c881b1a5b5a5d60721b604482015260640161055c565b61114f61156d565b8154156111615761115f826115d9565b505b821561128a57600f546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d49190611e12565b600f549091506111ef906001600160a01b031633308761183d565b600f546040516370a0823160e01b81523060048201526112679183916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561123d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112619190611e12565b906117ad565b83549092506112769083611831565b8355600d546112859083611831565b600d55505b611293826117c2565b60405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610779565b600260015414156112e85760405162461bcd60e51b815260040161055c90611cb2565b6002600190815533600090815260106020526040812080548282559281019190915590801561133957600f54611328906001600160a01b03163383611745565b600d5461133590826117ad565b600d555b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2505060018055565b611380611513565b6001600160a01b0381166113e55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161055c565b6107f5816117e1565b6001600160a01b0381166000908152601060205260408120600d546006544311801561141957508015155b156114c857600061143260065461142d4390565b61187b565b9050600061144b600a54836118b590919063ffffffff16565b9050600061147a6114718561146b600c54866118b590919063ffffffff16565b906118c1565b60035490611831565b905060006114a38660010154611261600c5461146b868b600001546118b590919063ffffffff16565b90506114bc86600201548261183190919063ffffffff16565b98975050505050505050565b60006114f18360010154611261600c5461146b60035488600001546118b590919063ffffffff16565b905061150a83600201548261183190919063ffffffff16565b95945050505050565b6000546001600160a01b03163314610bd15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161055c565b600654431161157857565b600d5480611587574360065550565b600061159660065461142d4390565b905060006115af600a54836118b590919063ffffffff16565b90506115cd6114718461146b600c54856118b590919063ffffffff16565b60035543600655505050565b6000806115e46107f8565b9050600061160f8460010154611261600c5461146b60035489600001546118b590919063ffffffff16565b9050600061162a85600201548361183190919063ffffffff16565b90508261171157801561170c576002850154600b54611648916117ad565b600b5560006002860181905561165c610ed4565b9050801561170a57808211156116bd57600e54611683906001600160a01b03163383611745565b60405181815233907fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba9060200160405180910390a261170a565b600e546116d4906001600160a01b03163384611745565b60405182815233907fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba9060200160405180910390a25b505b61173c565b811561173c5760028501546117269083611831565b6002860155600b546117389083611831565b600b555b50501592915050565b6040516001600160a01b0383166024820152604481018290526117a890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118cd565b505050565b60006117b98284611e43565b90505b92915050565b600c5460035482546117d9929161146b91906118b5565b600190910155565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006117b98284611e2b565b6040516001600160a01b03808516602483015283166044820152606481018290526118759085906323b872dd60e01b90608401611771565b50505050565b600060045482116118975761189082846117ad565b90506117bc565b60045483106118a8575060006117bc565b60045461189090846117ad565b60006117b98284611e5a565b60006117b98284611e79565b6000611922826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661199f9092919063ffffffff16565b8051909150156117a857808060200190518101906119409190611e9b565b6117a85760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161055c565b60606119ae84846000856119b8565b90505b9392505050565b606082471015611a195760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161055c565b6001600160a01b0385163b611a705760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161055c565b600080866001600160a01b03168587604051611a8c9190611ee4565b60006040518083038185875af1925050503d8060008114611ac9576040519150601f19603f3d011682016040523d82523d6000602084013e611ace565b606091505b5091509150611ade828286611ae9565b979650505050505050565b60608315611af85750816119b1565b825115611b085782518084602001fd5b8160405162461bcd60e51b815260040161055c9190611f00565b600060208284031215611b3457600080fd5b5035919050565b80151581146107f557600080fd5b600060208284031215611b5b57600080fd5b81356119b181611b3b565b6001600160a01b03811681146107f557600080fd5b600060208284031215611b8d57600080fd5b81356119b181611b66565b60008060408385031215611bab57600080fd5b8235611bb681611b66565b946020939093013593505050565b60008060008060008060008060008060006101608c8e031215611be657600080fd5b8b35611bf181611b66565b9a5060208c0135611c0181611b66565b995060408c0135985060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c013593506101008c0135611c3c81611b3b565b92506101208c0135611c4d81611b3b565b91506101408c0135611c5e81611b66565b809150509295989b509295989b9093969950565b60008060408385031215611c8557600080fd5b50508035926020909101359150565b60008060408385031215611ca757600080fd5b8235611bb681611b3b565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600060208284031215611cfb57600080fd5b815160ff811681146119b157600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b80851115611d5d578160001904821115611d4357611d43611d0c565b80851615611d5057918102915b93841c9390800290611d27565b509250929050565b600082611d74575060016117bc565b81611d81575060006117bc565b8160018114611d975760028114611da157611dbd565b60019150506117bc565b60ff841115611db257611db2611d0c565b50506001821b6117bc565b5060208310610133831016604e8410600b8410161715611de0575081810a6117bc565b611dea8383611d22565b8060001904821115611dfe57611dfe611d0c565b029392505050565b60006117b98383611d65565b600060208284031215611e2457600080fd5b5051919050565b60008219821115611e3e57611e3e611d0c565b500190565b600082821015611e5557611e55611d0c565b500390565b6000816000190483118215151615611e7457611e74611d0c565b500290565b600082611e9657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611ead57600080fd5b81516119b181611b3b565b60005b83811015611ed3578181015183820152602001611ebb565b838111156118755750506000910152565b60008251611ef6818460208701611eb8565b9190910192915050565b6020815260008251806020840152611f1f816040850160208701611eb8565b601f01601f1916919091016040019291505056fea26469706673582212207b197668e428b0dc59d56c9289af1845eed4e6cb56c01c9f3c4b1229d2daafe864736f6c634300080c0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.